spring

1.obtainFreshBeanFactory

refreshBeanFactory:会去创建beanfactory,调用createBeanFactory.然后loadbeandefinitons去解析bean.

2.invokeBeanFactoryPostProcessors 回去beandefinitionreg查找BeanFactoryPostProcessors,然后执行

 

实例化bean的过程:调用getbean,会先查找它的依赖,先实例化依赖,然后根据实例化策略去实例化bean,用beanwrapper类

去包装还未初始化属性的object,根据byname/bytype去初始化属性

 

doGetBean:

1.transformedBeanName 取得真正的beanname,比如在xml配置的时候,可以用@beanname,取出factory.

2.调用getSingleton(beanName)返回null

3.如果当前factory没有beanname的定义,且父工厂不为空,调用父工厂的getbean,否则进入4

4.标记markBeanAsCreated,说明至少被dogetbean调用一次。

5.getMergedLocalBeanDefinition,整合一下bd为mbd.

6.检查bean的dependon,这个在xml配置depend-on,若有,则需要先实例化depend-on的bean,回去注册bean的depend关系,双向map.

7.再次调用getSingleton(beanname, factory)去创建实例,会调用factory的createBean

。(这里以单例为例子)

 

    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
     //第一次回返回null Object singletonObject
= this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) {
          //第一次返回Null singletonObject
= this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) {
            //第一次返回null ObjectFactory singletonFactory
= this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }

 

doCreateBean,这个第一次的doCreateBean参数不同

1.调用createBeanInstance去实例化bean,这里不会设置参数,根据策略调用construct,可以自定义的construct.

2.addSingletonFactory(beanName, factory)

3.调用populateBean设置属性,然后调用initializeBean去调用initmethod等后继方法。

 在populatebean中,会调用识别resource等注解的处理类,他们回去处理注解。

http://www.iflym.com/index.php/code/201208280001.html

http://www.iflym.com/index.php/code/201211070001.html

posted on 2015-11-27 13:24  jsy306  阅读(264)  评论(0)    收藏  举报

导航