AdvisorAdapterRegistrationManager是BeanPostProcessor的一个实现类,其主要的作用为容器中管理的Bean注册一个面向切面编程的通知适配器,以便在Spring容器为所管理的Bean进行面向切面编程时提供方便,其源码如下:
[java]- //为容器中管理的Bean注册一个面向切面编程的通知适配器 public class AdvisorAdapterRegistrationManager implements BeanPostProcessor {
- //容器中负责管理切面通知适配器注册的对象 private AdvisorAdapterRegistry advisorAdapterRegistry = GlobalAdvisorAdapterRegistry.getInstance();
- public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry) { this.advisorAdapterRegistry = advisorAdapterRegistry;
- } //BeanPostProcessor在Bean对象初始化前的操作
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { //没有做任何操作,直接返回容器创建的Bean对象
- return bean; }
- //BeanPostProcessor在Bean对象初始化后的操作 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof AdvisorAdapter){ //如果容器创建的Bean实例对象是一个切面通知适配器,则向容器的注册this.advisorAdapterRegistry.registerAdvisorAdapter((AdvisorAdapter) bean);
- } return bean;
- } }
其他的BeanPostProcessor接口实现类的也类似,都是对Bean对象使用到的一些特性进行处理,或者向IoC容器中注册,为创建的Bean实例对象做一些自定义的功能增加,这些操作是容器初始化Bean时自动触发的,不需要认为的干预。
5.Spring IoC容器autowiring实现原理:
Spring IoC容器提供了两种管理Bean依赖关系的方式:
a. 显式管理:通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理。
b. autowiring:Spring IoC容器的依赖自动装配功能,不需要对Bean属性的依赖关系做显式的声明,只需要在配置好autowiring属性,IoC容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的Bean,从而自动地完成依赖注入。
通过对autowiring自动装配特性的理解,我们知道容器对Bean的自动装配发生在容器对Bean依赖注入的过程中。在前面对Spring IoC容器的依赖注入过程源码分析中,我们已经知道了容器对Bean实例对象的属性注入的处理发生在AbstractAutoWireCapableBeanFactory类中的populateBean方法中,我们通过程序流程分析autowiring的实现原理:
(1). AbstractAutoWireCapableBeanFactory对Bean实例进行属性依赖注入:
应用第一次通过getBean方法(配置了lazy-init预实例化属性的除外)向IoC容器索取Bean时,容器创建Bean实例对象,并且对Bean实例对象进行属性依赖注入,AbstractAutoWireCapableBeanFactory的populateBean方法就是实现Bean属性依赖注入的功能,其主要源码如下:
[java] view plaincopy- protected void populateBean(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw) { //获取Bean定义的属性值,并对属性值进行处理
- PropertyValues pvs = mbd.getPropertyValues(); ……
- //对依赖注入处理,首先处理autowiring自动装配的依赖注入 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
- mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
- //根据Bean名称进行autowiring自动装配处理 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
- autowireByName(beanName, mbd, bw, newPvs); }
- //根据Bean类型进行autowiring自动装配处理 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
- autowireByType(beanName, mbd, bw, newPvs); }
- } //对非autowiring的属性进行依赖注入处理
- …… }
(2).Spring IoC容器根据Bean名称或者类型进行autowiring自动依赖注入:
[java] view plaincopy- //根据名称对属性进行自动依赖注入 protected void autowireByName(
- String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { //对Bean对象中非简单属性(不是简单继承的对象,如8中原始类型,字符串,URL等//都是简单属性)进行处理
- String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) {
- //如果Spring IoC容器中包含指定名称的Bean if (containsBean(propertyName)) {
- //调用getBean方法向IoC容器索取指定名称的Bean实例,迭代触发属性的//初始化和依赖注入 Object bean = getBean(propertyName);
- //为指定名称的属性赋予属性值 pvs.add(propertyName, bean);
- //指定名称属性注册依赖