Spring框架学习[IoC容器高级特性](七)

2014-11-24 03:11:10 · 作者: · 浏览: 4
Manager在Bean对象初始化后注册通知适配器:

AdvisorAdapterRegistrationManager是BeanPostProcessor的一个实现类,其主要的作用为容器中管理的Bean注册一个面向切面编程的通知适配器,以便在Spring容器为所管理的Bean进行面向切面编程时提供方便,其源码如下:

[java]
  1. //为容器中管理的Bean注册一个面向切面编程的通知适配器 public class AdvisorAdapterRegistrationManager implements BeanPostProcessor {
  2. //容器中负责管理切面通知适配器注册的对象 private AdvisorAdapterRegistry advisorAdapterRegistry = GlobalAdvisorAdapterRegistry.getInstance();
  3. public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry) { this.advisorAdapterRegistry = advisorAdapterRegistry;
  4. } //BeanPostProcessor在Bean对象初始化前的操作
  5. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { //没有做任何操作,直接返回容器创建的Bean对象
  6. return bean; }
  7. //BeanPostProcessor在Bean对象初始化后的操作 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  8. if (bean instanceof AdvisorAdapter){ //如果容器创建的Bean实例对象是一个切面通知适配器,则向容器的注册this.advisorAdapterRegistry.registerAdvisorAdapter((AdvisorAdapter) bean);
  9. } return bean;
  10. } }

    其他的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
    1. protected void populateBean(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw) { //获取Bean定义的属性值,并对属性值进行处理
    2. PropertyValues pvs = mbd.getPropertyValues(); ……
    3. //对依赖注入处理,首先处理autowiring自动装配的依赖注入 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
    4. mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    5. //根据Bean名称进行autowiring自动装配处理 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
    6. autowireByName(beanName, mbd, bw, newPvs); }
    7. //根据Bean类型进行autowiring自动装配处理 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    8. autowireByType(beanName, mbd, bw, newPvs); }
    9. } //对非autowiring的属性进行依赖注入处理
    10. …… }

      (2).Spring IoC容器根据Bean名称或者类型进行autowiring自动依赖注入:

      [java] view plaincopy
      1. //根据名称对属性进行自动依赖注入 protected void autowireByName(
      2. String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { //对Bean对象中非简单属性(不是简单继承的对象,如8中原始类型,字符串,URL等//都是简单属性)进行处理
      3. String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); for (String propertyName : propertyNames) {
      4. //如果Spring IoC容器中包含指定名称的Bean if (containsBean(propertyName)) {
      5. //调用getBean方法向IoC容器索取指定名称的Bean实例,迭代触发属性的//初始化和依赖注入 Object bean = getBean(propertyName);
      6. //为指定名称的属性赋予属性值 pvs.add(propertyName, bean);
      7. //指定名称属性注册依赖