前言
上周看了一篇。你一直在用的Spring Boot Starters究竟是怎么回事(https://www.cnblogs.com/fengzheng/p/10947585.html)
感觉终于把所有知识都串在一起了,可能还有些地方比较朦胧,但真相感觉就在眼前,只是随时时间的推移罢了。
Starters
开始之前,我们要理解一下 spring boot starter 是什么呢?
实际上 starter 并不会包含多少功能代码,我们可以把它理解成一个「连接包」,按照这个概念来说:
它首先是一个包,一个集合,它把需要用的其他功能组件囊括进来,放到自己的 pom 文件中。
然后它是一个连接,把它引入的组件和我们的项目做一个连接,并且在中间帮我们省去复杂的配置,力图做到使用最简单。
比如mybatis-spring-boot-starter,他就是对mybatis的一个封装
druid-spring-boot-starter,就是对druid的一个封装
Starters的原理
命名:
也就是我们使用它的时候在 pom 中引用的 artifactId。命名有有规则的,官方规定:
官方的 starter 的命名格式为 spring-boot-starter-{name} ,例如上面提到的 spring-boot-starter-actuator。
非官方的 starter 的命名格式为 {name}-spring-boot-starter
Spring.factories
在 resource/META-INF 目录下创建名称为 spring.factories 的文件,为什么在这里?当 Spring Boot 启动的时候,会在 classpath 下寻找所有名称为 spring.factories 的文件,然后运行里面的配置指定的自动加载类,将指定类(一个或多个)中的相关 bean 初始化。
例如本例中的配置信息是这样的:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.springcloud.boot.starter.example.RedisAutoConfigure
等号前面是固定的写法,后面就是我们自定义的自动配置类了,如果有多个的话,用英文逗号分隔开。
public class RedisAutoConfiguration { @Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
RedisProperties
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties { private int database = 0; private String url; private String host = "localhost";
}
从这里,知识点基本一下子就串起来了。
- 在spring.factories里面配置xxxAutoConfigure。利用了Java的SPI,项目一启动就把configure加载进来。
- 在RedisAutoConfiguration里面注入了RedisTemplate的bean。这个bean是对Reids一些常用的操作进行封装。(这里注意一下condition的用法)
- 最后编写RedisProperties把常用的信息封装一个,可以在properties文件里面配置,非常的方便。