Spring boot如何写一个自定义的auto-configuration(上)
这篇文章来自于spring官方文章。首先会说明要做auto-configuration理解的内容,之后来一步一步的说明如何做。
理解自动配置
auto-configured
类在spring boot中,自定配置是通过
@Configuration
的类实现的。可选的@Conditional
注解用来限制什么自动配置生效。通常情况下,自动配置的类上会使用@ConditionalOnClass
和@ConditionalOnMissingBean
两个注解。这保证了自动配置的可用性,只有符合某种情况下才生效。否则就像spring boot的一些自动配置一样,会强制生效,比如dataSourceAutoConfigure
定位
auto-configuration
配置spring boot通过检查jar包中
META-INF/spring.factories
这个文件,确定自动配置的key是什么.org.springframework.boot.autoconfigurer.EnableAutoConfiguration=\ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure,LibXWebAutoConfiguration
你可以使用
@AutoConfigureAfter
和@AutoConfigureBefore
注解,如果你的配置需要规定特定的顺序。比如说,如果你提供web方面的自动配置,那么就必须在WebMvcAutoConfiguration
之后。如果不需要配置之间互相关联或者明确指定顺序,可以使用
@AutoconfigureOrder
进行注解,这个会自动安排配置的顺序。这里有一个note是讲,合理安排自动配置的包,避免被特定的component scan给扫到。这个的意思应该是说, 这些是由spring boot启动的时候扫描的,而不是应该由其他来处理。
条件配置
主要使用
@Conditional
和@ConditionalOnMissingBean
。两者可以用在class或者@Bean
方法上@ConditionalOnBean
@@ConditionOnMissingBean
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnWebApplication
ConditionalOnExpression
创建自定义的starter
一个自动配置的library应该包括两部分:
* `autoconfigure` 模块,包含自动配置的code * `starter`模块, 提供提供额外的依赖。简单来说,提供这个就可以使用starter了
看起来很简单并且容易懂,一个来提供配置,另外一个来提供自己这个功能所需要的dependency.
Name
最好不要使用spring-boot开头的module,即使groupId与spring boot的groupId不同,因为这样可能未来和spring boot冲突。
最好的命名规则。 比如说要创建一个
acme
的auto configure,那么命名应该是acme-spring-boot-autoconfigure
和acme-spring-boot-starter
,如果只使用一个module,那么就使用acme-spring-boot-starter
配置的命名最好不要使用官方的,应该可能未来他们会修改,避免造成影响。这是spring boot他们的。
确保
trigger meta-data generation
所以IDE也可以使用这些自动配置的key。这个会生成META-INF/spring-configuration-metadata.json
文件,进行查看是否正确。自动配置module
自动配置module理论上将包含了所有starter需要的配置,可以包括
@ConfigurationProperties
和一些callback的interface用来提供更好的配置starter module
这是一个空的jar,主要用来提供这个功能必须的依赖。
接下来我们来根据理解写一个自动配置的auto-configurer吧, 接下下篇。