成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Springboot之把外部依賴包納入Spring容器管理的兩種方式

開發 前端
在SpringBoot中,通過開啟自動配置,系統會在ConfigurationClassPostProcessor這個BeanFactory的后置處理器中,讀取spring.factories配置文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration,讀取到所有的自動配置類進行注冊。

前言

在Spring boot項目中,凡是標記有@Component、@Controller、@Service、@Configuration、@Bean等注解的類,Spring boot都會在容器啟動的時候,自動創建bean并納入到Spring容器中進行管理,這樣就可以使用@Autowired等注解,在需要使用bean的業務類中進行注入。這里起到關鍵作用的就是@ComponentScan,這是一個bean掃描注解,默認掃描的目錄是啟動類所在包下的所有包及子包,也就是說凡是標記了@Componetn等注解類,Spring boot都會自動創建bean納入Spring容器管理。

問題

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

解決方法

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

主要是兩種方式:

第一種:Spring.factories

如果了解過Spring boot的自動裝配的原理以及如何自定義自己的starter,對這個配置文件應該會很熟悉,Spring boot能夠實現開箱即用,省去了許多繁瑣的配置,spring-boot-autoconfigure.jar下的/META-INF/spring.factories配置文件起了關鍵作用。那個類里有什么呢?仔細會發現spring.factories中配置信息是key-value的形式,key是spring中預留的擴展點配置接口的全限定類名,vlue則是具體的配置類的全限定類名,如果有多個配置類,則以英文逗號隔開;

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

圖片圖片

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

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

兩種方式有一些區別,不過都是用來實現自動裝配的。

mybatis與Springboot

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

在SpringBoot中,通過開啟自動配置,系統會在ConfigurationClassPostProcessor這個BeanFactory的后置處理器中,讀取spring.factories配置文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration,讀取到所有的自動配置類進行注冊。

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

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

示例

項目里也經常會用到reids,這里舉一個實例,以把redis與Springboot的集成,封裝成一個starter。

Redis在Springboot中的配置類

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


    /**
     * 創建 RedisTemplate Bean,使用 JSON 序列化方式
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 創建 RedisTemplate 對象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 設置 RedisConnection 工廠。?? 它就是實現多種 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<Object> json = RedisSerializer.json();
        // 解決 LocalDateTime 的序列化
        ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper");
        objectMapper.registerModules(new JavaTimeModule());
        return json;
    }
}

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

com.example.redis.config.RedisAutoConfiguration

責任編輯:武曉燕 來源: 凡夫編程
相關推薦

2009-09-08 15:22:20

Spring依賴注入

2019-01-11 13:57:06

2009-06-23 18:18:13

SpringHibernate

2010-10-20 15:48:56

SQL Server許

2024-09-20 11:32:28

.NET內存管理

2009-06-15 15:02:48

Spring定時器

2011-03-03 10:26:04

Pureftpd

2015-05-06 10:05:22

javajava框架spring aop

2021-05-27 10:57:01

TCP定時器網絡協議

2015-04-30 08:00:05

數據中心多種操作系統

2010-08-31 17:14:24

DB2表空間

2015-10-09 09:51:29

Web API認證

2025-01-16 08:38:34

2021-06-30 07:19:34

SpringBoot定時任務

2010-08-06 09:38:11

Flex讀取XML

2023-03-29 13:06:36

2009-06-25 13:43:00

Buffalo AJA

2010-10-21 16:24:18

sql server升

2010-09-07 11:09:59

2010-07-15 14:38:55

Perl eval函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97视频在线看 | 久久免费国产 | 国产成人精品免高潮在线观看 | 免费成人在线网站 | 色综合天天网 | 亚洲精品国产偷自在线观看 | 成年免费在线观看 | 国产一区二区在线播放 | 精品日韩一区二区三区 | 色婷婷av777 av免费网站在线 | 国产激情视频在线观看 | 日本一区二区高清视频 | 久久精品国产亚洲一区二区 | 成人免费在线观看 | 午夜爱爱毛片xxxx视频免费看 | 中文字幕在线不卡播放 | 欧美成视频| 欧美精品一区二区三区视频 | 国产精品久久久久久久白浊 | 国产色在线 | 欧美2区 | 亚洲精品一区二区 | 日韩精品 | 人人澡人人射 | 国产成人午夜电影网 | 精品国产一区二区三区久久久久久 | 欧美日韩一区二区三区不卡视频 | 亚洲欧美综合精品久久成人 | 亚洲精品亚洲人成人网 | 日韩精品一区二区三区老鸭窝 | 久久精品无码一区二区三区 | 国产亚洲成av人片在线观看桃 | 成人毛片网 | 日韩中文字幕免费在线观看 | 日韩高清一区二区 | 久久久久久国产精品 | 久久国产高清视频 | 都市激情亚洲 | 国产精品久久久久久久午夜片 | 四季久久免费一区二区三区四区 | 成人免费看黄 |