spring IoC容器构造bean过程简单分析

Spring构造bean和管理初始化生命周期的工作在AbstractAutowireCapableBeanFactory中处理,分为构造bean和后续管理bean初始化生命周期。

1.  构造bean

1.1方法调用图

构造bean的入口就是beanFactory的getBean()方法,实际调用defaultBeanFactory的getBean()方法。经过层层调用,直到AabstractAutowireCapableBeanFactory中。调用方法图如下:


3-6均在AbstractAutowireCapableBeanFactory完成。

1.2设计到的类图

涉及的类图继承关系如下:

在doCreateBean()中,createBeanInstance返回的是一个BeanWrapper

扫描二维码关注公众号,回复: 4976707 查看本文章

BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能,用getWrappedInstance()方法就可以得到这个封装的bean的实例。BeanWrapperImpl里面的Object就是BeanWrapper“包裹”的bean,通过getWrappedInstance()方法对外提供。

1.3方法分析

主要分析AbstractAutowireCapableBeanFactory中的方法,其它类中的方法都是对这里方法的封装。

A,BeanWrapper的获取

BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能,用getWrappedInstance()方法就可以得到这个封装的bean的实例。BeanWrapperImpl里面的Object就是BeanWrapper“包裹”的bean,通过getWrappedInstance()方法对外提供。

/**
      * Return the bean instance wrapped by this object, if any.
      * @return the bean instance, or <code>null</code> if none set
      */
      Object getWrappedInstance();

BeanWrapper的获取由createBeanInstance()得到。在doCreateBean()中调用createBeanInstance(),返回BeanWrapper。

if (instanceWrapper == null) {
                 instanceWrapper = createBeanInstance(beanName, mbd, args);
           }

B. createBeanInstance()实现分析

createBeanInstance()中得到了BeanWrapper,该方法调用instantiateBean()。instantiateBean()方法申明如下:

protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) ;

createBeanInstance()中得到BeanWrapper的代码如下:

beanInstance =   getInstantiationStrategy().instantiate(mbd, beanName, parent);  //      这里构造出需要的bean
BeanWrapper bw = new BeanWrapperImpl(beanInstance);   //将这个bean放入对应的beanWrapper

getInstantiationStrategy()返回CglibSubclassingInstantiationStrategy,因为在AbstractAutowireCapableBeanFactory初始化的时候,就做了

private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

故Spring构造bean对象默认使用cglib库,而不是使用jdk中的反射。

C. instantiate()实现

CglibSubclassingInstantiationStrategy中实现instantiate()方法,如下:

public Object instantiate(Constructor ctor, Object[] args) {
                 Enhancer enhancer = new Enhancer();
      enhancer.setSuperclass(this.beanDefinition.getBeanClass());
                 enhancer.setCallbackFilter(new CallbackFilterImpl());
                 enhancer.setCallbacks(new Callback[] {
                            NoOp.INSTANCE,
                            new LookupOverrideMethodInterceptor(),
                            new ReplaceOverrideMethodInterceptor()
                 });
                 return (ctor == null) ? 
                            enhancer.create() : 
                            enhancer.create(ctor.getParameterTypes(), args);
           }

这里是调用cglib库,来构造对象,也是很标准的使用cglib库构造对象的调用。

2. 后续工作

后续工作主要完成bean生命周期相关的管理。


Spring生命周期概述1

1)设置属性值;

2)调用Bean中的BeanNameAware.setBeanName()方法,如果该Bean实现了BeanNameAware接口;

3)调用Bean中的BeanFactoryAware.setBeanFactory()方法,如果该Bean实现了BeanFactoryAware接口;

4)调用BeanPostProcessors.postProcessBeforeInitialization()方法;

5)调用Bean中的afterPropertiesSet方法,如果该Bean实现了InitializingBean接口;

6)调用Bean中的init-method,通常是在配置bean的时候指定了init-method,例如:<beanclass="beanClass"init-method="init"></bean>

7)调用BeanPostProcessors.postProcessAfterInitialization()方法;

8)如果该Bean是单例的,则当容器销毁并且该Bean实现了DisposableBean接口的时候,调用destory方法;如果该Bean是prototype,则将准备好的Bean提交给调用者,后续不再管理该Bean的生命周期。

 initializeBean()方法在AbstractAutowireCapableBeanFactory中,对应Bean生命周期的2-7。initializeBean()在doCreateBean()中调用createBeanInstance()之后。调用了4个方法:

invokeAwareMethods(对应生命周期2、3)

applyBeanPostProcessorsBeforeInitialization(对应生命周期4)

invokeInitMethods(对应生命周期5,6)

applyBeanPostProcessorsAfterInitialization(对应生命周期7)

2.1 invokeAwareMethods

invokeAwareMethods调用bean自省的三个方法(如果该bean实现BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口)

private void invokeAwareMethods(final String beanName, final Object bean) {
           if (bean instanceof Aware) {
                 if (bean instanceof BeanNameAware) {
                      ((BeanNameAware) bean).setBeanName(beanName);
                 }
                 if (bean instanceof BeanClassLoaderAware) {
                      ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
                 }
                 if (bean instanceof BeanFactoryAware) {
                      ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
                 }
           }
      }

2.2applyBeanPostProcessorsBeforeInitialization

完成前置处理,即调用postProcessBeforeInitialization()方法,在Bean初始化动作之前完成特定的需求。

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
                 throws BeansException {
           Object result = existingBean;
           for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
                 result = beanProcessor.postProcessBeforeInitialization(result, beanName);
                 if (result == null) {
                      return result;
                 }
           }
           return result;
      }

2.3 invokeInitMethods

调用afterPropertiesSet()方法;如果配置bean的时候指定了init-method,那么调用invokeCustomInitMethod

boolean isInitializingBean = (bean instanceof InitializingBean);
……
((InitializingBean) bean).afterPropertiesSet(); 
 //调用afterPropertiesSet()方法
invokeCustomInitMethod();           //调用指定的init-method

2.4 applyBeanPostProcessorsAfterInitialization

实现和postProcessBeforeInitialization类似,完成bean初始化后的后置处理。只是在postProcessBeforeInitialization()的for循环中改为:

result =beanProcessor.postProcessAfterInitialization(result, beanName);

3.其它

     感觉spring构造bean的和管理bean对象生命周期的实现,比之前spring IoC容器的初始化的过程要简单,也好理解。

4. 参考资料

1.   http://sexycoding.iteye.com/blog/1046775:也谈Spring Bean的生命周期

2.  参考书籍《Spring 技术内幕—深入解析Spring架构与设计原理》第二章





猜你喜欢

转载自blog.csdn.net/randyjiawenjie/article/details/8546561