SpringLean

本文深入探讨Spring框架的核心组件,如BeanFactory、ApplicationContext及其内部机制,包括XML解析、Bean的生命周期管理、依赖注入、循环依赖处理及扩展点。通过分析源码,揭示Spring如何高效管理和创建Beans。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 一:使用BeanFactory加载XML

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));
MyTestBean bean = bf.getBean("myTestBean");

ClassPathResource分析

这个类,主要是实现了 InputStreamSource 接口,获取资源的,并实现了对资源的一些操作方法

另外,通常有的资源数据是属于没有加工过的,这个时候 我们会定义个类,把资源数据塞到这个类里面,这个类在定义一些方法来处理这个资源。可以把这个类叫做包装类吧。

XmlBeanDefinitionReader

该类是XmlBeanFactory类的一个成员属性。XmlBeanFactory类的继承结构特点是 继承类、实现接口比较多。可以说XmlBeanFactory继承的DefaultListableBeanFactory完成的是加载bean,而其成员属性XmlBeanDefinitionReader完成的是bean的xml解析。这里用到的设计方法是 类继承 和 类组合。is a 和 has a

AbstractBeanDefinitionReader

该类有5个私有成员变量,其中一个是构造器传入,有一个是设置了初始值,使用new,其他3个在构造器中也会用new的方式设置默认值,也提供了 set方法来赋值。这种也是使用 has a 的设计方法,用 其他类作为自己的成员变量以扩充自己的功能。

因此,想要全面了解 AbstractBeanDefinitionReader的功能,就需要把他的成员变量都研究一遍才行。这种需要花费一定的时间

1. 看下ResourceLoader

是用的是在构造器中 new一个默认的实现类。PathMatchingResourePatternResolver ,该类也有自己的 几个成员变量,以扩展自己的功能。(额,实在是太多了,想要好好分析分析的话,真的需要花费不少时间,但是 这里主要是注意这里的设计,就是 爆露一个 外部类 给别人使用,而类的内部 使用了 继承 ,继承了很多功能,在组合一个类,而这类又有自己的继承结构组合接口)

  • 二:使用ApplicationContext加载XML

ApplicationContext bf = new ClassPathXmlApplicationContext("beanFactory.xml");
MyTestBean bean = bf.getBean("myTestBean");

分析ClassPathXmlApplicationContext

ClassPathXmlApplicationContext类的继承结构比较多,先分析DefaultResourceLoader

--------------------------DefaultResourceLoader

DefaultResourceLoader 实现了 ResourceLoader接口。

分析ResourceLoader

ResourceLoader 接口:

1个常量,表示资源路径前缀。

2个方法,一个用来 通过资源路径返回Resource,一个用来获取ClassLoader。ClassLoader不用多说了,是JDK里的类加载器。Resource 接口提供了一些对资源进行操作的方法,并继承了InputStreamSource,该接口提供了获取InputStream的方法,InputStream也不用多说了,是JDK里的IO相关的类。

通过对ResourceLoader接口的分析发现,其中涉及到了3个接口:其中用到了 接口继承 和 接口组合的设计方式。

真正获取资源的是 InputStreamSource接口,该接口返回InputStream。

Resource接口继承InputStreamSource并提供了对资源的一些基本操作方法。

ResourceLoader来作为一个对外开放的接口,用来提供获取Resource的方法。

分析DefaultResourceLoader:

DefaultResourceLoader 是对接口 ResourceLoader的默认实现。

其中实现了 ResourceLoder的两个抽象方法,并增加了一些自己的方法。并且有一个内部类ClassPathContextResource。

是的,上面分析ResourceLoader时,提到了3个接口,其中DefalutResourceLoader实现了ResourceLoader接口,那Resource接口和InputStreamSource接口谁来实现,那么 ClassPathContextResource 正是干这个事情的。

分析ClassPathContextResource:

额,其实不用分析了,我们已经知道 那2个接口时干什么的了,这个类就是用来实现的,先不管是怎么实现的吧。

  • 三、BeanFactory、FactoryBean、ObjectFactory

看spring源码的时候,接口多,类多,有的接口被很多接口继承。源码看久了,就会知道,其中的含义。

为什么会有这么多接口?

java面向对象编程里,类,就是由方法和属性构成的,通常会把共同的方法提取出来放在一个接口中。代码设计最重要的,就是设计出合适的接口,类;最核心的方法,放在接口最底层,然后由类的结构继承关系,最后所有的方法都会继承在最上层的类中,这个类包含了继承结构中所有的功能。

就像最低层的BeanFactory 和 最上层的 DefaultListableBeanFactory。 

怎么分析这种有复杂继承关系的类图呢?

有两种方法:

第一种,我们可以从最上层的类来开始分析,我们知道,一个类最多继承一个类,可以继承多个接口。那这样分析的话比较麻烦。

第二种是从最底层的接口开始分析,这种方式比较可取吧。

  • 四、体会

有人说,程序=算法+数据结构。

那就按照这个公式来解释下:

1. 算法:什么是算法?可以解释为,完成某项功能的指令集合。说直白点,就是我们写的程序。

2.数据结构:什么又是数据结构呢?按照字面意思,就是 描述数据的 ,存储数据的 一种容器,容器的类型结构又不同。常用的数据结构比如 栈 队列 链表 树 等等,这些 不同的 容器结构 来存储数据时,数据会呈现出 具有这种容器结构的特性出来,以便程序能够更好的 处理这些数据。

了解了程序 是 算法处理某种数据结构的指令集合,那边现在有一个问题: 数据从哪里来?数据又是什么?

根据工作几年的经验来看,一般金融类软件处理的数据,一般 为客户信息,商品信息,订单信息等。所有的这些数据 正是 通常开发的程序所要处理的数据了。

上面谈到了 算法、数据结构、及数据,现在来看看springframework 处理的数据又是什么?

springframework 有一个重要的配置文件,叫application.xml。是的,数据来自于配置文件,也就是我们需要创建的bean。我们要创建的这些bean 就是 springframework所要处理的数据。创建在于收集信息,就像是 一个用户开户一样,需要收集客户的各种信息,等到收集完成之后,就是一个insert而言。难点就在于 如何收集这些数据、如何正确的收集?

springframework的第二种扩展功能比第一种扩展的就是,在读取xml配置文件数据 前后增加了对数据加工的功能,有了这些加工的功能,就可以扩展功能来处理数据了。比如 前置处理器、后置处理器、AOP等。

好了,我想,有了这些背景知识,会对学习springframework有一定的帮助。

另外,在延伸一下,计算机中存储的一切都是数据,万千复杂,有一些工具用来处理数据,而另一些工具是以某些工具作为数据。


  • 五、解决循环依赖时,用到的几个缓存
循环依赖使用的三级缓存

  • 六、钩子

spring在创建实例时,会按照如下顺序调用 postprocessor方法

======

createBean:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
BeanPostProcessor#postProcessAfterInitialization

====

doCreateBean:

MergedBeanDefinitionPostProcessor

SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference

=========

populateBean:

InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
InstantiationAwareBeanPostProcessor.postProcessPropertyValues

==========

initializeBean:

    BeanNameAware

    BeanClassLoaderAware

    BeanFactoryAware --> AbstractAutowireCapableBeanFactory

BeanPostProcessor.postProcessBeforeInitialization

InitializingBean.afterPropertiesSet

BeanPostProcessor.postProcessAfterInitialization

==========

//ApplicationContext扩展的功能

QualifierAnnotationAutowireCandidateResolver

ApplicationContextAwareProcessor

BeanFactoryPostProcessor

BeanPostProcessor

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值