Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30465725
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-03-31 14:13:59

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) |
给主人留下些什么吧!~~