【问题标题】:Injecting a bean with @Autowired that implements ApplicationListener does not work?用@Autowired 注入实现ApplicationListener 的bean 不起作用?
【发布时间】:2011-10-02 20:16:59
【问题描述】:

我有一个服务 bean(用 @Service 注释),它为扩展 ApplicationEvent 抽象类的 T 类型事件对象实现 ApplicationListener 接口。在 Spring docs here 中有一个非常简单明了的例子

但是,当我尝试使用 @Autowired 将此 bean 注入其他 bean 时,我得到的是:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为依赖找到了类型为 [...] 的匹配 bean:预计至少为 1 有资格作为此依赖项的自动装配候选者的 bean。 依赖注解 {@org.springframework.beans.factory.annotation.Autowired(required=true)}

如果我尝试使用 @Resource 之类的东西,那么我会得到一个类转换异常(尝试注入一种类型的资源但得到一个代理)。

【问题讨论】:

    标签: spring autowired inject


    【解决方案1】:

    如果我尝试使用 @Resource 之类的东西,那么我会得到一个班级演员表 异常(试图注入一种类型的资源,但得到一个 代理)。

    这听起来像是您试图按类引用它,而它是作为基于接口的 JDK 代理连接的。

    如果你有这个课程:

    @Service
    public class FooServiceImpl implements FooService{}
    

    将其连接为:

    @Autowired
    private FooService fooService;
    

    不是:

    @Autowired
    private FooServiceImpl fooService;
    

    参考:

    【讨论】:

    • 是的,这有效(不久前在 Spring 论坛上得到了相同的答案)。我应该打开类代理吗?
    • @nvrs 我发现使用接口更可取(请阅读 Joshua Bloch 的 Effective Java 了解原因)。一方面,为单元测试模拟服务更容易。
    • 这很公平。在这个服务首先是一个实现的上下文中,我仍然可以看到在这个特定场合(当然还有 JDK 代理的东西)对接口进行编程的唯一其他原因。
    • @nvrs 我知道,当您每个接口只有一个实现类时,您开始想知道为什么首先应该使用接口。我明白这一点,但我仍然更喜欢使用接口 :-)
    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2019-08-11
    • 2018-10-04
    • 1970-01-01
    • 2014-11-19
    • 2012-08-13
    相关资源
    最近更新 更多