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
浙公网安备 33010602011771号