SpringBoot自定义start详细图文教程
作者:程序猿进阶
一、Mybatis 实现 start 的原理
首先在写一个自定义的start
之前,我们先参考下Mybatis
是如何整合SpringBoot:mybatis-spring-boot-autoconfigure
依赖包:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
mybatis
依赖包展示: 重要文件:spring.factories
、MybatisAutoConfiguration
、MybatisProperties
:::tip
starters 命名:Spring Boot 官方的启动器都是以 spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以 spring-boot开头命名,它们都被 Spring Boot官方保留。一般第三方应该这样命名,像 mybatis 的 mybatis-spring-boot-starter。
:::
【1】查看spring.factories
文件: 配置自动配置类MybatisAutoConfiguration
。spring.factories
会引导springboot
哪个是自动配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
【2】进入MybatisAutoConfiguration.class
类:下面@EnableConfigurationProperties(MybatisProperties.class)
引入了配置文件MybatisProperties.class
。之后就可以利用这个配置文件里的参数实例化一个对象完成整个mybatis
的创建。
在 Spring开发过程中我们常使用到 @ConfigurationProperties注解,通常是用来将 properties和 yml配置文件属性转化为 Bean对象使用和修改。在获取这些 Bean之前,首先需要使用 @EnableConfigurationProperties({ConfigBean.class}) 注解的作用是开启 @ConfigurationProperties注解,当满足 Condition 条件的时候才执行。
@Configuration @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) @ConditionalOnBean({DataSource.class}) /** * @ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的, * 而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。 * 如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的。 */ @EnableConfigurationProperties({MybatisProperties.class}) @AutoConfigureAfter({DataSourceAutoConfiguration.class}) public class MybatisAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class); private final MybatisProperties properties; private final Interceptor[] interceptors; private final ResourceLoader resourceLoader; private final DatabaseIdProvider databaseIdProvider; private final List<ConfigurationCustomizer> configurationCustomizers; public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) { this.properties = properties; this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable(); this.resourceLoader = resourceLoader; this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable(); this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable(); } //...... }
【3】进入 MybatisProperties: 这里所有的属性,就是之后我们在properties
配置文件中配置的项,而@ConfigurationProperties(prefix = "mybatis")
定义了前缀。举个栗子:我们一般会在application.yml
或者application.properties
中xml
映射文件的路径:mybatis.mapperLocations=classpath:mapping/*.xml
就是以mybatis
作为前缀的。
mybatis
正是这个MybatisProperties
的@ConfigurationProperties
配置的前缀而mapperLocations
就是我们这个MybatisProperties.class
的其中一个成员变量 !
@ConfigurationProperties( prefix = "mybatis" ) public class MybatisProperties { public static final String MYBATIS_PREFIX = "mybatis"; private String configLocation; private String[] mapperLocations; private String typeAliasesPackage; private String typeHandlersPackage; private boolean checkConfigLocation = false; private ExecutorType executorType; private Properties configurationProperties; @NestedConfigurationProperty private Configuration configuration; public MybatisProperties() { } //...... }
【4】现在来看最后一个问题:spring.factories
文件什么时候加载,我们定位到我们的启动类,进入@SpringBootApplication
注解,点进去之后是一个@EnableAutoConfiguration
注解,再点进去可以看到一个叫做AutoConfigurationImportSelector.class
的类,就是这里了再点进去,在这个类的源码里搜索spring.factories
原来springboot
会去META-INF
目录下找到这个spring.factories
文件,到现在为止我们已经理清楚了整个start
加载的流程:
【1】去META-INF
目录下找到这个spring.factories
文件;
【2】通过文件内指定的类路径,找到配置类;
【3】配置类加载进属性类;
【4】配置类通过属性类的参数构建一个新的Bean
;
二、用户自定义 start
就按照这个Mybatis
的格式,自己写一个redis
的start
由于spring.factories
是指定入口的我们可以放在最后写。下面创建一个普通的springboot
工程。
【1】编写属性类: 添加@ConfigurationProperties
注解和前缀redis
。之后我们就可以在properties
或yml
中 使用redis.port=
指定参数了;
@ConfigurationProperties(prefix = "redis") public class RedisProperties { private Integer port; private String host; private String password; private int index; //省略了get set 方法 }
【2】编写配置类: 添加配置类注解 @Configuration 和加载条件,以及 @EnableConfigurationProperties(RedisProperties.class) 引入属性类,注入到 IOC 容器中。
@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
目录下创建入口文件,编写内容:指定配置文件的全路径。随后通过mvn install
打到本地仓库。
org.springframework.boot.autoconfigure.EnableAutoConfiguration =com.yintong.myjedis.RedisAutoConfiguration
【4】测试: 然后我们新建一个springboot
项目,在pom
中加入依赖:
<dependency> <groupId>com.yintong</groupId> <artifactId>redis-start</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
【5】测试类: @Resource
的作用相当于@Autowired
,只不过@Autowired
按byType
自动注入,而@Resource
默认按byName
自动注入罢了。下面如果你能成功输出就成功了!
@RunWith(SpringRunner.class) @SpringBootTest public class TestStartApplicationTests { @Resource private Jedis jedis; @Test public void contextLoads() { jedis.set("test","测试成功"); String test = jedis.get("test"); System.out.println(test); } }
总结
到此这篇关于SpringBoot自定义start的文章就介绍到这了,更多相关SpringBoot自定义start内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!