Spring源码--容器的基本实现与BeanDefinition

Posted jazon@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring源码--容器的基本实现与BeanDefinition相关的知识,希望对你有一定的参考价值。


DefaultListableBeanFactory是Spring注册及加载bean的默认实现,bean工厂
AliasRegistry:定义对alia的简单增删改查等操作
SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现
SingletonBeanRegistry:定义对单例的注册及获取
DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry的实现
BeanFactory:定义获取bean及bean的各种属性
HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能基础上增加了对parentFactroy的支持
FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
ConfigurableBeanFactory:提供配置Factory的各种方法
LisableBeanFactory:提供各种条件获取Bean的配置清单
AbstractBeanFactory:结合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器
AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对AutowireCapableBeanFactory进行实现
ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型或接口等
DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理

XmlBeanDefinitionReader

1.通过继承AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件。
2.通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。
3.通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析, 并使用BeanDefinitionParserDelegate对Element进行解析。

配置文件封装

Spring有一个Resource抽象,会将XML配置文件封装为Resource类型。

public AbstractAutowireCapableBeanFactory() 
		super();
        // 忽略BeanNameAware类型的依赖注入
        // 作用是忽略XML由Set方法的依赖注入,由开发者自行进行注入,如通过Aware进行注入
       // BeanFactory通过BeanFactoryAware注入
		ignoreDependencyInterface(BeanNameAware.class);
		ignoreDependencyInterface(BeanFactoryAware.class);
		ignoreDependencyInterface(BeanClassLoaderAware.class);
	

BeanDefinition


BeanDefinition是一个接口,在Spring中有三种实现ChildBeanDefinition,RootBeanDefinitino,GenericBeanDefinition。其中ChildBeanDefinition意为子,RootBeanDefinition意为父,不能设置parentName,子能够从父继承配置。而GenericBeanDefinition是通用的,更加灵活,避免硬编码为Root或者Child。

注册BeanDefinition

  1. 通过beanName注册·BeanDefinition
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException 
    // 这里是BeanDefinitionRegistry接口定义的方法

2.注册别名
别名的作用:组件A定义了名为componentA的bean,组件B想用componentB引用它,而MyApp想用myApp引用它。这时候就给组件A起两个别名。

public void registerAlias(String name, String alias) 
    // 这里是AliasRegistry接口定义的方法

以上是关于Spring源码--容器的基本实现与BeanDefinition的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码--容器的基本实现与BeanDefinition

spring核心之BeanDefinition

spring核心之BeanDefinition

Spring 源码分析--容器的基本实现

2Spring 源码学习 ~ Spring 容器的基本实现

2Spring 源码学习 ~ Spring 容器的基本实现