咱们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中。Starter 为咱们带来了众多的自动化配置,有了这些自动化配置,咱们能够不费吹灰之力就能搭建一个生产级开发环境,有的小伙伴会以为这个 Starter 好神奇呀!其实 Starter 也都是 Spring + SpringMVC 中的基础知识点实现的,今天松哥就来带你们本身来撸一个 Starter ,慢慢揭开 Starter 的神秘面纱!java
其实 Starter 的核心就是条件注解 @Conditional
,当 classpath 下存在某一个 Class 时,某个配置才会生效,前面松哥已经带你们学习过很多 Spring Boot 中的知识点,有的也涉及到源码解读,大伙可能也发现了源码解读时老是会出现条件注解,其实这就是 Starter 配置的核心之一,大伙有兴趣能够翻翻历史记录,看看松哥以前写的关于 Spring Boot 的文章,这里我就再也不重复介绍了。git
所谓的 Starter ,其实就是一个普通的 Maven 项目,所以咱们自定义 Starter ,须要首先建立一个普通的 Maven 项目,建立完成后,添加 Starter 的自动化配置类便可,以下:github
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
复制代码
配置完成后,咱们首先建立一个 HelloProperties 类,用来接受 application.properties 中注入的值,以下:spring
@ConfigurationProperties(prefix = "javaboy")
public class HelloProperties {
private static final String DEFAULT_NAME = "江南一点雨";
private static final String DEFAULT_MSG = "牧码小子";
private String name = DEFAULT_NAME;
private String msg = DEFAULT_MSG;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
复制代码
这个配置类很好理解,将 application.properties 中配置的属性值直接注入到这个实例中, @ConfigurationProperties
类型安全的属性注入,即将 application.properties 文件中前缀为 javaboy 的属性注入到这个类对应的属性上, 最后使用时候,application.properties 中的配置文件,大概以下:后端
javaboy.name=zhangsan
javaboy.msg=java
复制代码
关注类型安全的属性注入,读者能够参考松哥以前的这篇文章:Spring Boot中的yaml配置简介,这篇文章虽然是讲 yaml 配置,可是关于类型安全的属性注入和 properties 是同样的。安全
配置完成 HelloProperties 后,接下来咱们来定义一个 HelloService ,而后定义一个简单的 say 方法, HelloService 的定义以下:app
public class HelloService {
private String msg;
private String name;
public String sayHello() {
return name + " say " + msg + " !";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
这个很简单,没啥好说的。框架
接下来就是咱们的重轴戏,自动配置类的定义,用了不少别人定义的自定义类以后,咱们也来本身定义一个自定义类。先来看代码吧,一会松哥再慢慢解释:前后端分离
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
HelloService helloService() {
HelloService helloService = new HelloService();
helloService.setName(helloProperties.getName());
helloService.setMsg(helloProperties.getMsg());
return helloService;
}
}
复制代码
关于这一段自动配置,解释以下:spring-boot
作完这一步以后,咱们的自动化配置类就算是完成了,接下来还须要一个 spring.factories 文件,那么这个文件是干吗的呢?你们知道咱们的 Spring Boot 项目的启动类都有一个 @SpringBootApplication 注解,这个注解的定义以下:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM,
classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
复制代码
你们看到这是一个组合注解,其中的一个组合项就是 @EnableAutoConfiguration ,这个注解是干吗的呢?
@EnableAutoConfiguration 表示启用 Spring 应用程序上下文的自动配置,该注解会自动导入一个名为 AutoConfigurationImportSelector 的类,而这个类会去读取一个名为 spring.factories 的文件, spring.factories 中则定义须要加载的自动化配置类,咱们打开任意一个框架的 Starter ,都能看到它有一个 spring.factories 文件,例如 MyBatis 的 Starter 以下:
那么咱们自定义 Starter 固然也须要这样一个文件,咱们首先在 Maven 项目的 resources 目录下建立一个名为 META-INF 的文件夹,而后在文件夹中建立一个名为 spring.factories 的文件,文件内容以下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.javaboy.mystarter.HelloServiceAutoConfiguration
复制代码
在这里指定咱们的自动化配置类的路径便可。
如此以后咱们的自动化配置类就算完成了。
若是在公司里,大伙可能须要将刚刚写好的自动化配置类打包,而后上传到 Maven 私服上,供其余同事下载使用,我这里就简单一些,我就不上传私服了,我将这个自动化配置类安装到本地仓库,而后在其余项目中使用便可。安装方式很简单,在 IntelliJ IDEA 中,点击右边的 Maven Project ,而后选择 Lifecycle 中的 install ,双击便可,以下:
双击完成后,这个 Starter 就安装到咱们本地仓库了,固然小伙伴也可使用 Maven 命令去安装。
接下来,咱们来新建一个普通的 Spring Boot 工程,这个 Spring Boot 建立成功以后,加入咱们自定义 Starter 的依赖,以下:
<dependency>
<groupId>org.javaboy</groupId>
<artifactId>mystarter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
复制代码
此时咱们引入了上面自定义的 Starter ,也即咱们项目中如今有一个默认的 HelloService 实例可使用,并且关于这个实例的数据,咱们还能够在 application.properties 中进行配置,以下:
javaboy.name=牧码小子
javaboy.msg=java
复制代码
配置完成后,方便起见,我这里直接在单元测试方法中注入 HelloSerivce 实例来使用,代码以下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UsemystarterApplicationTests {
@Autowired
HelloService helloService;
@Test
public void contextLoads() {
System.out.println(helloService.sayHello());
}
}
复制代码
执行单元测试方法,打印日志以下:
好了,一个简单的自动化配置类咱们就算完成了,是否是很简单!
本文主要带领小伙伴本身徒手撸一个 Starter ,使用这种方式帮助你们揭开 Starter 的神秘面纱!大伙有问题能够留言讨论。
本文的案例,松哥已经上传到 GitHub上了,地址:github.com/lenve/javab… 。
关注公众号【江南一点雨】,专一于 Spring Boot+微服务以及先后端分离等全栈技术,按期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!