目录
一:概述
二:代码展示
一:概述
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实例返回。