gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:58:39 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com