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公开的方法(也不应该),所以我需要为现有方法创建另一个新接口。