彩票走势图

Spring架构详解(9):创建Bean实例并构建Bean的关系网

转帖|行业资讯|编辑:郝浩|2016-02-24 09:54:46.000|阅读 873 次

概述:本篇讲解了如何创建Bean实例并构建Bean的关系网

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

下面是Bean的实例化代码,是从finishBeanFactoryInitialization方法开始的。

protected void finishBeanFactoryInitialization(  
 
        ConfigurableListableBeanFactory beanFactory) {  
 
   
 
    // Stop using the temporary ClassLoader for type matching.    
 
    beanFactory.setTempClassLoader(null);    
 
   
 
    // Allow for caching all bean definition metadata, not expecting further changes  .  
 
    beanFactory.freezeConfiguration();    
 
   
 
    // Instantiate all remaining (non-lazy-init) singletons.  
 
    beanFactory.preInstantiateSingletons();  
 
}    
 

从上面代码中可以发现Bean的实例化是在BeanFactory中发生的。preInstantiateSingletons方法的代码如下:

public void preInstantiateSingletons() throws BeansException {    
 
    if (this.logger.isInfoEnabled()) {    
 
        this.logger.info("Pre-  instantiating singletons in " + this);  
 
    }    
 
    synchronized (this.beanDefinitionMap) {    
 
        for   (String beanName : this.beanDefinitionNames) {  
 
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);    
 
            if (!bd.isAbstract()   && bd.isSingleton()  
 
                && !bd.isLazyInit()) {    
 
                if   (isFactoryBean(beanName)) {  
 
                    final FactoryBean factory =  
 
                        (FactoryBean)   getBean(FACTORY_BEAN_PREFIX+ beanName);  
 
                    boolean isEagerInit;    
 
                    if (System.getSecurityManager()   != null  
 
                        &&   ;factory instanceof SmartFactoryBean) {  
 
                        isEagerInit = AccessController.doPrivileged(    
 
                          &nb  sp; new PrivilegedAction<Boolean>() {    
 
                          &nb  sp; public Boolean run() {  
 
 return ((SmartFactoryBean)   factory).isEagerInit();  
 
                          &nb  sp; }  
 
                        }, getAcce  ssControlContext());  
 
                    }    
 
                    else {    
 
                        isEagerInit = factory instanceof SmartFactoryBean    
 
                          &nb  sp; && ((SmartFactoryBean) factory).isEagerInit();  
 
                    }    
 
                    if (isEagerInit) {    
 
                        getBean  (beanName);  
 
                    }    
 
                }    
 
                else {    
 
                    getBean(beanName);    
 
                }    
 
            }    
 
        }  
 
    }  
 
}  
 

这里出现了一个非常重要的Bean——FactoryBean,可以说Spring一大半的扩展的功能都与这个Bean有关,这是个特殊的Bean他是个工厂Bean,可以产生Bean的Bean,这里的产生Bean是指 Bean的实例,如果一个类继承FactoryBean用户可以自己定义产生实例对象的方法只要实现他的getObject方法。然而在Spring内部这个Bean的实例对象是FactoryBean,通过调用这个对象的getObject方 法就能获取用户自定义产生的对象,从而为Spring提供了很好的扩展性。Spring获取FactoryBean本身的对象是在前面加上&来完成的。

如何创建Bean的实例对象以及如何构建Bean实例对象之间的关联关系式Spring中的一个核心关键,下面是这个过程的流程图。

Bean实例创建流程图
Bean实例创建流程图

如果是普通的Bean就直接创建他的实例,是通过调用getBean方法。下面是创建Bean实例的时序图:

Bean实例创建时序图
Bean实例创建时序图

还有一个非常重要的部分就是建立Bean对象实例之间的关系,这也是Spring框架的核心竞争力,何时、如何建立他们之间的关系请看下面的时序图:

Bean对象关系建立
Bean对象关系建立

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP