【问题标题】:Spring does class have to be component to AutoWire a property in it?Spring 类必须是 AutoWire 属性的组件吗?
【发布时间】:2016-03-31 18:14:44
【问题描述】:

在 Spring 3.X 中,是否必须将类注释为组件才能将字段自动装配到其中?

假设我有:

@Service("myBean")
public class Mybean {

}

public class Target {
    @Autowired
    @Qualifier("myBean")
    private MyBean;
}

然后在我的 beans.xml 中

<context:component-scan base-package="com.package.beans" />

其中MyBean.javacom.package.beans.MyBean package 内。

Target 是否必须注释为@Component 或其他一些spring 注释才能自动装配其中一个字段?

【问题讨论】:

    标签: java spring dependency-injection autowired spring-bean


    【解决方案1】:

    不,它不必被注释,但它必须是一个 Spring bean。您可以通过使用诸如@Component 之类的构造型注解来做到这一点,但您也可以通过在 XML 中声明 &lt;bean&gt; 元素或从 @Bean 配置方法返回它来创建 Spring bean。

    请注意,在任何情况下都最好使用构造函数注入,因为它对自动装配没有影响,但会使测试更容易,并使某些错误更加困难。

    【讨论】:

    • 即使在使用 Component("target") 注释 "Target" 之后,它仍然自动装配为 null,并且我已经在该类所在的包上设置了组件扫描。事实上,其他类在已经很好地自动装配的同一个包也用 Component 进行了注释,但在 Component("target") 注释之后仍然没有使用 "Target" 运气。知道可能出了什么问题吗?
    • 你几乎肯定会打电话给new Target()。这就是我提到的“某些错误”。
    • 对我已加载到 Eclipse 中的每个项目进行搜索,都没有显示一次出现的“new Target()”。这不是问题。
    • 无论如何切换到构造函数注入并重试。 Spring 不会 "autowire null";它会引发异常。
    • Autowire 为什么不好?在这种情况下,让这个类有一个构造函数获取我试图自动装配的字段是没有意义的。而且我认为这不正确,我在很多情况下列出了一个自动装配字段,只是将其视为空,并意识到我需要添加组件扫描。但在这种情况下,有一个组件扫描,它仍然为空。
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2011-06-29
    • 2020-07-23
    相关资源
    最近更新 更多