哪个更正确?
这个(方法上有@Autowired注释)?
@Controller
public class MyController
{
private MyDao myDao;
@Autowired
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
这个(在属性上使用@Autowired注释)?
@Controller
public class MyController
{
@Autowired
private MyDao myDao;
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
@Autowired注释应该去哪里?
答案 0 :(得分:51)
根据the Javadoc for Autowired,注释可用于“构造函数,字段,setter方法或配置方法”。有关详细信息,请参阅the full documentation。
我个人更喜欢你的第一个选项(构造函数注入),因为myDao
字段可以标记为final:
@Controller
public class MyControllear {
private final MyDao myDao;
@Autowired
public MyController(MyDao myDao) {
this.myDao = myDao;
}
构造函数注入还允许您在单元测试中测试类,而不需要依赖于Spring的代码。
第二种选择最好写成:
@Controller
public class MyControllear {
@Autowired
private MyDao myDao;
MyController() {
}
使用字段注入,Spring将创建对象,然后更新标记为注入的字段。
您没有提及的一个选项是将@Autowired
置于setter方法(setter注入):
@Controller
public class MyControllear {
private MyDao myDao;
MyController() {
}
@Autowired
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
您不必选择其中一个。您可以对某些依赖项使用字段注入,为同一对象使用构造函数注入。
答案 1 :(得分:0)
注释与属性有关,因为这是自动装配的内容;要自动设置的属性。 This tutorial有一个很好的例子。 This more advanced example显示了如何使用限定符来消除布线歧义。