网站系统建设的目标,联享品牌网站建设,平面设计网名,兰州网站关键字优化目录 一、概述 二、主要功能 三、核心功能解析 Bean定义的存储结构 ConcurrentHashMap的使用和意义 四、总结
一、概述
DefaultListableBeanFactory 是 Spring 框架中的一个核心类#xff0c;它继承自AbstractAutowireCapableBeanFactory类#xff0c;实现了 ListableBeanF…目录 一、概述 二、主要功能 三、核心功能解析 Bean定义的存储结构 ConcurrentHashMap的使用和意义 四、总结
一、概述
DefaultListableBeanFactory 是 Spring 框架中的一个核心类它继承自AbstractAutowireCapableBeanFactory类实现了 ListableBeanFactory 接口并提供了一些额外的方法用于注册和获取Bean的定义。该类提供了 Spring 应用上下文中的 bean 定义和实例的管理功能。它是 Spring 容器的基础负责管理 bean 的生命周期、依赖注入等核心功能。
二、主要功能
Bean 定义管理DefaultListableBeanFactory 存储了所有的 bean 定义这些定义通常来自于 XML 配置文件、注解或其他配置方式。Bean 实例化根据 bean 的定义容器负责实例化它们。依赖注入容器负责自动装配 bean 之间的依赖关系。生命周期管理容器负责管理 bean 的生命周期从创建到销毁。事件发布容器负责发布与 bean 相关的各种事件如初始化、销毁等。
三、关键代码分析
Bean 定义存储
private final MapString, RootBeanDefinition
beanDefinitionMap new ConcurrentHashMap(256);这里使用了一个 ConcurrentHashMap 来存储所有的 bean 定义。键是 bean 的名称值是 RootBeanDefinition 对象它包含了 bean 的完整定义信息。 2. Bean 实例化
当需要实例化一个 bean 时DefaultListableBeanFactory 会使用 getBean() 方法。这个方法首先检查请求的 bean 是否已经存在实例如果存在则直接返回如果不存在它会调用 createBean() 方法来创建 bean 的实例。 3. 依赖注入
在创建 bean 的实例后DefaultListableBeanFactory 会自动检测该 bean 的所有依赖项并注入这些依赖。这个过程通过反射实现利用了 Java 的 Field 和 Method 类来访问和修改对象的属性。 4. 事件发布
当 bean 的生命周期发生变化时如初始化、销毁等DefaultListableBeanFactory 会发布相应的事件。这些事件会被注册的监听器捕获并处理。事件的发布通过 Spring 的事件机制实现基于发布-订阅模式。 5. 其他关键方法
addBeanPostProcessor: 用于添加后处理器可以在 bean 创建后对其进行进一步处理。registerBeanDefinition: 用于注册一个新的 bean 定义。removeBeanDefinition: 用于移除一个已注册的 bean 定义。getBeanNamesForType: 根据给定的类型获取所有相关的 bean 名称。getBeansOfType: 根据给定的类型获取所有相关的 bean 实例。getAliases: 获取指定名称的所有别名。
四、总结
DefaultListableBeanFactory 是 Spring 框架中非常重要的一个类它提供了基础的 bean 管理功能使得开发者能够专注于业务逻辑而不是底层的bean 管理。通过对它的源码分析我们可以深入了解 Spring 的核心工作原理从而更好地利用这个框架来构建企业级应用。
下面是DefaultListableBeanFactory的精简源码
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {// 用于保存Bean定义的Mapprivate final MapString, BeanDefinition beanDefinitionMap new ConcurrentHashMap();// 用于保存Bean实例的Mapprivate final MapString, Object singletonObjects new ConcurrentHashMap();// 用于保存Bean的作用域的Mapprivate final MapString, Scope scopes new ConcurrentHashMap();// 用于保存Bean的后置处理器的Listprivate final ListBeanPostProcessor beanPostProcessors new ArrayList();// 用于保存Bean的初始化方法的Mapprivate final MapString, String initMethods new ConcurrentHashMap();// 用于保存Bean的销毁方法的Mapprivate final MapString, String destroyMethods new ConcurrentHashMap();// 用于保存Bean的销毁回调的Listprivate final ListRunnable destroyCallbacks new CopyOnWriteArrayList();// 用于保存Bean的依赖关系的Mapprivate final MapString, SetString dependentBeans new ConcurrentHashMap();// 用于保存Bean的依赖关系反转的Mapprivate final MapString, SetString dependenciesForBean new ConcurrentHashMap();// 用于保存Bean的别名的Mapprivate final MapString, String aliases new ConcurrentHashMap();// 用于保存Bean的类型的Mapprivate final MapString, Class? types new ConcurrentHashMap();// 用于保存Bean的标记的Listprivate final ListString alreadyCreated new CopyOnWriteArrayList();// 用于保存Bean的ClassLoaderprivate ClassLoader beanClassLoader ClassUtils.getDefaultClassLoader();// 用于保存Bean的属性编辑器的Mapprivate final MapClass?, PropertyEditor customEditors new ConcurrentHashMap();// 用于保存Bean的TypeConverterprivate TypeConverter typeConverter;// ... 其他成员变量和方法省略 ...Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {Assert.notNull(beanName, Bean name must not be null);Assert.notNull(beanDefinition, BeanDefinition must not be null);if (containsBeanDefinition(beanName)) {throw new BeanDefinitionStoreException(Bean definition for bean beanName already exists);}beanDefinitionMap.put(beanName, beanDefinition);if (beanDefinition instanceof AbstractBeanDefinition ((AbstractBeanDefinition) beanDefinition).hasBeanClass()) {Class? beanClass ((AbstractBeanDefinition) beanDefinition).getBeanClass();types.put(beanName, beanClass);}if (beanDefinition instanceof AnnotatedBeanDefinition) {MethodMetadata factoryMethodMetadata ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata();if (factoryMethodMetadata ! null beanDefinition instanceof AbstractBeanDefinition) {((AbstractBeanDefinition) beanDefinition).setResolvedFactoryMethod(factoryMethodMetadata);}}// 发布Bean定义注册事件if (hasBeanCreationStarted()) {// 如果容器已经开始创建Bean则立即初始化该BeanfinishBeanFactoryInitialization();}}Overridepublic BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {Assert.notNull(beanName, Bean name must not be null);BeanDefinition bd beanDefinitionMap.get(beanName);if (bd null) {throw new NoSuchBeanDefinitionException(beanName);}return bd;}Overridepublic boolean containsBeanDefinition(String beanName) {Assert.notNull(beanName, Bean name must not be null);return beanDefinitionMap.containsKey(beanName);}// ... 其他方法省略 ...protected void processBeanDefinition(BeanDefinition beanDefinition) throws BeanDefinitionStoreException {if (beanDefinition instanceof AbstractBeanDefinition) {AbstractBeanDefinition abstractBeanDefinition (AbstractBeanDefinition) beanDefinition;if (abstractBeanDefinition.hasBeanClass()) {if (!abstractBeanDefinition.isSynthetic()) {validateBeanDefinition(abstractBeanDefinition);}prepareMethodOverrides(abstractBeanDefinition);}}}// ... 其他方法省略 ...Overrideprotected void initBeanWrapper(BeanWrapper bw) {bw.setConversionService(getConversionService());}Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {// 实例化BeanObject bean resolveBeforeInstantiation(beanName, mbd);if (bean ! null) {return bean;}return doCreateBean(beanName, mbd, args);}// ... 其他方法省略 ...}以上是DefaultListableBeanFactory的源码核心部分。它主要通过使用Java的集合类来存储和管理Bean的定义、实例、作用域、后置处理器等信息。它实现了BeanDefinitionRegistry接口可以注册和获取Bean的定义。它还继承自AbstractAutowireCapableBeanFactory类提供了创建和初始化Bean的功能。 文章转载自: http://www.morning.zyslyq.cn.gov.cn.zyslyq.cn http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn http://www.morning.dbqcw.com.gov.cn.dbqcw.com http://www.morning.xclgf.cn.gov.cn.xclgf.cn http://www.morning.kljhr.cn.gov.cn.kljhr.cn http://www.morning.mynbc.cn.gov.cn.mynbc.cn http://www.morning.mqgqf.cn.gov.cn.mqgqf.cn http://www.morning.mhcys.cn.gov.cn.mhcys.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.gcszn.cn.gov.cn.gcszn.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.sxcwc.cn.gov.cn.sxcwc.cn http://www.morning.glcgy.cn.gov.cn.glcgy.cn http://www.morning.lgtcg.cn.gov.cn.lgtcg.cn http://www.morning.beeice.com.gov.cn.beeice.com http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.yrbp.cn.gov.cn.yrbp.cn http://www.morning.rblqk.cn.gov.cn.rblqk.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.fksrg.cn.gov.cn.fksrg.cn http://www.morning.gccrn.cn.gov.cn.gccrn.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.qkrgk.cn.gov.cn.qkrgk.cn http://www.morning.fosfox.com.gov.cn.fosfox.com http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.nhzps.cn.gov.cn.nhzps.cn http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn http://www.morning.gblrn.cn.gov.cn.gblrn.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.nxrgl.cn.gov.cn.nxrgl.cn http://www.morning.mhybs.cn.gov.cn.mhybs.cn http://www.morning.kzrbn.cn.gov.cn.kzrbn.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.dnycx.cn.gov.cn.dnycx.cn http://www.morning.ltkzb.cn.gov.cn.ltkzb.cn http://www.morning.c7629.cn.gov.cn.c7629.cn http://www.morning.yfmwg.cn.gov.cn.yfmwg.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.rdlrm.cn.gov.cn.rdlrm.cn http://www.morning.pftjj.cn.gov.cn.pftjj.cn http://www.morning.plxhq.cn.gov.cn.plxhq.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.bqhlp.cn.gov.cn.bqhlp.cn http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.qcnk.cn.gov.cn.qcnk.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.gwkwt.cn.gov.cn.gwkwt.cn http://www.morning.pxwzk.cn.gov.cn.pxwzk.cn http://www.morning.rcmwl.cn.gov.cn.rcmwl.cn http://www.morning.jfbgn.cn.gov.cn.jfbgn.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.fksyq.cn.gov.cn.fksyq.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.wngpq.cn.gov.cn.wngpq.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.tnzwm.cn.gov.cn.tnzwm.cn http://www.morning.jxgyg.cn.gov.cn.jxgyg.cn http://www.morning.pflpb.cn.gov.cn.pflpb.cn http://www.morning.kxymr.cn.gov.cn.kxymr.cn http://www.morning.simpliq.cn.gov.cn.simpliq.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.xxzjb.cn.gov.cn.xxzjb.cn http://www.morning.cjsrg.cn.gov.cn.cjsrg.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.gtmdq.cn.gov.cn.gtmdq.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.ydzly.cn.gov.cn.ydzly.cn http://www.morning.fdhwh.cn.gov.cn.fdhwh.cn http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn