java - 实现新接口(interface)时出现 NoSuchBeanDefinitionException

标签 java spring

我进行了以下设置,效果非常好:

@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/

相关文章:

spring - 获得 Spring 认证有多大用处

java - 没有 Hibernate session 绑定(bind)到带有 generic-hibernate-dao 库的线程

java - 获取 javax.naming.NameNotFoundException : While starting tomcat

java - 从数组中提取信息

java - 如何在 spring webservice 上下文中返回网页?

java - 小部件不会更新/重画

java - 在 Java 中的 JSON 对象中使用 JSON 数组

java - 从 Autowiring bean 获取数据源时出现空指针异常

java - 字符串值未显示在 output.setText 中

java - Java中的优先级队列