实现自定义的springboot start

spring boot 中有很多的start 比如 mybatis-spring-boot-starter ,就可以引入mybatis 的依赖,其实我们可以构建自己的start

本文代码地址

链接:https://pan.baidu.com/s/1ACSxwvf-lkDAcE9QB5jyww
提取码:5hfy

文章目录

  • sring boot start 分析
  • 实现自己的start
    • 1. 编写属性类
    • 2. 编写配置类
    • 3. 编写spring.factories 文件
    • 测试

sring boot start 分析

就上述的 mybatis 的start来看,看一下我们引入的依赖
实现自定义的springboot start_第1张图片
重点注意下 红圈圈里的 三个文件
首先看 spring.factories 这个文件
在这里插入图片描述
可以看到 参数就是 下面的 这个 MybatisAutoConfiguration.class 这个spring.factories 文件也就是如此,他会引导springboot 哪个是自动配置类

下面看一下 另一个文件 MybatisProperties.class
实现自定义的springboot start_第2张图片
文件内容很多,就不全部截取了如果你对mybatis配置熟悉的话,应该能发现 这里所有的项,就是之后我们在 properties 配置文件中配置的项,而 @ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX) 定义了前缀
举个例子
以前我们会在propeeties 文件中写

mybatis.mapperLocations=classpath:mapping/*.xml

来指定mybatis 的xml文件的位置
注意下 mybatis 正是这个 MybatisProperties@ConfigurationProperties 配置的前缀
mapperLocations 就是 我们这个 MybatisProperties.class 的其中一个成员变量 !

最后来看 MybatisAutoConfiguration.class
实现自定义的springboot start_第3张图片
上面@EnableConfigurationProperties(MybatisProperties.class) 引入了我们刚才讲的那个配置文件

之后就可以利用这个配置文件里的参数实例化 一个对象完成整个mybatis 的创建。

现在来看最后一个问题刚开始的入口 spring.factories 文件是哪里来的呢,
我们定位到我们的启动类 ,上面有一个 @SpringBootApplication 注解,点进去
之后是一个 @EnableAutoConfiguration 注解 在点进去
在这里插入图片描述
你可以看到一个叫做 AutoConfigurationImportSelector.class 的类,就是这里了 再点进去,在这个类的源码里搜索
spring.factories

实现自定义的springboot start_第4张图片
看到这句话了吗,原来springboot 会去 META-INF 目录下找到这个spring.factories文件!

到现在为止我们已经理清楚了整个start 加载的流程:

1、去META-INF 目录下找到这个spring.factories文件
2、通过 文件内指定的类路径,找到 配置类
3、配置类加载进 属性类
4、配置类通过属性类的参数构建一个新的bean

实现自己的start

明白了原理,就可以依葫芦画瓢了,我们现在就按照这个mybatis 的格式,自己写一个 redis 的 start

由于spring.factories 是指定入口的 我们放在最后写
下面创建一个普通的springboot 工程 什么都不用加

1. 编写属性类

@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
    private Integer port;
    private String host;
    private String password;
    private int index;
	//省略了get set 方法
}

之后我们就可以在properties 中 使用 redis.port=这样子来指定参数了

2. 编写配置类

@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;
    }
}

3. 编写spring.factories 文件

在这里插入图片描述
在resources 目录下创建入口文件,编写内容

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);
    }
}

如果你能成功输出 大肥猪 的话就成功了!

你可能感兴趣的:(java开发)