介绍
本笔记也是通过官方提供的演示项目来进行讲解.
我们可以看到官方的项目中有三个模块, hornetq-sample-app
hornetq-spring-boot-autoconfigure
和 hornetq-spring-boot-starter
.
其中 hornetq-sample-app
是演示如何使用自动配置, hornetq-spring-boot-autoconfigure
是自动配置时的一些逻辑处理, hornetq-spring-boot-starter
比较简单其中只有一些项目的依赖; 比如我们使用的自动配置是针对哪个框架, 以及框架所需要的其它第三方框架都可以放入此工程.
当然可能有人会问到我是否可以将 hornetq-spring-boot-autoconfigure
和 hornetq-spring-boot-starter
模块, 合并到一起? 当然你也可以这样做, 但是我觉得分开的话会逼格高一些.
autoconfigure 模块重点
首先来看一下 pom
文件, 在此文件中有一个最主要的依赖.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
这个依赖可牛逼了, 此依赖主要有我们要用到的注解和重要的 spring.factories
文件. 当然了此依赖中还有一些其它框架的配置.
下面我们在说一下在自动配置时, 一些重要的注解.
在这个模块中最主要的两个类 HornetQAutoConfiguration
和 HornetQProperties
. 我们在配置文件中配置的属性就会封装成 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