大家好,这篇文章跟大家来聊下 Spring 中提供的常用扩展点、Spring SPI 机制、以及 SpringBoot 自动装配原理,重点介绍下 Spring 基于这些扩展点怎么跟配置中心(Apollo、Nacos、Zookeeper、Consul)等做集成 。
写在前面我们大多数 Java 程序员的日常工作基本都是在做业务开发,俗称 crudboy 。
作为 crudboy 的你有没有这些烦恼呢?
- 随着业务的迭代,新功能的加入,代码变得越来越臃肿,可维护性越来越低,慢慢变成了屎山
- 遇到一些框架层的问题不知道怎么解决
- 面试被问到使用的框架、中间件原理、源码层东西,不知道怎么回答
- 写了 5 年代码了,感觉自己的技术没有理想的长进
如果你打算要看源码了,优先推荐 Spring、Netty、Mybatis、JUC 包 。
Spring 扩展我们知道 Spring 提供了很多的扩展点,第三方框架整合 Spring 其实大多也都是基于这些扩展点来做的 。所以熟练的掌握 Spring 扩展能让我们在阅读源码的时候能快速的找到入口,然后断点调试,一步步深入框架内核 。
这些扩展包括但不限于以下接口:
BeanFactoryPostProcessor:在 Bean 实例化之前对 BeanDefinition 进行修改
BeanPostProcessor:在 Bean 初始化前后对 Bean 进行一些修改包装增强,比如返回代理对象
Aware:一个标记接口,实现该接口及子接口的类会收到 Spring 的通知回调,赋予某种 Spring 框架的能力,比如 ApplicationContextAware、EnvironmentAware 等
ApplicationContextInitializer:在上下文准备阶段,容器刷新之前做一些初始化工作,比如我们常用的配置中心 client 基本都是继承该初始化器,在容器刷新前将配置从远程拉到本地,然后封装成 PropertySource 放到 Environment 中供使用
ApplicationListener:Spring 事件机制,监听特定的应用事件(ApplicationEvent),观察者模式的一种实现
FactoryBean:用来自定义 Bean 的创建逻辑(Mybatis、Feign 等等)
ImportBeanDefinitionRegistrar:定义@EnableXXX 注解,在注解上 Import 了一个 ImportBeanDefinitionRegistrar,实现注册 BeanDefinition 到容器中
InitializingBean:在 Bean 初始化时会调用执行一些初始化逻辑
ApplicationRunner/CommandLineRunner:容器启动后回调,执行一些初始化工作
上述列出了几个比较常用的接口,但是 Spring 扩展远不于此,还有很多扩展接口大家可以自己去了解 。
Spring SPI 机制在讲接下来内容之前,我们先说下 Spring 中的 SPI 机制 。Spring 中的 SPI 主要是利用 META-INF/spring.factories 文件来实现的,文件内容由多个 k = list(v) 的格式组成,比如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.dtp.starter.adapter.dubbo.autoconfigure.ApacheDubboTpAutoConfiguration,\com.dtp.starter.adapter.dubbo.autoconfigure.AlibabaDubboTpAutoConfigurationorg.springframework.boot.env.EnvironmentPostProcessor=\com.dtp.starter.zookeeper.autoconfigure.ZkConfigEnvironmentProcessor这些 spring.factories 文件可能是位于多个 jar 包中,Spring 容器启动时会通过 ClassLoader.getResources() 获取这些 spring.factories 文件的全路径 。然后遍历路径以字节流的形式读取所有的 k = list(v) 封装到到一个 Map 中,key 为接口全限定类名,value 为所有实现类的全限定类名列表 。上述说的这些加载操作都封装在 SpringFactoriesLoader 类里 。该类很简单,提供三个加载方法、一个实例化方法,还有一个 cache 属性,首次加载到的数据会保存在 cache 里,供后续使用 。
经验总结扩展阅读
- 年纪大了,这些星座就喜欢看甜甜的恋爱
- 胸闷是什么感觉
- 虽然单身时花心,但这些星座一旦恋爱就十分专一
- 主动创造激情,这些星座的爱越来越有深度
- 跟前任碰到,这些星座会落落大方
- 哪些星座男在恋爱中吵架,永远不知道错哪了
- 重燃爱火,这些星座配对有可能分手后还会和好
- 爱情的阴沟里不知道翻了多少次船的星座
- 剑盾如何联网
- 爱情早已戒掉,这些星座只想做自己的王者
