@Autowired注释应该放在哪里 - 关于属性还是方法?

时间:2010-09-19 16:49:50

标签: spring dependency-injection spring-mvc annotations autowired

哪个更正确?

这个(方法上有@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注释应该去哪里?

2 个答案:

答案 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显示了如何使用限定符来消除布线歧义。