Spring架构详解之创建Bean实例并构建Bean的关系网

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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方法的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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对象关系建立
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值