spring源代码自我见

文章目录


前言

最近面试试中,经常问到spring的源代码,老实说,自己真的没特意深入看过这方面的东西,一般我看源码是带着目的性去看,网上的有些文章也解释了一些源码方面的知识,我追踪源码时,还没有彻底弄明白,实例化时的三级缓存机制。尽管网上有这方面的文章,但我依旧没全弄明白。

因为自己对源码还半生不熟,而且网上关于启动流程,以及解决循环信赖的代码已经很多,所以我不敢班门弄斧,做深层次的分析。

但如我所说,我是有目的性地去看源码。因此我想我看到的源码和别人的源码或许有些“不一样”

正文

围绕着bean加载流程网上有很多了,但我想着重探讨一个接口: BeanDefinitionRegistry,看过一两篇分析源代码的文章,多数文章中会提到:BeanDefinition,可能会提到将BeanDefinition存储到Map中。我奇怪的是为什么不直接说注册到BeanDefinitionRegistry中去呢。难道一个具体实现比抽象接口的意义更大?
以下是其实现的子类
在这里插入图片描述
在其中就有大名顶顶的DefaultListableBeanFactory类,或许就因为如此,很多人会忽略此接口。Spring的命名其实很规范的,比如 XXXXRegistry,会提供一堆一堆registerXX的方法。例如:SingletonBeanRegistry ,我想从名字就可猜到它的功能。(如果你看了他的实现类的话,那么你就会知道用一种另类的方法把自己实例注入到容器中);如果你对设计模式比较熟悉的话,你应该知道 Strategy 代表的意思,那么InstantiationStrategy接口的实现类有两个,我想可以轻松猜到。
介绍BeanDefinitionRegistry之前,我们要了解BeanDefinition,BeanDefinition代表了Bean信息,在初始化bean时要用到的信息:如Class名,或者工厂方法名,是否单例。
如果BeanFactorty是ClassLoader,那么BeanDefinition就相当于Class。
加裁BeanDefinition由BeanDefinitionReader或其它的接口去完成,但存储由BeanDefinitionRegistry负责。
如果只说BeanDefinition和BeanDefinitionRegistry,而不聊聊FactoryBean,其实意义不大,很多人说FactoryBean的命名是想避开BeanFactory,但如果明白了FactoryBean的真正含意,或行就觉得他的命名非常合理。
另外如果了解过spring bean的加载流程,就会对BeanDefinitionRegistryPostProcessor不会陌生,以下是接口的定意:

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

	/**
	 * Modify the application context's internal bean definition registry after its
	 * standard initialization. All regular bean definitions will have been loaded,
	 * but no beans will have been instantiated yet. This allows for adding further
	 * bean definitions before the next post-processing phase kicks in.
	 * @param registry the bean definition registry used by the application context
	 * @throws org.springframework.beans.BeansException in case of errors
	 */
	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

该接口提供了唯一的方法,方法注释告诉我说:在标准的bean definition加载后,但所有的bean还未初始化之前修改 definition registry,那么只要在此接口中register我们自定义的 bean definition,就可以扩展我们的程序了。

未完待继

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值