springBoot为我们提供了自动化装配的功能,简单方便。可以像使用插件一样,对各个组件自由组合装配。只需引入定义好的 starter 即可。有点类似于java的SPI机制,只不过SPI机制是为了解决项目与项目之间的解耦,而starter方式实现了模块化完全解耦,实现热插拔功能。
今天就来自定义一个自动化装配的实现,自定义starter。
/** * Created by zhangshukang on 2018/9/20. */ @Configuration @ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true) public class MyAutoConfiguration { static { System.out.println("myAutoConfiguration init..."); } @Bean public SimpleBean simpleBean(){ return new SimpleBean(); } } 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=/ spring.study.startup.bean.MyAutoConfiguration 复制代码
如图所示:
最后只需在启动类项目中引入我们的 starter 模块即可。在 SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三) 中,我们提到了自动化配置的逻辑,入口为spring 刷新容器的方法:
public void refresh() throws BeansException, IllegalStateException { //... invokeBeanFactoryPostProcessors(beanFactory); //... } 复制代码
最终在 AutoConfigurationImportSelector
解析 spring.factories
文件:
spring.factories
默认的配置类。如下:
springBoot为我们提供的配置类有180多个,但是我们不可能会全部引入。所以在自动装配的时候,会去classPath下面寻找,是否有对应的配置类。如果有配置类,则按条件注解 @Conditional
或者 @ConditionalOnProperty
等相关注解进行判断,决定是否需要装配。如果 classPath
下面没有对应的字节码,则不进行任何处理。 我们自定义的配置类也是以相同的逻辑进行装配,我们指定了以下注解:
@ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true) 复制代码
默认为 true,所以自定义的starter成功执行。
springBoot
提供了一系列的条件注解:
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean) @ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean) @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean) @ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean) @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean) @ConditionalOnNotWebApplication(不是web应用)
SpringBoot2 | SpringBoot启动流程源码分析(一)
SpringBoot2 | SpringBoot启动流程源码分析(二)
SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)
SpringBoot2 | SpringBoot Environment源码分析(四)
SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六)
SpringBoot2 | 条件注解@ConditionalOnBean原理源码深度解析(七)