我找到了一些答案:https://stackoverflow.com/a/21218921/2754014关于依赖注入。没有任何注释,例如@Autowired
,@Inject
或@Resource
。让我们假设这个示例TwoInjectionStyles
bean没有任何XML配置(简单<context:component-scan base-package="com.example" />
除外。)
在没有指定注释的情况下注入是否正确?
答案 0 :(得分:9)
从Spring 4.3开始,构造函数注入不需要注释。
public class MovieRecommender {
private CustomerPreferenceDao customerPreferenceDao;
private MovieCatalog movieCatalog;
//@Autowired - no longer necessary
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
@Autowired
public setMovieCatalog(MovieCatalog movieCatalog) {
this.movieCatalog = movieCatalog;
}
}
但是你仍需要@Autowired
进行二传手注射。我刚才用Spring Boot 1.5.7
(使用Spring 4.3.11
)检查过,当我删除@Autowired
时,没有注入bean。
答案 1 :(得分:7)
是的,示例是正确的(从Spring 4.3发布开始)。根据文档(例如this),如果bean具有单个构造函数,则可以省略@Autowired
注释。
但有几个细微差别:
1。当存在单个构造函数且setter标记为@Autowired
注释时,构造函数和&amp;二传手注射将一个接一个地进行:
@Component
public class TwoInjectionStyles {
private Foo foo;
public TwoInjectionStyles(Foo f) {
this.foo = f; //Called firstly
}
@Autowired
public void setFoo(Foo f) {
this.foo = f; //Called secondly
}
}
2。另一方面,如果根本没有@Autowire
(如example中所述),则f
对象将被注入一次通过构造函数,setter可以以常用方式使用而无需任何注入。