Spring配置类深度剖析总结篇手绘流程图可白嫖

43次阅读

共计 3035 个字符,预计需要花费 8 分钟才能阅读完成。

生命太短暂,不要去做一些基本没有人想要的货色。本文已被 https://www.yourbatman.cn 收录,外面一并有 Spring 技术栈、MyBatis、JVM、中间件等小而美的 专栏 供以收费学习。关注公众号【BAT 的乌托邦】一一击破,深刻把握,回绝浅尝辄止。

前言

各位好,我是 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() 办法。


配置类加强流程图

如果一个配置类是 Full 模式,那么它就须要被 CGLIB 字节码晋升。加强动作委托给 enhanceConfigurationClasses(beanFactory) 去实现。

以上是疏导 / 调度的流程图,上面对字节码加强、理论拦挡实现流程进行细分形容。


生成增强子类字节码流程图

针对于 Full 模式配置类的字节码生成,委托给 ConfigurationClassEnhancer 增强器去实现,最终失去一个 CGLIB 晋升过的子类 Class字节码对象

字节码理论是由 Enhancer 生成,就不必再深刻了,那属于 CGLIB(甚至 ASM)的领域,很容易头晕,也并无必要。


拦截器执行流程图

拦截器是实现加强 理论逻辑 的核心部件,因而它的执行流程 须要引起器重。一共有两个“有用”的拦截器,别离画出。


BeanFactoryAwareMethodInterceptor 拦挡流程图

拦挡 setBeanFactory() 办法的执行


BeanMethodInterceptor 拦挡流程图

拦挡 @Bean 办法的执行


总结

本文作为公众号首个专栏 Spring 配置类 的总结篇,次要是对外围解决流程画图论述,适宜须要疾速了解的白嫖党,毕竟面试最喜爱问的就是让你说说执行流程之类的,因而实用性还是蛮高的,当前的专栏均会仿造此套路来玩。

对于 Spring 配置类 这个专栏到这就全副完结了,在此也多谢各位在这期间给我的反馈,让我确定以及必定了这么坚持下去是有意义的,是被反对的,是可能帮忙到同仁们的。我公众号定位为专栏式学习,回绝浅尝抑止,诚邀你的关注,一起提高。

Tips:有小伙伴私信我说有没有入门级别的?答案是没有的。次要是感觉入门级文章网上太多了,趋同性很强,所以我这个别会篇进阶, 有点工作教训 / 根底再看成果更佳


关注 A 哥

Author A 哥(YourBatman)
集体站点www.yourbatman.cn
E-mailyourbatman@qq.com
微 信fsx641385712
沉闷平台
公众号BAT 的乌托邦(ID:BAT-utopia)
常识星球BAT 的乌托邦
每日文章举荐每日文章举荐

正文完
 0