Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现新接口时无UCHBeandefinitionException_Java_Spring - Fatal编程技术网

Java 实现新接口时无UCHBeandefinitionException

Java 实现新接口时无UCHBeandefinitionException,java,spring,Java,Spring,我采用了以下设置,效果非常好: @Service public class MyService { } public class Test { @Autowired MyService service; } 我改变了MyService以实现一个新的接口,如下所示 @Service public class MyService implements NewInterface { } 这个接口没有什么特别之处,它只是一个普通的Java接口,没有任何注释和2个非常简单的方法 现在,S

我采用了以下设置,效果非常好:

@Service
public class MyService {
}

public class Test {
   @Autowired
   MyService service;
}
我改变了MyService以实现一个新的接口,如下所示

@Service
public class MyService implements NewInterface {
}
这个接口没有什么特别之处,它只是一个普通的Java接口,没有任何注释和2个非常简单的方法

现在,Spring不能再自动连接这个bean了,它给出了一个
NoSuchBeanDefinitionException
。我还试图在XML中显式地定义它,但它给出了相同的异常

如果相关的话,我将使用Spring2.5和Maven构建,类测试是一个单元测试类。当我尝试运行真正的应用程序时,它使用
applicationContext.getBean()
来获取此服务,并给出以下异常:
java.lang.ClassCastException:$Proxy81无法强制转换到MyService


我遗漏了什么,应该怎么做?

看起来您是在按接口自动连接,而不是按类名自动连接

我只需针对接口编写测试代码:

public class Test {
   @Autowired
   NewInterface service;
}

另外,请检查,它可能与您相关,因为它看起来像是您的类正在被代理。

当您看到一个名为
$Proxy81
的类时,它告诉您Spring已经为您的一个bean自动生成了一个代理对象,在本例中是
MyService
bean的代理对象。这将使用
java.lang.reflect.Proxy
生成代理对象。此代理对象将实现与被代理的类相同的接口,但它与目标类本身的类型不兼容

现在,如果目标类没有实现任何接口,那么Spring将使用CGLIB生成代理。此代理将是目标类的子类,因此可以将代理对象安全地强制转换为目标对象的原始类型

现在,在Spring中使用较低级别的代理生成工具时,您通常可以覆盖此行为,并告诉它始终使用CGLIB代理,但我假设,既然您使用的是
@Service
,那么您也使用的是
,在这种情况下,我认为您必须坚持默认行为


不过这不是坏事。这鼓励您不要将类耦合在一起,而是编程到接口。与
MyService
的任何交互都应该可以通过接口来表达,尽管在谈到单元测试时,这个概念可能会有点模糊

谢谢,我接受了斯卡夫曼更详细的回答,但基本上你也是对的。不过,您的代码片段并不好,因为这个现有测试类正在调用未通过NewInterface公开的方法(也不应该),所以我需要为现有方法创建另一个新接口。