springboot2-自定义一个starter

创建一个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包含如下内容:

  1. 一个自动配置模块儿,包含自动配置代码;
  2. 一个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,它仅仅提供一些必要的依赖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章