最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義start詳細(xì)圖文教程

 更新時間:2023年11月30日 08:25:34   作者:程序猿進(jìn)階  
這篇文章主要給大家介紹了關(guān)于SpringBoot自定義start的相關(guān)資料,主要講述如何自定義start,實現(xiàn)一些自定義類的自動裝配,文中通過代碼介紹的非常詳細(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.propertiesxml映射文件的路徑: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的格式,自己寫一個redisstart由于spring.factories是指定入口的我們可以放在最后寫。下面創(chuàng)建一個普通的springboot工程。

【1】編寫屬性類: 添加@ConfigurationProperties注解和前綴redis。之后我們就可以在propertiesyml中 使用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,只不過@AutowiredbyType自動注入,而@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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA設(shè)置Tabs實現(xiàn)同時打開多個文件且分行顯示

    IntelliJ IDEA設(shè)置Tabs實現(xiàn)同時打開多個文件且分行顯示

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置Tabs實現(xiàn)同時打開多個文件且分行顯示,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java中雙冒號::的實現(xiàn)示例

    Java中雙冒號::的實現(xiàn)示例

    本文介紹JDK8新特性雙冒號::,它是Java中的方法引用,也是Lambda表達(dá)式寫法之一,能簡化Java開發(fā)冗余代碼,下面還闡述了其6種使用場景,感興趣的可以了解一下
    2026-01-01
  • java?CompletableFuture異步任務(wù)編排示例詳解

    java?CompletableFuture異步任務(wù)編排示例詳解

    這篇文章主要為大家介紹了java?CompletableFuture異步任務(wù)編排示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié)

    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ù)源讀寫分離詳解

    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
  • 一文搞懂Java正則表達(dá)式的使用

    一文搞懂Java正則表達(dá)式的使用

    正則表達(dá)式,又稱規(guī)則表達(dá)式,是一種文本模式。正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串,通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。本文將通過示例為大家詳細(xì)說說Java正則表達(dá)式的使用,感興趣的可以了解一下
    2022-08-08
  • Spring?Security中的CORS詳解

    Spring?Security中的CORS詳解

    CORS(Cross-Origin?Resource?Sharing)是一種允許不同源之間進(jìn)行資源共享的W3C標(biāo)準(zhǔn),它通過在服務(wù)器端設(shè)置特定的HTTP響應(yīng)頭,實現(xiàn)了跨域請求的功能,這種機(jī)制要求瀏覽器和服務(wù)器的支持,本文給大家介紹Spring?Security中的CORS,感興趣的朋友一起看看吧
    2024-10-10
  • spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 純Java代碼實現(xiàn)流星劃過天空

    純Java代碼實現(xiàn)流星劃過天空

    本文給大家介紹純java代碼實現(xiàn)流星劃過天空,包括流星個數(shù),流星飛行的速度,色階,流星大小相關(guān)變量設(shè)置。對java流星劃過天空特效代碼感興趣的朋友可以參考下本文
    2015-10-10
  • Java定時任務(wù):利用java Timer類實現(xiàn)定時執(zhí)行任務(wù)的功能

    Java定時任務(wù):利用java Timer類實現(xiàn)定時執(zhí)行任務(wù)的功能

    本篇文章主要介紹了利用java Timer類實現(xiàn)定時執(zhí)行任務(wù)的功能,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11

最新評論

黔东| 江山市| 安陆市| 神池县| 大荔县| 漳州市| 宾川县| 文水县| 清苑县| 西乡县| 财经| 泾川县| 甘洛县| 巴青县| 南丹县| 雅安市| 文昌市| 龙南县| 沁水县| 大理市| 南溪县| 宜兴市| 长子县| 阳江市| 朔州市| 大悟县| 琼中| 石渠县| 乌兰察布市| 冷水江市| 建水县| 北海市| 马边| 阳谷县| 白沙| 望奎县| 墨玉县| 扬州市| 新郑市| 古丈县| 正安县|