Spring IOC注入源码分析

@Autowired、@Resourcexml配置

 

在创建类的实例对象后调用AbstractAutowireCapableBeanFactory的populateBean()方法进行属性注入

byName或者byType中需要注意的是:spring的代码实现都是根据实例对象的Introspector内省beaninfo来获取注入属性的(即自动装配的属性必须有set方法),否则获取不到注入方法。

所以Autowired注解在没有配置set方法的时候在下图步骤1中是没有进行注入

将在步骤2中通过AutowiredAnnotationBeanPostProcessor按照类型进行自动装配,调用value = beanFactory.resolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter);来解析依赖属性对象,并获取注入对象。

在DefaultListableBeanFactory的doResolveDependency方法中代码:Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);查找自动装配。

(即使1中已经注入类,步骤2中还是会继续执行)

注意:@Autowired注解的属性必须使用接口定义,因为在查找自动装配时按照class类型匹配(isAssignableFrom方法),而spring中类的加载是通过代理创建的,(代理中指定的是实现类的接口)。所以如果定义属性时使用的是实现类,那么在进行class类型匹配时将找不到对象

 



 

 

@Qualifier联合使用,上面步骤执行之后才来根据指定的name进行匹配注入对象是否正确(即先byType查找到所有对应类型的bean,然后再根据name来匹配当前指定的注入bean对象)也是在findAutowireCandidates方法中执行查找



 

 

上面都只是PropertyValues获取该实例对象的属性名和属性对应的注入对象,

最终调用applyPropertyValues对象属性进行正式的注入

猜你喜欢

转载自longe-d.iteye.com/blog/2313993