Spring Boot中文参考指南(2.1.6)49、创建你自己的自动配置

下一篇[未完待续]

Spring Boot中文参考指南(2.1.6)49、创建你自己的自动配置

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-auto-configuration.html/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

49、创建你自己的自动配置

如果你在一家开发共享库的公司工作,或者你在一个开源或商业库工作,你可能想要开发你自己的自动配置。自动配置类可以捆绑在外部 jars 中,并且仍然可以通过 Spring Boot 获取。

自动配置可以与提供自动配置代码以及你将与之一起使用的典型库的“starter”相关联。我们首先介绍你需要了解的内容,以构建你自己的自动配置,然后我们继续介绍创建自定义 starter 所需的典型步骤。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-auto-configuration.html#boot-features-custom-starter )

提示:演示项目可用于展示如何逐步创建 starter。

49.1、了解自动配置的 Beans

在 hood(引擎盖)下,自动配置是用标准的 @Configuration 类实现的。附加的 @Conditional 注解用于约束何时应用自动配置。通常,自动配置类使用 @ConditionalOnClass 和 @ConditionalOnMissingBean 注解。这将确保只有在找到相关类并且尚未声明自己的 @Configuration 时,才应用自动配置。

你可以浏览 spring-boot-autoconfigure 的源代码,以查看 Spring 提供的 @Configuration 类(请参阅 META-INF/spring.factories 文件)。

49.2、定位自动配置候选项

Spring Boot 检查发布的 jar 中是否存在 META-INF/spring.factories 文件。该文件应在 EnableAutoConfiguration 键下列出你的配置类,如下面示例所示:

Spring Boot中文参考指南(2.1.6)49、创建你自己的自动配置

<code>org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration/<code>

注释:只有这样才能加载自动配置。确保它们是在特定的包空间中定义的,并且永远不是组件扫描的目标。此外,自动配置类不应启用组件扫描来查找其他组件。应该改为使用特定的 @Imports。

如果需要按特定顺序应用配置,则可以使用 @AutoConfigureAfter 或 @AutoConfigureBefore 注解。例如,如果提供特定于 web 的配置,则可能需要在 WebMvcAutoConfiguration 之后应用类。

如果你想排序某些不应该相互直接了解的自动配置,也可以使用 @AutoConfigureOrder。该注解与常规的 @Order 注解具有相同的语义,但为自动配置类提供了专用的顺序。

49.3、条件注解

你几乎总是希望在自动配置类中包含一个或多个 @Conditional 注解。@ConditionalOnMissingBean 注解是一个常见的示例,用于允许开发者在对默认值不满意时重写自动配置。

Spring Boot 包含许多 @Conditional 注解,你可以通过注解 @Configuration 类或单个 @Bean 方法在自己的代码中重用这些注解。这些注解包括:

<code>49.3.1、Class 条件 

49.3.2、Bean 条件
49.3.3、Property 条件
49.3.4、Resource 条件
49.3.5、Web 应用程序条件
49.3.6、SpEl 表达式条件
49.3.1、Class 条件/<code>

@ConditionalOnClass 和 @ConditionalOnMissingClass 注解允许 @Configuration 类基于特定类的存在或不存在而被包含。由于注解元数据是通过使用 ASM 解析的,因此可以使用 value 属性来引用实际的类,即使该类可能不会实际出现在正在运行的应用程序类路径上。如果希望使用字符串值指定类名,也可以使用 name 属性。

这种机制对 @Bean 方法的应用方式不同,该方法的返回类型通常是条件的目标:在方法上的条件应用之前,JVM 将加载类和可能处理的方法引用,如果类不存在,这些引用将失败。

要处理此场景,可以使用单独的 @Configuration 类来隔离条件,如下面示例所示:

Spring Boot中文参考指南(2.1.6)49、创建你自己的自动配置

<code>@Configuration
// Some conditions
public class MyAutoConfiguration {

// Auto-configured beans

@Configuration
@ConditionalOnClass(EmbeddedAcmeService.class)
static class EmbeddedConfiguration {

@Bean
@ConditionalOnMissingBean
public EmbeddedAcmeService embeddedAcmeService() { ... }

}

}/<code>

提示:如果使用 @ConditionalOnClass 或 @ConditionalOnMissingClass 作为元注解的一部分来组成自己的组合注解,则必须使用 name 作为在这种情况下不处理的类的引用。

49.3.2、Bean 条件

@ConditionalOnBean 和 @ConditionalOnMissingBean 注解允许根据特定 bean 的存在或不存在来包含 bean。可以使用 value 属性按类型指定 bean,或使用 name 指定 bean。search 属性允许你限制在搜索 bean 时应考虑的 ApplicationContext 层次结构。

当放置在 @Bean 方法上时,目标类型默认为该方法的返回类型,如下面示例所示:

Spring Boot中文参考指南(2.1.6)49、创建你自己的自动配置

<code>@Configuration
public class MyAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public MyService myService() { ... }

}/<code>

在前面的示例中,如果 ApplicationContext 中没有包含 MyService 类型的 bean,则将创建 myService bean。

提示:你需要非常小心添加 bean 定义的顺序,因为这些条件是基于目前为止处理的内容进行评估的。出于这个原因,我们建议在自动配置类上只使用 @ConditionalOnBean 和 @ConditionalOnMissingBean 注解(因为在添加任何用户定义的 bean 定义后,这些注解都保证加载)。

注释:@ConditionalOnBean 和 @ConditionalOnMissingBean 不阻止创建 @Configuration 类。在类级别使用这些条件和用注解标记每个包含的 @Bean 方法之间的唯一区别是,如果条件不匹配,前者会阻止将 @Configuration 类注册为 bean。

49.3.3、Property 条件

@ConditionalOnProperty 注解允许基于 Spring Environment 属性包含配置。使用 prefix 和 name 属性指定应检查的属性。默认情况下,任何存在且不等于 false 的属性都是匹配的。你还可以使用 havingValue 和 matchIfMissing 属性创建更高级的检查。

49.3.4、Resource 条件

@ConditionalOnResource 注解只允许在存在特定资源时包含配置。可以使用常见的 Spring 约定来指定资源,如下面示例所示:file:/home/user/test.dat。

49.3.5、Web 应用程序条件

@ConditionalOnWebApplication 和 @Conditionalonotwebapplication 注解允许根据应用程序是否为“web 应用程序”来包括配置。web 应用程序是使用 Spring WebApplicationContext、定义会话作用域或具有 StandardServletEnvironment 的任何应用程序。

49.3.6、SpEl 表达式条件

@ConditionalOnExpression 注解允许根据 SpEL 表达式的结果包含配置。

下一篇[未完待续]


分享到:


相關文章: