31

哪个更正确?

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

4

2 回答 2

56

根据Autowired 的 Javadoc,注释可用于“构造函数、字段、设置方法或配置方法”。有关更多详细信息,请参阅完整文档

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

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

于 2010-09-19T17:02:06.057 回答
0

注释与属性一起使用,因为这是自动装配的;要自动设置的属性。 本教程有一个很好的例子。 这个更高级的示例展示了如何使用限定符来消除连线的歧义。

于 2010-09-19T17:01:31.623 回答