spring boot 中有很多的start 比如
mybatis-spring-boot-starter
,就可以引入mybatis 的依赖,其实我们可以构建自己的start
本文代码地址
链接:https://pan.baidu.com/s/1ACSxwvf-lkDAcE9QB5jyww
提取码:5hfy
就上述的 mybatis 的start来看,看一下我们引入的依赖
重点注意下 红圈圈里的 三个文件
首先看 spring.factories
这个文件
可以看到 参数就是 下面的 这个 MybatisAutoConfiguration.class
这个spring.factories
文件也就是如此,他会引导springboot 哪个是自动配置类
下面看一下 另一个文件 MybatisProperties.class
文件内容很多,就不全部截取了如果你对mybatis配置熟悉的话,应该能发现 这里所有的项,就是之后我们在 properties 配置文件中配置的项,而 @ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
定义了前缀
举个例子
以前我们会在propeeties 文件中写
mybatis.mapperLocations=classpath:mapping/*.xml
来指定mybatis 的xml文件的位置
注意下 mybatis 正是这个 MybatisProperties
的 @ConfigurationProperties
配置的前缀
而 mapperLocations
就是 我们这个 MybatisProperties.class
的其中一个成员变量 !
最后来看 MybatisAutoConfiguration.class
上面@EnableConfigurationProperties(MybatisProperties.class)
引入了我们刚才讲的那个配置文件
之后就可以利用这个配置文件里的参数实例化 一个对象完成整个mybatis 的创建。
现在来看最后一个问题刚开始的入口 spring.factories 文件是哪里来的呢,
我们定位到我们的启动类 ,上面有一个 @SpringBootApplication 注解,点进去
之后是一个 @EnableAutoConfiguration
注解 在点进去
你可以看到一个叫做 AutoConfigurationImportSelector.class
的类,就是这里了 再点进去,在这个类的源码里搜索
spring.factories
看到这句话了吗,原来springboot 会去 META-INF 目录下找到这个spring.factories文件!
到现在为止我们已经理清楚了整个start 加载的流程:
1、去META-INF 目录下找到这个spring.factories文件
2、通过 文件内指定的类路径,找到 配置类
3、配置类加载进 属性类
4、配置类通过属性类的参数构建一个新的bean
明白了原理,就可以依葫芦画瓢了,我们现在就按照这个mybatis 的格式,自己写一个 redis 的 start
由于spring.factories 是指定入口的 我们放在最后写
下面创建一个普通的springboot 工程 什么都不用加
@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
private Integer port;
private String host;
private String password;
private int index;
//省略了get set 方法
}
之后我们就可以在properties 中 使用 redis.port=
这样子来指定参数了
@Configuration
//只有当Jedis 存在的时候 才执行,就是说一定要引入了Jedis的依赖才会执行这个配置
@ConditionalOnClass(Jedis.class)
//引入属性类
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
@Bean
//当这个bean不存在的时候才执行,防止重复加载bean
@ConditionalOnMissingBean
public Jedis jedis(RedisProperties redisProperties) {
Jedis jedis = new Jedis(redisProperties.getHost(), redisProperties.getPort());
jedis.auth(redisProperties.getPassword());
jedis.select(redisProperties.getIndex());
return jedis;
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=xyz.xiezihao.myjedis.RedisAutoConfiguration
ok,现在代码已经全部写好了 mvn install 打到本地仓库
然后我们新建一个springboot项目,在pom中加入依赖
<dependency>
<groupId>xyz.xiezihao</groupId>
<artifactId>redis-start</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然后写一个测试文件
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestStartApplicationTests {
@Resource
private Jedis jedis;
@Test
public void contextLoads() {
jedis.set("zhu","大肥猪");
String zhu = jedis.get("zhu");
System.out.println(zhu);
}
}
如果你能成功输出 大肥猪 的话就成功了!