2010-09-19 312 views
28

哪一个更正确?@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注释应该去哪里?

回答

47

根据the Javadoc for Autowired,可以在“构造函数,字段,设置方法或配置方法”上使用注释。有关更多详细信息,请参见the full documentation

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

@Controller 
public class MyControllear { 
    private final MyDao myDao; 

    @Autowired 
    public MyController(MyDao myDao) { 
     this.myDao = myDao; 
    } 

构造函数注入,您还可以测试在单元测试的类,而不依赖于代码弹簧。

,第二种选择将更好的写法如下:

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

    MyController() { 
    } 

随着场注入,Spring将创建对象,然后更新标记为注射剂领域。你没有提到

一种选择是在setter方法把@Autowired(setter注入):

@Controller 
public class MyControllear { 
    private MyDao myDao; 

    MyController() { 
    } 

    @Autowired 
    public void setMyDao(MyDao myDao) { 
     this.myDao = myDao; 
    } 

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

+2

根据我刚刚做的一个实验(使用Spring 3.0),该字段在第二个选项中也可以标记为“final”,即它似乎可以很好地将@Autowired放在最终字段上,并且布线实际上可以工作在运行时!我猜想它是有效的,因为当它通过反射设置字段时,Spring绕过了“最终”修饰符。任何人都可以确认/发现更多的光线? – 2013-02-22 14:55:19

+0

@Mikko我很惊讶的作品。 “最终”修饰符为并发提供了一些保证。如果Spring在施工后正在修改最终场地,那么您正在失去其中的一些好处。 – NamshubWriter 2013-02-26 16:59:22

0

该注释与属性一起使用,因为这是自动装配的;该属性被自动设置。 This tutorial有个很好的例子。 This more advanced example显示如何使用限定符来消除布线歧义。