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

image.png
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

image.png1.通过继承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

image.png
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接口定义的方法
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值