1. 分析starters的原理
-
预定义starts方便之处,也是自定义时需要解决的两个问题 :
(1)目标场景需要使用到哪些依赖?
(2)如何编写导入组件的自动配置类? -
参考WebMvcAutoConfiguration,定义一个自动配置类的注解要素
//1. 首先这是一个配置类 @Configuration //2. 使用大量的条件判断,在满足指定条件时自动配置类或组件注入生效 @ConditionalOnxxx //比如@ConditionalOnWebApplication、@ConditionalOnClass、@ConditionalOnMissingBean //3. 引入绑定属性xxxProperties到容器中 //而xxxProperties使用@ConfigurationProperties标注来映射绑定主配置文件中的相关配置 @EnableConfigurationProperties(xxxProperties.class) //4. 指定自动配置类生效的顺序 @AutoConfigureOrder @AutoConfigureAfter //5. 给容器中添加组件 @Bean
-
必须将编写的自定义自动配置类的全限类名在classpath下META-INF/spring.factories文件中配置,参考:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ //...
2.官方编写starter的模式
-
抽象整体的思想
对外的顶级xxx-starter是一个空JAR文件(没有任何手写的Java代码),仅提供辅助性依赖导入的管理:
专门编写一个实现“功能a”的模块xxx-starter-a,xxx-starter依赖xxx-starter-a,而其他模块依赖xxx-starter的同时就自动依赖了xxx-starter-a,自动的依赖传递。 -
命名规则
(1)官方命名空间前缀:“spring-boot-starter-”
模式:spring-boot-starter-模块名
举例:spring-boot-starter-web
(2)自定义命名空间
后缀:“-spring-boot-starter”
模式:“模块-spring-boot-starter”
举例:mybatis-spring-boot-starter