日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Springboot之把外部依賴包納入Spring容器管理的兩種方式

前言

在Spring boot項(xiàng)目中,凡是標(biāo)記有@Component、@Controller、@Service、@Configuration、@Bean等注解的類,Spring boot都會(huì)在容器啟動(dòng)的時(shí)候,自動(dòng)創(chuàng)建bean并納入到Spring容器中進(jìn)行管理,這樣就可以使用@Autowired等注解,在需要使用bean的業(yè)務(wù)類中進(jìn)行注入。這里起到關(guān)鍵作用的就是@ComponentScan,這是一個(gè)bean掃描注解,默認(rèn)掃描的目錄是啟動(dòng)類所在包下的所有包及子包,也就是說凡是標(biāo)記了@Componetn等注解類,Spring boot都會(huì)自動(dòng)創(chuàng)建bean納入Spring容器管理。

問題

一個(gè)問題來了,是什么呢?如果我封裝了一套公共的業(yè)務(wù)組件,也想把些組件類放到Spring容器里,方便在業(yè)務(wù)里注入使用,這時(shí)候應(yīng)該怎么辦呢?

解決方法

最先想到的就是,應(yīng)該就是更新@ComponentScan的掃描路徑了吧,除了這個(gè)還有沒有更好方法呢?答案是有的,且聽我細(xì)細(xì)道來的。

主要是兩種方式:

第一種:Spring.factories

如果了解過Spring boot的自動(dòng)裝配的原理以及如何自定義自己的starter,對(duì)這個(gè)配置文件應(yīng)該會(huì)很熟悉,Spring boot能夠?qū)崿F(xiàn)開箱即用,省去了許多繁瑣的配置,spring-boot-autoconfigure.jar下的/META-INF/spring.factories配置文件起了關(guān)鍵作用。那個(gè)類里有什么呢?仔細(xì)會(huì)發(fā)現(xiàn)spring.factories中配置信息是key-value的形式,key是spring中預(yù)留的擴(kuò)展點(diǎn)配置接口的全限定類名,vlue則是具體的配置類的全限定類名,如果有多個(gè)配置類,則以英文逗號(hào)隔開;

如果公共的業(yè)務(wù)組件封裝好了,就可以在resources目錄下,創(chuàng)建/META-INF/spring.factories配置文件,并實(shí)現(xiàn)Spring預(yù)留的擴(kuò)展點(diǎn)配置接口,使用的時(shí)候引入到項(xiàng)目中,然后在Spring容器啟動(dòng)的時(shí)候,會(huì)讀取classpath下所有的spring.factories中的配置類,然后納入到Spring容器中。當(dāng)然這個(gè)處理過程是很復(fù)雜的,這里不過多展開,我在網(wǎng)上找到了一張圖,可以幫助你很好的理解整個(gè)過程,有興趣的小伙們,不妨根據(jù)圖上內(nèi)容,再結(jié)合spring源碼再深入研究一下。

圖片

第二種:org.springframework.boot.autoconfigure.AutoConfiguration.imports

其實(shí)org.springframework.boot.autoconfigure.AutoConfiguration.imports文件功能和Sping.factories的作用是一樣的,這個(gè)用法是Spring boot2.7以后出現(xiàn)的,目的也是為引入外部的jar,把外部bean納入到Spring容器,實(shí)現(xiàn)外部組件與Spring的集成,主要的區(qū)別在于引入的方式有些不同,spring.factories這種方式是在resources下創(chuàng)建/META-INF/spring.factories配置文件,內(nèi)部是key-value的形式,這種則是創(chuàng)建/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,內(nèi)部是具體的要導(dǎo)入到Spring環(huán)境的中的配置類。

兩種方式有一些區(qū)別,不過都是用來實(shí)現(xiàn)自動(dòng)裝配的。

mybatis與Springboot

SpringBoot和MyBatis的集成主要也是利用了SpringBoot的自動(dòng)配置特性和MyBatis的映射特性。

在SpringBoot中,通過開啟自動(dòng)配置,系統(tǒng)會(huì)在ConfigurationClassPostProcessor這個(gè)BeanFactory的后置處理器中,讀取spring.factories配置文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration,讀取到所有的自動(dòng)配置類進(jìn)行注冊(cè)。

而對(duì)于MyBatis,我們主要是通過MapperScan這個(gè)注解來注冊(cè)Mapper。在SpringBoot中,如果某個(gè)類使用了@MapperScan注解,那么Spring會(huì)自動(dòng)掃描該類所在的包,并將掃描到的Mapper接口注冊(cè)到Spring容器中。這樣,我們就可以在Service中使用@Autowired將Mapper注入,從而使用Mapper提供的方法對(duì)數(shù)據(jù)庫進(jìn)行操作。

此外,SpringBoot還集成了MyBatis的別名和類型處理器。這是通過掃描@Alias和@TypeAlias注解來實(shí)現(xiàn)的,它們可以幫助我們將類型進(jìn)行轉(zhuǎn)換,使得我們可以在MyBatis中使用更方便的類型,比如使用String代替硬編碼的SQL語句。

示例

項(xiàng)目里也經(jīng)常會(huì)用到reids,這里舉一個(gè)實(shí)例,以把redis與Springboot的集成,封裝成一個(gè)starter。

Redis在Springboot中的配置類

/**
 * Redis 配置類
 */
@AutoConfiguration
public class RedisAutoConfiguration {


    /**
     * 創(chuàng)建 RedisTemplate Bean,使用 JSON 序列化方式
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        // 創(chuàng)建 RedisTemplate 對(duì)象
        RedisTemplate template = new RedisTemplate<>();
        // 設(shè)置 RedisConnection 工廠。 它就是實(shí)現(xiàn)多種 Java Redis 客戶端接入的秘密工廠。感興趣的胖友,可以自己去擼下。
        template.setConnectionFactory(factory);
        // 使用 String 序列化方式,序列化 KEY 。
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 使用 JSON 序列化方式(庫是 Jackson ),序列化 VALUE 。
        template.setValueSerializer(buildRedisSerializer());
        template.setHashValueSerializer(buildRedisSerializer());
        return template;
    }


    public static RedisSerializer buildRedisSerializer() {
        RedisSerializer json = RedisSerializer.json();
        // 解決 LocalDateTime 的序列化
        ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper");
        objectMapper.registerModules(new JavaTimeModule());
        return json;
    }
}

resources目錄下創(chuàng)建/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,并填寫配置類的全限定名稱

com.example.redis.config.RedisAutoConfiguration


分享文章:Springboot之把外部依賴包納入Spring容器管理的兩種方式
當(dāng)前地址:http://www.dlmjj.cn/article/djhspsg.html