创建一个auto-configuration
理解 auto-configuration
auto-configuration
实际也是通过标准的**@Configuration
** 类实现的,同时通过 @Conditional
注解来控制何时启用,通常会使用 @ConditionalOnClass
和 @ConditionalOnMissingBean
注解,这样能确保发现关键的类存在时并且你没有定义自己相关的@Configuration
时启用自动配置。
查找自动配置的类
springboot 会检查发布的jar包中是否含有 META-INF/spring.factories文件,并且该文件应该在 EnableAutoConfiguration
下列出自定义的配置类:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
说明:自动配置必须以这种形式加载,确保可以在特定的包下定义配置类,并且绝不让他们作为组件扫描的目标。自动配置的类也不应该启用组件扫描查找其他的组件。
如果你定义的配置类需要应用在特定的顺序可以使用 @AutoConfigureAfter
和@AutoConfigureBefore
注解。
@Conditional 注解
自动配置类上通常会包含一个或者多个 @Conditional 注解,包含如下注解:
@ConditionalOnClass、@ConditionalOnMissingClass
@Configuration
// Some conditions
public class MyAutoConfiguration {
// Auto-configured beans
@Configuration
@ConditionalOnClass(EmbeddedAcmeService.class)
static class EmbeddedConfiguration {
@Bean
@ConditionalOnMissingBean
public EmbeddedAcmeService embeddedAcmeService() { ... }
}
}
@ConditionalOnBean、@ConditionalOnMissingBean
@Configuration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() { ... }
}
说明:以上标识myService bean将被创建,如果ApplicationContext中没有发现MyService类型的bean时;
@ConditionalOnProperty
- @ConditionalOnProperty基于spring环境的属性配置决定配置类是否该被包含;
ConditionalOnResource
- 如果某个特定的资源存在 决定是否包含此配置类
@ConditionalOnWebApplication、@ConditionalOnNotWebApplication
- 看是否是 web aplication决定是否包含此配置类
@ConditionalOnExpression
- 依赖SpEL表达式的结果决定是否包含此配置类
创建一个starter
整体原则:
一个完整的springboot starter包含如下内容:
- 一个自动配置模块儿,包含自动配置代码;
- 一个starter模块儿,提供了自动配置模块儿的依赖和一些他所依赖的其他的外部依赖;
总而言之,一个starter应该提供能使他启用的所依赖的所有东西。如果不想讲两者分开也可以将 ````auto-configuration code and the dependency management ```包含在一个模块儿里。
具体要求
1. name
应该为你的starter起一个合适的名字,不要以spring-boot开头,甚至用一个不同的groupId。
2. 自动配置模块儿
自动配置模块儿包含了starter启用所依赖的一切,包含配置属性的定义例如:ConfigurationProperties,还有一些回调接口用于自定义组件的启动形式。
同时官方建议标记自动配置模块儿的依赖为可选择的,以便于在项目里友好的引用此自动配置模块儿。
springboot使用一个注解处理器从一个元文件中收集自动配置类启用的条件(META-INF/spring-autoconfigure-metadata.properties
),如果提供这个文件将提高启动时间,官方建议增加如下的依赖在自动配置模块儿;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
3. starter模块儿
starter模块儿实际上是一个空jar,它仅仅提供一些必要的依赖。