我进行了以下设置,效果非常好:
@Service
public class MyService {
}
public class Test {
@Autowired
MyService service;
}
我更改了 MyService 以实现一个新接口(interface),如下所示
@Service
public class MyService implements NewInterface {
}
这个接口(interface)没有什么特别的,它只是一个普通的 Java 接口(interface),没有任何注释和 2 个非常简单的方法。
现在,Spring 无法再 Autowiring 这个 bean,它给出了 NoSuchBeanDefinitionException
。我还尝试在 XML 中显式定义它,但它给出了相同的异常。
如果相关的话,我使用 Spring 2.5 并使用 Maven 构建,类 Test 是一个单元测试类。当我尝试运行真实的应用程序时,它使用 applicationContext.getBean()
获得此服务,它给出以下异常:java.lang.ClassCastException: $Proxy81 cannot be cast to MyService
.
我缺少什么以及我应该做什么?
最佳答案
当您看到名称类似于 $Proxy81
的类时,它告诉您 Spring 已为您的一个 bean 自动生成了一个代理对象,在本例中是 MyService
的代理对象。 bean 。这使用java.lang.reflect.Proxy
生成代理对象。该代理对象将实现与被代理的类相同的接口(interface),但它与目标类本身不兼容。
现在,如果目标类没有实现任何接口(interface),那么 Spring 将使用 CGLIB 来生成代理。该代理将是目标类的子类,因此代理对象可以安全地转换为目标对象的原始类型。
现在,当在 Spring 中使用较低级别的代理生成内容时,您通常可以覆盖此行为,并告诉它始终使用 CGLIB 代理,但我假设您正在使用 @Service
,那么您还使用 <context:component-scan>
,在这种情况下,我认为您必须坚持默认行为。
不过,这并不是坏事。这鼓励您不要将类耦合在一起,而是对接口(interface)进行编程。与 MyService
的任何互动应该可以通过接口(interface)来表达,尽管在谈论单元测试时这个概念可能会有点模糊。
关于java - 实现新接口(interface)时出现 NoSuchBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111919/