前言
各位好,我是A哥。最近写了好几篇关于Spring @Configuration的文章,收录在Spring配置类专栏里,这是本公众号的第一个专栏(虽然CSDN里已有几百篇)。虽然写的过程很艰难,但从评价反馈来看都是正向的,聊以安慰呗,比如这个小伙的“三宗最”让我听了很开心啊😄:
虽然每篇文章的阅读量堪忧,毕竟从第一篇文章我就对我自己的公众号定位了嘛:不求大量流行,只求小众共鸣。因为我知道愿意坚持看下去系列文章(强依赖于上下文)的小伙伴还是比较少的,但我相信一旦坚持下来我们的共同话题就多了,“臭味相投”嘛,是这样的吧~
在这之前,CSDN里写过几百篇关于Spring的文章,但是总感觉体系性不够,东打一炮,西放一枪难免会有失连贯性。我一直认为大多时候技术的相关性、上下文上很必要的,仅靠一篇文章想把一个成型的知识点讲清楚几乎没可能,所以那种容易成为快餐,过眼即忘。这不这次我选择在公众号里做些成系列的专题,在CSDN的基础上,抽取精华,去其糟粕,以自身能力尽量的做好每一个专栏,普惠于有需要的小伙伴。过程很枯燥和很乏味,愿意看下去的人也不会很多,能坚持下来或许会被自己感动😄。
版本约定
本文内容若没做特殊说明,均基于以下版本:
- JDK:1.8
- Spring Framework:5.2.2.RELEASE
正文
本文以绘制流程图为主,特点是快,缺点是不详,辅以该专栏(关注公众号,进入该专栏。或点击顶部相关推荐直达)前几篇文章可以达到很好的效果。
相关类
- @Configuration:标注在类上,表示该类是个Full模式的配置类
- 自Spring 5.2.0版本后它加了个proxyBeanMethods属性来显示控制Full模式还是Lite模式,默认是true表示Full模式
- @Bean:标注在方法上,表示方法生成一个由Spring容器管理的Bean
- ConfigurationClassPostProcessor:用于引导处理@Configuration配置类的后置处理器。注意:它只是引导处理,并不是实际处理
- ConfigurationClassUtils:内部工具类。用于判断组件是否是配置类,又或是Full模式/Lite模式,然后在bd元数据里打上标记
- 它还会处理一件小事:获取@Configuration配置类上标注的@Order排序值并放进bd里
- BeanMethod:内部使用的类。用于封装标注有@Bean注解的方法
- ConfigurationClass:内部使用的类。每一个@Configuration配置类都会被封装为它,内部会包含多个@Bean方法(BeanMethod)
- ConfigurationClassParser:解析@Configuration配置类,最终以ConfigurationClass对象的形式展示,并且填充它:因为一个配置类可以@Import导入另外一个(或者N多个)其它配置类,所以需要填充
- ConfigurationClassBeanDefinitionReader:内部使用的类。读取给定的已经解析好的Set<ConfigurationClass>集合,把里面的bd信息注册到BeanDefinitionRegistry里去(这里决定了bd的有序和无序相关问题)
- ConfigurationClassEnhancer:内部使用的类。配置类增强器,用于对@Configuration类(Full模式)使用CGLIB增强,生成一个代理子类字节码Class对象
- EnhancedConfiguration:被增强器增强过的配置类,都会自动的让实现此接口(实际是个BeanFactoryAware)接口
- SpringNamingPolicy:使用CGLIB生成字节码类名名称生成策略 -> 名称中会有BySpringCGLIB字样
- BeanFactoryAwareMethodInterceptor:CGLIB代理对象拦截器。作用:拦截代理类的setBeanFactory()方法,给对应属性赋值
- BeanMethodInterceptor:CGLIB代理对象拦截器。作用:拦截所有@Bean方法的执行,以支持可以通过直接调用@Bean方法来管理依赖关系(当然也支持FactoryBean模式)
配置类解析流程图
配置类的解析均是交由ConfigurationClassPostProcessor来引导。在Spring Framework里(非Spring Boot)里,它是BeanDefinitionRegistryPostProcessor处理器的唯一实现类,用于引导处理@Configuration配置类。解析入口是postProcessBeanDefinitionRegistry()方法,实际处理委托给了processConfigBeanDefinitions()方法。