1:在当前得beanFactory和他得继承关系上得所有Factory寻找该Bean得实例。
2:如果没有找到任何给定名称的bean instance,则需要根据需要创建一个。
创建一个Bean得过程是大致如下:
1:Singleton的创建(见DefaultSingletonBeanRegistry),通过一个getSingleton()方法,该方法需要传入一个ObjectFactory的参数并利用传入的ObjectFactory创建bean instance,创建的过程中会调用SingletonBeanRegistry的beforeSingletonCreation()并在创建之后调用afterSingletonCreation()方法。。在AbstractBeanFactory部分调用了getSingleton()方法并直接使用AbstractBeanFactory.createBean()作为ObjectFactory的bean创建方法并返回。
2:Protorype的创建与Singleton的创建大体类似,过程就是 beforePrototypeCreation()-->createBean()-->afterPrototypeCreation().
3:自定义Scope的对象的创建暂且omit。
总结来说:创立一个bean的过程就是做before Create,create,after Create.
3:创建完成一个Bean以后并不直接返回,返回的是getObjectForBeanInstance(sharedInstance, name, mbd);方法return的Object。这个方法的主要功能判定给定的bean是一个普通Bean还是一个FactoryBean(FactoryBean可以理解为用以创建某个特定Bean的warpper?),如果是普通Bean就返回该Bean,如果是FactoryBean,则返回FactoryBean特定照顾过的bean(FactoryBean 代码1245行)。
FactoryBean的处理:
FactoryBean的注释如下:
Interface to be implemented by objects used within a [url=mailto:{@link]{@link BeanFactory}
which are themselves factories. If a bean implements this interface,
it is used as a factory for an object to expose, not directly as a bean
instance that will be exposed itself.
FactoryBean并不是一个直接拿来使用的Bean,他用以封装并暴露某个特定的Bean,在暴露的过程中可以给Bean做一些额外的操作,做一些额外的修改。
对于FactoryBean,需要调用一个方法用于包装并处理原始bean,AbstarctBeanFactory的方法签名为
postProcessObjectFromFactoryBean(object, beanName); 但是AbstractBeanFActory的该方法没有做任何多于操作,直接返回原始Bean。
AbstractAutowireCapableBeanFactory是AbstarctBeanFactory的一个子类,它的postProcessObjectFromFactoryBean(object, beanName);
方法实现调用了BeanPostProcessor的处理,applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName),
具体实现如下:
Object result = existingBean;
for (Iterator it = getBeanPostProcessors().iterator(); it.hasNext();) {
BeanPostProcessor beanProcessor = (BeanPostProcessor) it.next();
result = beanProcessor.postProcessAfterInitialization(result, beanName);
}
return result;
其实就是把所有注册的BeanPostProcessor针对该原始bean一一处理,并将最终的bean返回。
阅读(924) | 评论(0) | 转发(0) |