创建属于自己的 Spring Boot 自动配置

介绍

这里有官方提供的 演示项目介绍.

本笔记也是通过官方提供的演示项目来进行讲解.

我们可以看到官方的项目中有三个模块, hornetq-sample-app hornetq-spring-boot-autoconfigurehornetq-spring-boot-starter.

其中 hornetq-sample-app 是演示如何使用自动配置, hornetq-spring-boot-autoconfigure 是自动配置时的一些逻辑处理, hornetq-spring-boot-starter 比较简单其中只有一些项目的依赖; 比如我们使用的自动配置是针对哪个框架, 以及框架所需要的其它第三方框架都可以放入此工程.

当然可能有人会问到我是否可以将 hornetq-spring-boot-autoconfigurehornetq-spring-boot-starter 模块, 合并到一起? 当然你也可以这样做, 但是我觉得分开的话会逼格高一些.

autoconfigure 模块重点

首先来看一下 pom 文件, 在此文件中有一个最主要的依赖.

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

这个依赖可牛逼了, 此依赖主要有我们要用到的注解和重要的 spring.factories 文件. 当然了此依赖中还有一些其它框架的配置.

下面我们在说一下在自动配置时, 一些重要的注解.

在这个模块中最主要的两个类 HornetQAutoConfigurationHornetQProperties. 我们在配置文件中配置的属性就会封装成 HornetQProperties 对象. 那么怎么知道我们需要哪些配置呢? 当然是使用 @ConfigurationProperties("hornetq") 注解了, 其中 hornetq 是一个前缀. 也可以使用 @Value 注解来帮我们赋值.

如:

hornetq.host="localhost"

hornetq:
    host: "localhost"

前缀可以更详细 spring.hornetq.host

接下来详细说一下 HornetQAutoConfiguration 类中的注解.

@Configuration
@AutoConfigureBefore(JmsAutoConfiguration.class)
@ConditionalOnClass({ConnectionFactory.class, HornetQJMSClient.class})
@ConditionalOnMissingBean(ConnectionFactory.class)
@EnableConfigurationProperties(HornetQProperties.class)
public class HornetQAutoConfiguration {

从上往下一个一个来, @Configuration 注解表示一个配置类.

如果我们的自动配置需要等待某个对象配置完成, 这个时候可以使用 @AutoConfigureAfter@AutoConfigureBefore 注解, 表明在指定类之后之前配置.

也可以使用
@AutoconfigureOrder 注解, 这个注解类似于
@Order, 但是它是专门给
auto-configuration 使用.

我个人觉得 @ConditionalOnClass 注解非常重要, 注解主要在 classpath 目录下存在时指定的类时, 才会解析当前配置类. 这也就是为啥我们不附加相应依赖的时候程序还可以运行的原因. 还有一个与此注解逻辑相反的注解 @ConditionalOnMissingClass 当不存在指定类的时候, 才会解析当前配置类.

@ConditionalOnMissingBean 通过实例的类型、类名、注解、昵称去查找是否存在对应的 Bean 如果存在, 则不回去解析. 还有一个与此注解逻辑相反的注解 @ConditionalOnBean 当存在指定 Bean 的时候才会去解析.

@EnableConfigurationProperties 注解是用来开启对 @ConfigurationProperties 注解配置Bean的支持.

在本类下还有一个静态内部类

@Configuration
@ConditionalOnClass(name = EMBEDDED_JMS_CLASS)
@ConditionalOnProperty(prefix = "hornetq.embedded", value = "enabled", havingValue = "true", matchIfMissing = true)
static class EmbeddedServerConfiguration {

@ConditionalOnProperty 注解能够控制某个 configuration 是否生效. 具体操作是通过其两个属性 name 以及 havingValue 来实现的, 其中 name 用来从 application.properties 中读取某个属性值, 如果该值为空则返回false; 如果值不为空, 则将该值与 havingValue 指定的值进行比较, 如果一样则返回 true; 否则返回 false. 如果返回值为false, 则该 configuration 不生效; 为 true 则生效.

value 属性和 name 属性一样都是数组, 但是不能和 name 属性同时使用.

matchIfMissing 判断当没有找到 enabled 时, 是否继续加载. 为 true 则继续加载, 否则报错.

最主要的其实还是 HornetQAutoConfiguration 类上的注解, 大家可以参考官方的项目来写一个属于自己的自动配置类.

spring.factories 文件

在文章发布后重新阅读了一下文章, 发现忘了写此文件的作用.

spring.factories 文件主要的作用就是让 Spring Boot 来自动配置相关类.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=hornetq.autoconfigure.HornetQAutoConfiguration

文件路径 src/main/resources/META-INF/spring.factories

    原文作者:sc_ik
    原文地址: https://segmentfault.com/a/1190000017137761
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞