SpringBoot自定義start詳細(xì)圖文教程
一、Mybatis 實現(xiàn) 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-命名的,代表了一個特定的應(yīng)用類型。第三方的啟動器不能以 spring-boot開頭命名,它們都被 Spring Boot官方保留。一般第三方應(yīng)該這樣命名,像 mybatis 的 mybatis-spring-boot-starter。
:::
【1】查看spring.factories文件: 配置自動配置類MybatisAutoConfiguration。spring.factories會引導(dǎo)springboot哪個是自動配置類。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
【2】進(jìn)入MybatisAutoConfiguration.class類:下面@EnableConfigurationProperties(MybatisProperties.class)引入了配置文件MybatisProperties.class。之后就可以利用這個配置文件里的參數(shù)實例化一個對象完成整個mybatis的創(chuàng)建。
在 Spring開發(fā)過程中我們常使用到 @ConfigurationProperties注解,通常是用來將 properties和 yml配置文件屬性轉(zhuǎn)化為 Bean對象使用和修改。在獲取這些 Bean之前,首先需要使用 @EnableConfigurationProperties({ConfigBean.class}) 注解的作用是開啟 @ConfigurationProperties注解,當(dāng)滿足 Condition 條件的時候才執(zhí)行。
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
/**
* @ConfigurationProperties注解主要用來把properties配置文件轉(zhuǎn)化為bean來使用的,
* 而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。
* 如果只配置@ConfigurationProperties注解,在IOC容器中是獲取不到properties配置文件轉(zhuǎn)化的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】進(jìn)入 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】現(xiàn)在來看最后一個問題:spring.factories文件什么時候加載,我們定位到我們的啟動類,進(jìn)入@SpringBootApplication注解,點進(jìn)去之后是一個@EnableAutoConfiguration注解,再點進(jìn)去可以看到一個叫做AutoConfigurationImportSelector.class的類,就是這里了再點進(jìn)去,在這個類的源碼里搜索spring.factories

原來springboot會去META-INF目錄下找到這個spring.factories文件,到現(xiàn)在為止我們已經(jīng)理清楚了整個start加載的流程:
【1】去META-INF目錄下找到這個spring.factories文件;
【2】通過文件內(nèi)指定的類路徑,找到配置類;
【3】配置類加載進(jìn)屬性類;
【4】配置類通過屬性類的參數(shù)構(gòu)建一個新的Bean;
二、用戶自定義 start
就按照這個Mybatis的格式,自己寫一個redis的start由于spring.factories是指定入口的我們可以放在最后寫。下面創(chuàng)建一個普通的springboot工程。
【1】編寫屬性類: 添加@ConfigurationProperties注解和前綴redis。之后我們就可以在properties或yml中 使用redis.port=指定參數(shù)了;
@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
//只有當(dāng)Jedis 存在的時候 才執(zhí)行,就是說一定要引入了Jedis的依賴才會執(zhí)行這個配置
@ConditionalOnClass(Jedis.class)
//引入屬性類
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
@Bean
//當(dāng)這個bean不存在的時候才執(zhí)行,防止重復(fù)加載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目錄下創(chuàng)建入口文件,編寫內(nèi)容:指定配置文件的全路徑。隨后通過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的作用相當(dāng)于@Autowired,只不過@Autowired按byType自動注入,而@Resource默認(rèn)按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);
}
}總結(jié)
到此這篇關(guān)于SpringBoot自定義start的文章就介紹到這了,更多相關(guān)SpringBoot自定義start內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring boot 自定義starter的實現(xiàn)教程
- springboot自定義Starter的具體流程
- Spring boot創(chuàng)建自定義starter的完整步驟
- spring boot微服務(wù)自定義starter原理詳解
- springboot自定義starter實現(xiàn)過程圖解
- springboot自定義redis-starter的實現(xiàn)
- SpringBoot自動配置之自定義starter的實現(xiàn)代碼
- 使用SpringBoot自定義starter的完整步驟
- Java SpringBoot自定義starter詳解
- SpringBoot如何自定義starter
相關(guān)文章
IntelliJ IDEA設(shè)置Tabs實現(xiàn)同時打開多個文件且分行顯示
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置Tabs實現(xiàn)同時打開多個文件且分行顯示,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
java?CompletableFuture異步任務(wù)編排示例詳解
這篇文章主要為大家介紹了java?CompletableFuture異步任務(wù)編排示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié)
今天小編就為大家分享一篇關(guān)于Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
Mybatis注解實現(xiàn)多數(shù)據(jù)源讀寫分離詳解
這篇文章主要給大家介紹了關(guān)于Mybatis注解實現(xiàn)多數(shù)據(jù)源讀寫分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
spring中@Autowire和@Resource的區(qū)別在哪里(推薦)
這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
Java定時任務(wù):利用java Timer類實現(xiàn)定時執(zhí)行任務(wù)的功能
本篇文章主要介紹了利用java Timer類實現(xiàn)定時執(zhí)行任務(wù)的功能,具有一定的參考價值,有需要的可以了解一下。2016-11-11

