Spring之Bean实例化的基本流程

目录

一:概述                     

二:代码展示


一:概述                     

             Spring容器在进行初始化时, 会将xml配置的<bean>的信息封装成一个BeanDefinition对象, 所有的 BeanDefinition存储到一个名为beanDefinition Map的Map集合中去, Spring框架在对该Map进行遍历,使用反 射创建Bean实例对象, 创建好的Bean对象存储在一个名singletonObjects的Map集合中, 当调用getBean方法 时则最终从该Map集合中取出Bean实例对象返回。

二:代码展示

     Bean信息定义对象-BeanDefinition  

<bean  id=" "     class="  " name=" " lazy-init=" "            
    scope=" " init-method=" "
destroy-method=" " factory-bean=" "
factory-method=" " abstract=" "
depends-on=" "    parent=" ">
<property name=" " ref=" "/>
<property name=" " ref=" "/>
<property name=" " value=" "/>
</bean>

    信息封装

public interface BeanDefinition{
String SCOPE SINGLETON="singleton";
String SCOPE PROTOTYPE="prototype";
void setBeanClassName(@Nullable String var1) ;
String getBeanClassName() ;
void setScope(@Nullable String var1) ;
String getScope() ;
void setLazyInit(boolean var1) ;
boolean isLazyInit() ;
void setFactoryBeanName(@Nullable String var1) ;
String getFactoryBeanName() ;
void setFactoryMethodName(@Nullable String var1) ;
String getFactoryMethodName() ;
void setInitMethodName(@Nullable String var1) ;
String getInitMethodName() ;
//....省略部分属性和方法

    DefaultListableBeanFactory对象内部维护着一个Map用于存储封装好的BeanDefinitionMap

public class  DefaultListableBeanFactory extends...implements...{
//存储<bean>标签对应的Bean Definition对象
//key:是Bean的bean Name, value:是Bean定义对象Bean Definition
private final Map<String, Bean Definition>bean Definition Map;

}

                 Spring框架会取出beanDefinitionMap中的每个BeanDefinition信息, 反射构造方法或调用指定的工厂方法生成Bean实例对象, 所以只要将BeanDefinition注册到beanDefinitionMap这个Map中, Spring就会进行对 应的Bean的实例化操作

                  Bean实例及单例池singletonObjects,beanDefinitionMap中的BeanDefinition会被转化成对应的Bean实例对象, 存储到单例池singleton Objects中去, 在DefaultListableBeanFactory的上四级父类DefaultSingletonBeanRegistry中, 维护着singletonObjects,源码如下:

public class Default Singleton Bean Registry extends...implements...{
//存储Bean实例的单例池
key:是Bean的beanName,value:是Bean的实例对象
privatefinal Map<String,Object> singletonObjects=new Concurrent HashMap(256) ;

}

Bean实例化的基本流程

  • 加载xml配置文件, 解析获取配置中的每个<bean>的信息, 封装成一个个的BeanDefinition对象;

  • 将Bean Definition存储在一个名为beanDefinitio Map的Map<String,BeanDefinition>中;

  • ApplicationContext底层遍历beanDefinitionMap,创建Bean实例对象;

  • 创建好的Bean实例对象, 被存储到一个名为singleton Objects的Map<String, Object>中;

  • 当执行applicationContext.getBean(beanName) 时, 从singletonObjects去匹配Bean实例返回。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值