一尘不染

@Autowired注释应该在哪里-属性或方法上?

spring-mvc

哪个更正确?

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


阅读 769

收藏
2020-06-01

共1个答案

一尘不染

根据用于自动装配的Javadoc,可以在“构造函数,字段,setter方法或config方法”上使用注释。有关更多详细信息,请参见完整的文档

我个人更喜欢您的第一选择(构造函数注入),因为该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;
    }

您不必选择一个或另一个。您可以对某些对象使用字段注入,而对于同一对象,可以对其他对象使用构造函数注入。

2020-06-01