Spring boot如何写一个自定义的auto-configuration(上)

来源:互联网 发布:宇宙射线知乎 编辑:程序博客网 时间:2024/06/05 07:31

Spring boot如何写一个自定义的auto-configuration(上)

这篇文章来自于spring官方文章。首先会说明要做auto-configuration理解的内容,之后来一步一步的说明如何做。

文章在此

  1. 理解自动配置auto-configured

    在spring boot中,自定配置是通过@Configuration的类实现的。可选的@Conditional注解用来限制什么自动配置生效。通常情况下,自动配置的类上会使用@ConditionalOnClass@ConditionalOnMissingBean两个注解。这保证了自动配置的可用性,只有符合某种情况下才生效。否则就像spring boot的一些自动配置一样,会强制生效,比如dataSourceAutoConfigure

  2. 定位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启动的时候扫描的,而不是应该由其他来处理。

  3. 条件配置

    主要使用@Conditional@ConditionalOnMissingBean。两者可以用在class或者@Bean方法上

    1. @ConditionalOnBean
    2. @@ConditionOnMissingBean
    3. @ConditionalOnProperty
    4. @ConditionalOnResource
    5. @ConditionalOnWebApplication
    6. ConditionalOnExpression
  4. 创建自定义的starter

    一个自动配置的library应该包括两部分:

    * `autoconfigure` 模块,包含自动配置的code* `starter`模块, 提供提供额外的依赖。简单来说,提供这个就可以使用starter了

    看起来很简单并且容易懂,一个来提供配置,另外一个来提供自己这个功能所需要的dependency.

    1. Name

      最好不要使用spring-boot开头的module,即使groupId与spring boot的groupId不同,因为这样可能未来和spring boot冲突。

      最好的命名规则。 比如说要创建一个acme的auto configure,那么命名应该是acme-spring-boot-autoconfigureacme-spring-boot-starter,如果只使用一个module,那么就使用acme-spring-boot-starter

      配置的命名最好不要使用官方的,应该可能未来他们会修改,避免造成影响。这是spring boot他们的。

      确保trigger meta-data generation所以IDE也可以使用这些自动配置的key。这个会生成META-INF/spring-configuration-metadata.json文件,进行查看是否正确。

    2. 自动配置module

      自动配置module理论上将包含了所有starter需要的配置,可以包括@ConfigurationProperties和一些callback的interface用来提供更好的配置

    3. starter module

      这是一个空的jar,主要用来提供这个功能必须的依赖。

接下来我们来根据理解写一个自动配置的auto-configurer吧, 接下下篇。

原创粉丝点击