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
- 通过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的主要内容,如果未能解决你的问题,请参考以下文章