转载

在Spring Boot中创建自己的启动器

在Spring Boot中创建自己的启动器

写在前面

也许你有一个内部库包或一个在整个应用程序环境中常用的开源库,如果要在多个Spring Boot应用程序中使用它,为它创建一个Spring Boot启动器可能会很有用。

Spring Boot启动器包含两个模块:

  1. 自动配置,这是执行繁重工作和设置模块
  2. 启动启动程序模块,它将您的lib库包、@autoconfiguration和所有依赖项包装在一个依赖项中

让我们看一下名为@autoconfiguration的机制。这听起来比实际更复杂。

  1. 在启动时,Spring Boot会扫描类路径,查找 位于META-INF目录中名为spring.factories的所有文件,并对其进行处理。这些文件包含单个键org.springframework.boot.autoconfigure.EnableAutoConfiguration =,其值设置为常规@Configurtion类的列表。
  2. 它会检查每个@Configurtion是否应该包含它并最终使用它。所谓使用就是加入Spring上下文,这样能被别人发现,通过@autowired自动注入这些类。
  3. 当Spring Boot考虑使用它时,将添加条件; 就像@ConditionalOnClass一样,它添加了一个条件,只有当类路径中存在指定的@Configurtion类时才会将这个类包含进来。

实现自动配置

Spring Boot建议为模块命名模式:-spring-boot-autoconfigure,还要声明我们应该为所有属性添加前缀,以免弄乱任何名称空间。让我们尊重它。

比如这里我们的模块将命名为request-logging-spring-boot-autoconfigure,并包含两个类 - @ Confiration类和一个属性类,用于公开可在application.properties中配置的一些属性。

让我们从pom开始吧。

<?xml version="1.0"?>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot</artifactId>
 <version>${spring-boot.version}</version>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-autoconfigure</artifactId>
 <version>${spring-boot.version}</version>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <version>${spring-boot.version}</version>
 <optional>true</optional>
</dependency>
复制代码

前两个依赖项是使用Spring Boot和自动配置类,spring-boot-configuration-processor是一个从@ConfigurationProperties创建元数据文件的工具

下面是配置属性类

@ConfigurationProperties(prefix = "com.requestlogging")
public class RequestLoggingProperties {
 .....
}
复制代码

下面一步定义RequestLoggingAutoConfiguration:我们使用@EnableConfigurationProperties启用属性 并添加两个条件:

@ConditionalOnWebApplication表示只有Spring Boot应用程序是Web应用程序时才包含我们的配置。
@ConditionalOnClass定义RequestContextLoggingFilter必须存在于类路径才能包含配置它。
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass(RequestContextLoggingFilter.class)
@EnableConfigurationProperties(RequestLoggingProperties.class)
public class RequestLoggingAutoConfiguration {
 @Autowired
 private RequestLoggingProperties requestLoggingProperties;
 @Bean
 @Order(1)
 @ConditionalOnMissingBean
 public RequestContextLoggingFilter requestContextLoggingFilter() {
 return new RequestContextLoggingFilter(requestLoggingProperties.getRequestHeaderId(),
 requestLoggingProperties.getLogIdentifier());
 }
}
复制代码

如果Spring Boot包含了我们这个配置,那么如果@ConditionalOnMissingBean有效,它将初始化我们的过滤器bean:new一个RequestContextLoggingFilter实例 。只有当我们的Spring上下文中没有bean存在,我们的bean才会被初始化。

使用autoconfigure模块, Spring建议为启动器命名模式:-spring-boot-starter. 这里我们命名为request-logging-spring-boot-starter:

<dependency>
<groupId>com.jdon</groupId>
<artifactId>request-logging-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
复制代码

启动器需要包含使此启动器工作的所有活动依赖项,否则无法工作。

这样别人就可以使用上面配置使用你的库包了。

原文  https://juejin.im/post/5cb7228b6fb9a0687b7dd88f
正文到此结束
Loading...