Spring三种注解方式的区别:@AutoWired、@Resource、@Inject
1、
@AutoWired是Spring自带的方式
@Resource是JSR-250标准,JDK6以上自带,Spring版本要求2.5以上
@Inject是JSR-303标准,Spring版本3以上。需要导入外部依赖。
2、
@AutoWired可以用在构造器、方法、属性、参数、注解上面.
@Resource可以用在方法、属性、类上。
@Inject可以用在方法、属性、构造器上。
ps:当用在属性上面注入时,无须为该属性添加setter方法。
3、
@AutoWired注入可以根据名字/类型,可以设置required属性为false指定找不到相应bean时不抛异常
@Resource注入与@AutoWired一致。但可以指定name属性来指定beanName,但如果name对应的bean不存在,则会抛出异常,且没有required属性
1、
@AutoWired是Spring自带的方式
@Resource是JSR-250标准,JDK6以上自带,Spring版本要求2.5以上
@Inject是JSR-303标准,Spring版本3以上。需要导入外部依赖。
2、
@AutoWired可以用在构造器、方法、属性、参数、注解上面.
@Resource可以用在方法、属性、类上。
@Inject可以用在方法、属性、构造器上。
ps:当用在属性上面注入时,无须为该属性添加setter方法。
3、
@AutoWired注入可以根据名字/类型,可以设置required属性为false指定找不到相应bean时不抛异常
@Resource注入与@AutoWired一致。但可以指定name属性来指定beanName,但如果name对应的bean不存在,则会抛出异常,且没有required属性
@Inject与@AutoWired一致,区别在于@Inject没有required属性
4、
@Inject:通过AutowiredAnnotationBeanPostProcessor类实现依赖注入
@Autowired:通过AutowireAnnotationBeanPostProcessor类实现依赖注入
@Resource:通过CommonAnnotationBeanPostProcessor类实现依赖注入。
5、Spring的IOC注入过程
在Spring所管理的类里面,在要注入的对象属性或者setter方法加上上面三个任意一个注解或者在xml文件中配置<property>属性,Spring会自动找寻相应的bean然后将bean对象注入到当前对象中去。
上述步骤可以分解为以下几个步骤,如图所示:
每次调用getBean时并不总是会调用doCreateBean方法,如果要获取的对象是singleton的,会先从工厂里面获取,否则会走这个流程。但无论是singleton还是prototype还是scope为其他类型,都会走一遍这个流程。
具体来看populateBean()方法:
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
PropertyValues pvs = mbd.getPropertyValues(); //当前bean要注入的属性