Spring Boot Starter 机制详解

Spring Boot Starter

简介

Spring Boot 通过大量的自动化配置,简化了很多繁琐的工作。对于开发人员来说,可以通过引入各种Spring Boot Starter包,快速搭建出一个项目的脚手架。本文主要针对这种Starter包的架构,进行解析。

架构解析

Spring Boot通过,参数配置类核心服务类构建类类扫描配置文件自动构建注解类内容提示配置文件,这些类与配置的协调工作,实现了自动配置功能。
参数配置类:实现了对服务配置参数的引入。
核心服务类:使用参数配置类引入的参数,对外提供了该Starter包实现的功能服务。
构建类:将参数配置类核心服务类组织在一起,并实例化核心服务类,完成对象构建。
类扫描配置文件:Spring Boot将会读取这个文件,去扫描文件中指定的构建类,完成构建类的实例化,并注入到Spring IOC容器中。如果使用这种方式,在项目引入Starter包时,就会完成对服务初始化的逻辑。
自动构建注解类:如果想要用户自己控制是否开启自动构建功能,就不能使用类扫描配置文件了。使用注解的方式导入构建类,实现了服务的自主可控。
内容提示配置文件:该文件实现对配置文件的内容项进行提示,与核心服务无关。

实现自定义Spring Boot Starter

类图设计

UserProperties 用户服务参数配置类 UserClient 用户服务类 UserAutoConfig 服务自动构建类 «interface» EnableUserClient 注解构建开启类

代码实现

用户服务参数类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微服务入门、实战与进阶》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值