SpringBoot基礎篇Bean之自動加載

更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題html

前面一篇介紹了Bean的經常使用姿式,在一個項目中,可能不會出現什麼問題,可若是你提供了一個Jar包供第三方用戶使用,那麼你這個jar包中的Bean,能被第三方加載麼?java

本篇博文將主要介紹AutoConfig相關的內容,即若是我想提供一個jar包供第三方在Spring的環境下使用時,能夠怎麼作git

<!-- more -->github

I. AutoConfiguration

一般來說,要想實現上面的場景,建議是藉助@Configuration註解的配置類來管理你本身的bean,這樣對於其餘使用方而言,只須要加載到你的配置類,就能夠註冊你的全部bean了redis

1. 包路徑掃描使用姿式

首先是在你的工程中定義一個配置類,以下spring

@Configuration
@ComponentScan("com.git.hui.boot.autoconfig")
public class SelfAutoConfig {
}

這個配置類功能比較簡單,指明掃描的包路徑,而後這個配置類如何給使用方使用呢?app

將配置放在指定的文件中便可,使用者會自動加載,從而避免的代碼的侵入框架

  • 在資源目錄下新建目錄 META-INF
  • 在 META-INF 目錄下新建文件 spring.factories
  • 在文件中添加 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.git.hui.boot.autoconfig.SelfAutoConfig

說明,若是須要換行時,能夠以下spring-boot

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.git.hui.boot.autoconfig.SelfAutoConfig,`
    com.git.hui.boot.autoconfig.SelfAutoConfig2,`

而後使用方就能夠愉快的使用你的bean了,定義一個測試的Bean以下學習

@Slf4j
@Component
public class AutoBean {
    private String name;

    public AutoBean() {
        this("defaultAutoBean");
    }

    public AutoBean(String name) {
        this.name = name;
        log.info("AutoBean load time: {}", System.currentTimeMillis());
    }

    public String getName() {
        return name;
    }
}

2. 定義Bean使用方式

直接在Config配置中,定義Bean,能夠說是更加常見的方式,特別是當你的bean不是那麼多的時候,推薦使用這種方式,便於集中管理

@Slf4j
public class AutoConfBean {
    private String name;

    public AutoConfBean(String name) {
        this.name = name;
        log.info("AutoConfBean load time: {}", System.currentTimeMillis());
    }

    public String getName() {
        return name;
    }
}

對應的配置類

@Configuration
@ComponentScan("com.git.hui.boot.autoconfig")
public class SelfAutoConfig {

    @Bean
    public AutoConfBean autoConfBean() {
        return new AutoConfBean("auto load + " + System.currentTimeMillis());
    }
}

3. 實例演示

在新工程中,測試前面的工程的bean,看是否能夠正常加載,這一小結結合源碼運行查看,更有助於理解

源碼工程說明

  • 005-autoconfig 提供自動加載的Bean的工程,內部定義了前面的兩個測試Bean和配置文件
  • 004-bean 測試引入第三方jar中Bean的工程

測試代碼以下,已刪除無關的內容

@RestController
public class DemoController {
    /**
     * 測試引入第三方包的狀況
     */
    @Autowired
    private AutoBean autoBean;

    @Autowired
    private AutoConfBean autoConfBean;

    @GetMapping(path = "/show")
    public String show(String name) {
        Map<String, String> map = new HashMap<>(4);
        // ...
        map.put("auto", autoBean != null ? autoBean.getName() : "null");
        map.put("autoConf", autoConfBean != null ? autoConfBean.getName() : "null");
        return JSON.toJSONString(map);
    }
}

演示圖以下:

gif.gif

4. 小結

本篇的內容比較簡單,東西也很少,主要就是在本身的項目中添加一個Configuration配置類,而後在資源目錄下新增 META-INF/spring.factories 便可

上面這麼作,其實和Java自己的SPI機制有點像,都是講一些類信息寫在約定的文件中,而後由框架層來獲取文件中的內容而後進行解析,後面在源碼篇,會涉及到整個處理流程;如今知道大體是這麼玩的就行

從簡單的使用來說,上面能夠知足通常場景,可是實際的應用中,還有其餘的問題

  • 我直接依賴或間接依賴了不少jar包,可是有些包並不想引入他們定義的AutoConfig怎麼辦?(如進行redis操做的Lettuce和Jedis,只須要一個生效便可)
  • 如個人Jar包工做的前提是須要引入其餘的jar包,可是我不知道使用個人地方是否提供了這個依賴,如何處理?(如只有Spring容器中有BeanA以後,我定義的Bean才生效)
  • Bean初始化順序的問題

II. 其餘

0. 相關

a. 參考

b. 項目

1. 一灰灰Blog

一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛

2. 聲明

盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

一灰灰blog

QrCode

知識星球

goals

相關文章
相關標籤/搜索