*@Autowired注入成员变量,利用field反射注入,要等类加载完了才注入bean;@Autowired注入构造方法中,利用构造器注入,有先后依赖关系;setter属性注入,setter代码冗长,不能将属性设置为final。
private A a;
@Autowired
public c(A a) {
this.a= a;
}
和
@Autowired
private A a;
1、@autowired写在变量上的注入要等到类完全加载完,才会将相应的bean注入。
写在方法上是为了在构造方法中使用到该变量。写到构造方法中,也就是有了先后的注入依赖关系。
2、第一个是通过构造器注入, 第二个是通过field反射注入
弊端
如果你使用的是构造器注入
恭喜你,当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数可能会长到无法想像。
如果你使用的是field反射注入
如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean规范。
还有,当你不是用过Spring创建的对象时,还可能引起NullPointerException。
并且,你不能用final修饰这个属性。
如果你使用的是setter方法注入
那么你将不能将属性设置为final。
两者取其轻
Spring3.0官方文档建议使用setter注入覆盖构造器注入。
Spring4.0官方文档建议使用构造器注入。
结论
如果注入的属性是必选的属性,则通过构造器注入。
如果注入的属性是可选的属性,则通过setter方法注入。
至于field注入,不建议使用。
3、一般用的是模型驱动,当模型不够时,用属性驱动,属性驱动也就是这个setter注入,一般还是用
@Autowired
private A abc;
public setAbc(A a) {
this.a= a;
}
结合模型驱动用。
记住八字真言:“模型不够,属性来凑”。