您的位置:首页 > 编程语言 > Java开发

spring

2015-11-27 13:24 603 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: