spring-boot 自己編寫一個spring-boot-starter-redis

在實際項目開發(fā)中,我們常常會用到各種各樣的starter空民,為什么我們引入這些starter依賴就能夠快速的使用它們提供的功能刃唐,其中到底有什么奧秘,它們的實現(xiàn)原理是什么界轩,本節(jié)內(nèi)容就給大家演示一下如何自己編寫spring-boot-starter-redis画饥。

一、新建一個maven項目spring-boot-starter-redis

引入如下依賴:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>1.5.7.RELEASE</version>
</dependency>
<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
</dependency>

二浊猾、在此項目中編寫RedisProperties.class抖甘,用以從application.properties中讀取redis的配置信息倦挂。

@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
    private String host;
    private Integer port;
    //getter/setter省略...
}

三孝治、在此項目中編寫RedisAutoConfiguration.class胞谈,用以將Jedis的bean裝載進spring容器中

@SpringBootConfiguration
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass(Jedis.class)
public class RedisAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(Jedis.class)
    public Jedis jedis(RedisProperties redisProperties) {  
        //spring會自動將RedisProperties這個bean注入進來填具,讀者也可以手動注入
        return new Jedis(redisProperties.getHost(), redisProperties.getPort());
    }
}

為大家解釋一下這些注解的含義

重點來了
作者在編寫RedisProperties.class這個類的時候遇到了一些問題,IDEA提示如下:

Configuration Annotation Processor not found

點擊右上角打開spring官方文檔查看柄沮,說需要我在pom.xml文件中引入spring-boot-configuration-processor依賴

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <version>1.5.7.RELEASE</version>
        <optional>true</optional>
</dependency>

本以為問題解決回梧,沒想到又提示我:

Re-run spring boot configuration annotation processor

這下把我給整蒙了,找了好久的資料祖搓,最后無意間把問題解決了 - -狱意!

需要把紅框圈上的鉤給去掉

四、在此項目中resource目錄下新建application.properties文件

redis.host=127.0.0.1
redis.port=6379

好棕硫,接下來開始我們的另一個項目髓涯,去使用我們自己編寫的spring-boot-starter-redis

五、新建Blog項目哈扮,引入spring-boot-starter-redis依賴

<dependency>
        <groupId>com.bamu.jianshu</groupId>
        <artifactId>spring-boot-starter-redis</artifactId>
        <version>1.0-SNAPSHOT</version>
</dependency>

六、在Blog項目中蚓再,編寫啟動類BlogApplication

@SpringBootApplication
public class BlogApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);
        Jedis jedis = context.getBean(Jedis.class);
        //如果成功連接上了redis滑肉,jedis.ping()會返回一個pong
        System.out.println(jedis.ping());
    }
}

七、本地啟動redis

啟動redis的過程不再贅述

redis

好摘仅,我們現(xiàn)在可以試試看靶庙,運行Blog項目的啟動類,但是肯定會失敗的娃属。原因在于我們的Blog項目獲取不到spring-boot-starter-redis項目中的Jedis這個bean六荒。參考Spring-boot @EnableAutoConfiguration源碼分析。這篇文章講述了一種方式矾端,事實上還有另一種方式掏击,編寫一個EnableRedis的注解,使用@Import將RedisAutoConfiguration這個類給導(dǎo)入進去秩铆。

1)方式1 在Blog項目中編寫@EnableRedis注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RedisAutoConfiguration.class)
public @interface EnableRedis {
}

將此注解加在BlogApplication.class啟動類上

@SpringBootApplication
@EnableRedis//關(guān)鍵的一步
public class BlogApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);
        Jedis jedis = context.getBean(Jedis.class);
        System.out.println(jedis.ping());
    }
}

2)方式2 在Blog項目中resource的META-INF目錄下寫一個spring.factoryes配置文件砚亭,加載RedisAutoConfiguration.class

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jianshu.bean.RedisAutoConfiguration

好,所有代碼編寫完畢殴玛。我們可以試一試捅膘,可是!9鏊凇寻仗!又報錯了,NullPointerException凡壤,我們獲取到的RedisProperties里面的Host/port字段都會null署尤,為什么蔬咬??沐寺?難道@ConfigurationProperties注解從環(huán)境中沒有拿到我這兩個字段林艘。

這個問題把我給耽誤了好幾個小時。這里要著重講一講混坞,也是給我自己提個醒狐援。錯誤的關(guān)鍵點在于編寫了host和port這兩個字段的默認(rèn)值的application.properties文件不應(yīng)寫在spring-boot-starter-redis這個項目中,而應(yīng)寫在Blog項目中究孕。

在更換了application.properties文件的位置后啥酱,兩種方式都能運行成功。

pong

為什么需要寫在引用starter的項目中厨诸,我的理解是:ConfigurationProperties從環(huán)境Environment中獲取字段默認(rèn)值镶殷,我們啟動的是Blog項目,環(huán)境加載的是Blog項目的application.properties文件微酬。所以我們應(yīng)該把配置寫在Blog項目中绘趋。

其實從結(jié)論倒推原因我們也可以理解,假如我們的項目需要用到某一個starter颗管,例如spring-boot-starter-mongo陷遮,難道我還得從starter-mongo的代碼中去修改host/port/password等等參數(shù)嗎?必然是在我們自己項目的application.properties文件中配置參數(shù)垦江,就可以直接獲取到Bean帽馋!

最后,講一個擴展點:其實spring-boot-autoconfiguration.jar中已經(jīng)為我們集成了大量的第三方中間件:redis比吭、mongo绽族、kafka等。本文講述的實現(xiàn)方式是源碼中redis的實現(xiàn)方式的簡化版衩藤,源碼作者也編寫了兩個類RedisProperties吧慢、RedisAutoConfiguration,讀者可以去一探究竟慷彤,試試看能否通過些許配置娄蔼,拿到redisTemplate這個對象,用以在生產(chǎn)級別來使用底哗。具體實現(xiàn)方式會在接下來的文章中講解岁诉。讀者可以持續(xù)關(guān)注我的springboot系列文章!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跋选,一起剝皮案震驚了整個濱河市涕癣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖坠韩,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件距潘,死亡現(xiàn)場離奇詭異,居然都是意外死亡只搁,警方通過查閱死者的電腦和手機音比,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氢惋,“玉大人洞翩,你說我怎么就攤上這事⊙嫱” “怎么了骚亿?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熊赖。 經(jīng)常有香客問我来屠,道長,這世上最難降的妖魔是什么震鹉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任俱笛,我火速辦了婚禮,結(jié)果婚禮上足陨,老公的妹妹穿的比我還像新娘嫂粟。我一直安慰自己,他們只是感情好墨缘,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著零抬,像睡著了一般镊讼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上平夜,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天蝶棋,我揣著相機與錄音,去河邊找鬼忽妒。 笑死玩裙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的段直。 我是一名探鬼主播吃溅,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸯檬!你這毒婦竟也來了决侈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喧务,失蹤者是張志新(化名)和其女友劉穎赖歌,沒想到半個月后枉圃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡庐冯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年孽亲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展父。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡返劲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犯祠,到底是詐尸還是另有隱情旭等,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布衡载,位于F島的核電站搔耕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痰娱。R本人自食惡果不足惜弃榨,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梨睁。 院中可真熱鬧鲸睛,春花似錦、人聲如沸坡贺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遍坟。三九已至拳亿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愿伴,已是汗流浹背肺魁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隔节,地道東北人鹅经。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像怎诫,于是被迫代替她去往敵國和親瘾晃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容