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微服务入门、实战与进阶》
892

被折叠的 条评论
为什么被折叠?



