@Autowired写在成员变量上和set方法上的区别

小编 1021

@Autowired写在成员变量上和set方法上的区别是:1.实现方式不同;2.出现的问题不同;3.注入方式不同。实现方式不同是指,写在成员变量上,通过反射注入;写在set方法上,通过set方法注入,是用在成员变量的Setter函数上。

1.实现方式不同

当@Autowired注解放在成员变量上时,不需要写成员变量的getter、setter方法,Spring会通过Java的“反射机制”来实现属性的依赖注入。而@Autowired写在set方法上,是用在成员变量的Setter函数上。

2.出现的问题不同

当将@Autowired注解直接写在成员变量上时,即使设定该成员变量的访问权限为private,那么也会自动将其改变成public;而将@Autowired注解写在成员变量的setter方法上则不会出现此问题。所以不建议使用前者。

3.注入方式不同

@Autowired写在变量上的注入要等到类完全加载完,才会将相应的bean注入。@Autowired写在set方法上,在spring会根据方法的参数类型从ioc容器中找到该类型的bean对象注入到方法的行参中,并且自动反射调用该方法(被@Autowired修饰的方法一定会执行)。

延伸阅读

@Autowired和@Resource的区别

@AutoWired是spring的注解,可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。Autowired只根据type进行注入,不会去匹配name。

@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分别是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。默认按name进行注入。

总结,@Autowired和@Resource的区别在于:

1.注入方式的区别:@Autowired默认按照byType 注入,也提供byName;@Resource默认按byName自动注入,也提供按照byType注入。

2.基因上的区别:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部