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

Tho*_*kie 31 spring annotations dependency-injection spring-mvc autowired

哪个更正确?

这个(方法上有@Autowired注释)?

@Controller
public class MyController
{
    private MyDao myDao;

    @Autowired
    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }
Run Code Online (Sandbox Code Playgroud)

这个(在属性上有@Autowired注释)?

@Controller
public class MyController
{
    @Autowired
    private MyDao myDao;

    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }
Run Code Online (Sandbox Code Playgroud)

@Autowired注释应该去哪里?

Nam*_*ter 52

根据Javadoc for Autowired,注释可用于"构造函数,字段,setter方法或配置方法".有关详细信息,请参阅完整文档.

我个人更喜欢你的第一个选项(构造函数注入),因为该myDao字段可以标记为final:

@Controller
public class MyControllear {
    private final MyDao myDao;

    @Autowired
    public MyController(MyDao myDao) {
      this.myDao = myDao;
    }
Run Code Online (Sandbox Code Playgroud)

构造函数注入还允许您在单元测试中测试类,而不需要依赖于Spring的代码.

第二种选择更好地写为:

@Controller
public class MyControllear {
    @Autowired
    private MyDao myDao;

    MyController() {
    }
Run Code Online (Sandbox Code Playgroud)

通过字段注入,Spring将创建对象,然后更新标记为注入的字段.

你没有提到的一个选择是@Autowired使用setter方法(setter注入):

@Controller
public class MyControllear {
    private MyDao myDao;

    MyController() {
    }

    @Autowired
    public void setMyDao(MyDao myDao) {
      this.myDao = myDao;
    }
Run Code Online (Sandbox Code Playgroud)

您不必选择其中一个.您可以对某些依赖项使用字段注入,为同一对象使用其他构造函数注入.

  • 根据我刚刚做的一个实验(使用Spring 3.0),在第二个选项中也可以将字段标记为"final",即将@Autowired放在最终字段上似乎工作正常,并且接线实际上将在运行时工作!我认为它有效,因为Spring在通过反射设置场时绕过了"最终"修改器.任何人都可以确认/发光一些吗? (2认同)