本文主要是介绍第三章 实现自己的Spring Boot Starter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、properties和yml配置
- 1.1 IDEA 中Spring Boot的的配置文件
- 1.2 配置文件提示来源
- 二、Starter结构
- 2.1 Jar包结构
- 2.1.1 官方starter - Thymeleaf
- 2.1.1.1 starter
- 2.1.1.2 autoconfigure
- 2.1.2 非官方starter - Mybatis
- 2.1.2.1 starter
- 2.1.2.2 autoconfigure
- 2.2 配置和代码实现(Mybatis为例)
- 2.2.1 依赖配置
- 2.2.2 properties或者yml约定配置
- 2.2.2.1 注解解释
- 2.2.2.2 Mybatis约定数据注入
- 2.2.2.3 spring.factories文件配置
- 2.2.2.4 配置类实现
- 2.2.2.5 效果
- 三、实现自己的starter
- 3.1 创建被starter自动配置的类
- 3.2 创建starter自动配置父工程
- 3.3 创建starter子工程
- 3.4 创建autoconfigure子工程
- 3.5 打包到本地库 或者远程库
- 3.6 测试
- 总结
前言
上一章介绍了SpringBoot的四大组件:starter, autoconfigure, CLI 以及actuator。
本章我们就来揭开Spring Boot starter和autoconfigure的神秘面纱。Let’s go…
注意:
前两章都提到过,Spring Boot的一大作用就是组件的自动配置
(就是把相关Bean注入Spring 容器中)。
而自动配置的实现是基于我们今天说的starter来实现的,每个组件对应一个starter。
如果非要说直白一点,starter就是给实际的包画了个妆
一、properties和yml配置
1.1 IDEA 中Spring Boot的的配置文件
咦,IDEA中的配置文件居然可以自动提示,它是怎么做到的?难道是把Spring Boot的配置都缓存了一遍到自己的软件中嘛?如果这样的话那我们自己的配置怎么提示?
草率了吧,我可以很明确的告诉你,不是IDEA缓存的
,不是,不是。。。
下面我们看看他到底是哪里来的?
1.2 配置文件提示来源
看到这个图是不是一下恍然大悟,没错,它就是去这个叫做autoconfigure的jar包中的META-INFO/spring-configuration-metadata.json
文件中获取的。
先别管我们写这么一个json文件会不会累死,我们先看看这个starter结构,我们写一个starter会不会累死。
二、Starter结构
2.1 Jar包结构
一个完整的starter都会有两个jar包: starter
和 autoconfigure
。
starter
包无代码,只有相关依赖管理的pom文件。
autoconfigure
包含Spring Boot需要的配置文件(META-INFO)& 自动配置实现的Java代码。
下面我们就看一个官方的Thymeleaf starter - Thymeleaf
和 一个非官方的mybatis starter - Mybatis
。
2.1.1 官方starter - Thymeleaf
2.1.1.1 starter
命名方式:spring-boot-starter-xxx
那么这么问题就来了,这里为啥没有配置文件呢?
这里划重点:因为这是Maven仓库的包结构,可以在仓库中看到POM文件。
2.1.1.2 autoconfigure
命名方式:spring-boot-xxx-autoconfigure
下面两张图假装拼起来,因为太长了
这里又有重点,划好,要考:
这里之所以没有所谓的spring-boot-thymeleaf-autoconfigure是因为官方把一些基础的配置都写到了公共的配置spring-boot-autoconfigure包中
,不要问为什么,问就是开发者乐意。
2.1.2 非官方starter - Mybatis
2.1.2.1 starter
命名方式:xxx-spring-boot-starter
xxx在前头,这是非官方的starter的命名格式
2.1.2.2 autoconfigure
命名方式:xxx-spring-boot-autoconfigure
xxx在前头,这是非官方的starter的命名格式
2.2 配置和代码实现(Mybatis为例)
2.2.1 依赖配置
版本在父工程中定义了,我们自己使用中可以覆盖。
还有一个重要的依赖:
<!-- @ConfigurationProperties annotation processing (metadata for IDEs) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
这个依赖是在autoconfigure使用的,注释写的很明白,就是解析@ConfigurationProperties注解描述的元数据信息给IDE识别,即文章开始时候的json文件。
注意:官方的starter的版本信息都在spring-boot-dependencies包中配置,可自行查看
2.2.2 properties或者yml约定配置
2.2.2.1 注解解释
该部分在下面碰到再回来看其用法和意义:
@ConfigurationProperties(prefix = "xxx.xxxx")
匹配以xxx.xxxx开头的properties或者yml约定到此类中。@EnableAutoConfiguration
自动扫描所有starter中的spring.factories中配置的Configuration,并初始化其中的Bean实例。@Configuration
声明该类为配置类@ConditionalOnClass({ Xxx.class })
Conditional(条件),Class存在生效@ConditionalOnBean(Xxx.class)
实例存在生效@EnableConfigurationProperties(XxxProperties.class)
开启配置文件中约定读取的实体@AutoConfigureAfter(Xxx.class)
在Xxx配置类初始化完成后初始化本类@Bean
与@Configuration配合创建实例到Spring容器@ConditionalOnMissingBean
该实例不存在生效
2.2.2.2 Mybatis约定数据注入
Mybatis的约定接收实体类:
该类就是接收properties或者yml配置的约定。以上图中的configLocation为例:
mybatis:config-location: classpath:mapper/*.xml
注意:
- 命名匹配为驼峰(Java) <——> 中划线
如上例
- Object和List的配置方式参考:yaml语法
2.2.2.3 spring.factories文件配置
注意:
- spring.factories是 k - v 结构;
- k是注解全限定名;
- v是注解扫描的包的全限定名.多个用逗号隔开
Spring Boot就是读取这个文件来知道该starter中需要初始化些什么实例到Spring容器(具体的扫描逻辑后续在启动逻辑中讲)。
然后最重要的就是spring.factories中的EnableAutoConfiguration注解指定类的实现 - 实现需要配置实例的初始化
。
2.2.2.4 配置类实现
@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {/*** 使用yml文件中约定。以MybatisProperties 接收,参考2.2.2.1*/private final MybatisProperties properties;/*** 创建SqlSessionFactory Bean实例*/@Bean@ConditionalOnMissingBeanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{....// 省略实现}//省略其他...
}
2.2.2.5 效果
只需要依赖mybatis starter并且配置数据源约定就可以直接使用SqlSessionFactory Bean实例。参考第一章的应用。
三、实现自己的starter
本章所有涉及到的代码地址:Starter & 测试工程 & 第三方组件
3.1 创建被starter自动配置的类
这里就不一步一步创建了,不会创建项目的参考第一章
pom文件:
3.2 创建starter自动配置父工程
这里就截图了,代码在文章结尾会有地址,自行下载。
创建父工程就是创建一个工程把除了pom文件全部删掉就行了。
POM文件内容:
注意:上面的子工程在使用IDEA创建子工程的时候会自动配置。
3.3 创建starter子工程
创建方式(IDEA):鼠标右键父工程 -> new -> Module
搞定。
工程结构:
POM内容:
OK,事情已经完成了一大半!
3.4 创建autoconfigure子工程
工程结构:
POM内容:
什么都不需要依赖
配置实体
/*** 接收约定配置信息的类*/
@ConfigurationProperties("demo")
public class DemoProperties {private boolean enable;private String demoInfo;
}
配置自动配置类
实现自动配置类
@Configuration //声明为配置类
@ConditionalOnClass(DemoService.class) //当类存在时候初始化该实例
@ConditionalOnProperty("demo.enable") //当约定配置存在初始化该实例
@EnableConfigurationProperties(DemoProperties.class) //开启约定配置类
public class DemoAutoConfiguration {@Autowiredprivate DemoProperties properties;/*** @Bean 初始化 DemoService 实例* @return */@Beanpublic DemoService exec(){return new DemoService(properties.getDemoInfo());}}
3.5 打包到本地库 或者远程库
执行打包命令:
mvn clean install
查看包,上面介绍到的东西都有了:
3.6 测试
使用第一章的工程来测试:
- 添加依赖
-
添加配置
-
添加接口
- 请求
至此我们就实现了自己的starter用来自动配置第三方组件到系统中。
总结
本章所用到的所有代码在这里:Starter & 测试工程 & 第三方组件
本章主要介绍了Spring Boot的starter和autoconfigure,没明白或者有问题的小伙伴可以留言。下一章: Spring 是怎么启动的
,敬请期待。。。
上一章:Spring Boot四大核心组件
这篇关于第三章 实现自己的Spring Boot Starter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!