【Spring源码分析】一、BeanFactory之XmlBeanFactory

一、源码切入点

 bf = new XmlBeanFactory(new ClassPathResource("bean.xml"));
 User user = bf.getBean("user", User.class);
 user = bf.getBean("user", User.class);

bean.xml定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.gupao.domain.User"/>

</beans>


二、分析XmlBeanFactory的UML图

我来实现
定义个BeanFactory工厂,然后需要一个解析类,进行解析配置文件,然后需要一个反射工具类,根据clsss反射获取bean。
首先BeanFactory中有getBean、parseBeanDefinition、CreateBean方法,具体工厂中类中组合解析文件文件接口,根据不同的配置文件传入不同的解析策略,然后就是反射获取bean instance。

Sping的实现
利用idea来生成uml图
在这里插入图片描述
看了这个图才发现spring框架是绝对的面向接口编程,而且spring对封装和一个对象的单一功能做到了极致。

1. BeanFactory: 这个是最顶层接口,里面基本只包含 getBean方法。
看到这里我当时的感觉就是:这就很奇怪,bean工厂是用来产生bean的,但是这个接口没有如何加载、解析配置文件?
分析:配置文件可能是xml、properties、json等,Bean工厂是用来产生bean的,会用到解析功能,这个解析功能进行了封装,会组合到具体的bean工厂里面

2. ListableBeanFactory: 根据各种条件获取Bean 的配置List。 他不是根据name or id 去获取单个的bean,而是集合概念。
分析:这个接口中的方法主要用于判断和统计是否存在bean配置,其他的方法反而ApplicationContext用的更多。

3. HierarchicalBeanFactory: 看名字就是分层次的bean工厂,他有2个方法,一个是设置他的parent 工厂,一个是从containsLocalBean判断自己工厂的是否含有这个bean
分析:这个使用存在多个工厂嵌套的时候,具有父子层级关系,感觉这个也用不到

4.ConfigurableBeanFactory: 配置factory的方法。,比如设置factory的classloader等(无需考虑继承SingletonBeanRegistry接口)
分析:接口之间的层次真的很分明,非常值得学习

5.AutowireCapableBeanFactory: 直接继承BeanFactory,具有创建bean,自动注入bean、初始化bean和初始化bean的后置处理等。
分析:这个子接口算是非常重要了,后续的factory必须实现它,这里就感觉接口之间的层次真的很分明,非常值得学习

6.ConfigurableListableBeanFactory: 所有factory的大集合。listable、configurable、autowireable

8. AliasRegistry: 别名管理

9. SimpleAliasRegistry: 别名管理的一个简单实现,主要是用map进行存储别名

10. SingletonBeanRegistry: 单例接口的注册和管理(比如根据名字获取单例,判断单例map中是否存在instance)。
分析:这个就是针对单例进行的最顶层抽象,对单例进行的统一管理,这种对某一类统一管理的思想值得学习

11.DefaultSingletonBeanRegistry 主要是对接口SingletonBeanRegistry单例管理进行的实现,而且也继承了SimpleAliasRegistry,具有简单别名管理。
分析:spring从来都不是在最终的工厂类中对接口进行实现,而是在中间过程就把接口默认实现了一部分,这样做可以重复利用中间类,而且如果对默认实现不满足情况,可以在最终工厂类中进行重写。非常值得借鉴

12.FactoryBeanRegistrySupport: 整合DefaultSingletonBeanRegistry的单例管理功能,还有增加对FactoryBean的处理
分析:不明白这个功能的含义

13.AbstractBeanFactory: 首先继承FactoryBeanRegistrySupport,那么他会有单例管理和别称管理功能。然后实现了ConfigurableBeanFactory接口,他会对ConfigurableBeanFactory进行默认的实现,而且对接口BeanFactory中的getBean方法应用模板方法(调用的createBean方法是抽象的)进行实现,堪称经典

分析:

  • 继承后具有单例管理功能和别称管理功能
  • 对ConfigurableBeanFactory接口中的方法进行默认实现
  • 实现getBean(模板设计模式的经典应用)

14.AbstractAutowireCapableBeanFactory: 这个类是createBean 模板方法的实现类。这里类的注释上特殊说明,关于类的定义和类的配置解析等等不在这个类中,而是在BeanDefinitionRegistry进行实现。

15.BeanDefinitionRegistry: 持有bean定义的管理(增删改查)和注册功能

16.DefaultListableBeanFactory: 这个算是最重要的类了,首先他实现ConfigurableListableBeanFactory,那么他必须具有listable、配置工厂、createBean实现类的功能。 继承了AbstractAutowireCapableBeanFactory,那么它实现了配置、createBean的功能 ,它有继承了BeanDefinitionRegistry,他必须实现bean的定义和注册中心。

  • 必须实现listable
  • 必须实现bean的定义和注册中心
public DefaultListableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		super(parentBeanFactory);
	}

这个就是实现了工厂的层级关系,这个super会调用AbstractAutowireCapableBeanFactory中的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值