Spring Boot Starter
简介
Spring Boot 通过大量的自动化配置,简化了很多繁琐的工作。对于开发人员来说,可以通过引入各种Spring Boot Starter包,快速搭建出一个项目的脚手架。本文主要针对这种Starter包的架构,进行解析。
架构解析
Spring Boot通过,参数配置类
,核心服务类
,构建类
,类扫描配置文件
,自动构建注解类
,内容提示配置文件
,这些类与配置的协调工作,实现了自动配置功能。
参数配置类
:实现了对服务配置参数的引入。
核心服务类
:使用参数配置类
引入的参数,对外提供了该Starter包实现的功能服务。
构建类
:将参数配置类
、核心服务类
组织在一起,并实例化核心服务类
,完成对象构建。
类扫描配置文件
:Spring Boot将会读取这个文件,去扫描文件中指定的构建类
,完成构建类
的实例化,并注入到Spring IOC容器中。如果使用这种方式,在项目引入Starter包时,就会完成对服务初始化的逻辑。
自动构建注解类
:如果想要用户自己控制是否开启自动构建功能,就不能使用类扫描配置文件了
。使用注解的方式导入构建类
,实现了服务的自主可控。
内容提示配置文件
:该文件实现对配置文件的内容项进行提示,与核心服务无关。
实现自定义Spring Boot Starter
类图设计
代码实现
用户服务参数类UserProperties
使用了lombok
注解省略了getter/setter方法。
@Data
@ConfigurationProperties("spring.user")
public class UserProperties {
private String name;
}
再定义客户端服务类。该类,相当于MongoTemplate
等模板客户端,里面定义了所需要的服务。在本例中,实现了一个获取配置中的值的方法,即getName()
。
public class UserClient {
private UserProperties userProperties;
public UserClient() {
}
public UserClient(UserProperties p) {
this.userProperties = p;
}
public String getName() {
return this.userProperties.getName();
}
}
还需要自动构建类,通过它自动构建所需要的服务。
@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfig {
@Bean
@ConditionOnProperty(prefix = "spring.user", value = "enable", havingValue = "true")
public UserClient userClient(UserProperties userProperties) {
return new UserClient(userProperties);
}
}
Spring Boot 会默认扫描跟启动类平级的包,如果Starter和启动类不在同一个主包下,就需要在resources
下创建一个META-INF
文件夹,然后再在文件夹下创建一个spring.factories
文件,在文件中指定自动构建类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.UserAutoConfig
Spring Boot 启动时会读取spring.factories
文件,然后根据配置激活对应的自动构建类。
到目前为止,Starter包的主体功能已经实现。
如果需要实现使用注解选择是否开启Starter包,类似于@EnableAsync
这个注解的功能,就需要添加一个注解类。在这种情况下,不需要添加spring.factories
文件。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({UserAutoConfig.class})
public @interface EnableUserClient {
}
这段代码的核心就是通过@Import({UserAutoConfig.class})
,以导入的方式,实现把UserAutoConfig
示例加入到SpringIOC容器中,从而开启自动构建。
内容提示配置文件,它的作用是,方便开发者在配置参数时,对相应参数的键值对进行提示。是属于使用优化的内容。
在META-INF
文件夹下创建spring-configuration-metadata.json
文件,代码示例如下:
{
"properties":[
{
"name": "spring.user.name",
"defaultValue": "example"
},
{
"name": "spring.user.enabled",
"type": "java.lang.Boolean",
"defaultValue": "false"
}
]
}
思考
Spring Boot Starter的整体架构十分简单,通过配置化参数、构建类,实现自动配置的功能。
在开发项目时,可以学习使用。将某些独立模块服务,通过这种架构,形成一个Starter包。其他项目模块在需要这种服务时,直接引入即可使用,十分便利。
代码引用自《Spring Cloud微服务入门、实战与进阶》