自定義starter

1.前言

  • springboot的最強大的就是那些xxxAutoconfiguration,可是這些xxxAutoConfiguration又依賴那些starter,只有導入了這些場景啓動器(starter),咱們不少自動配置類纔能有用,而且還會新增一些功能。java

  • 咱們要用一個場景(好比web),直接導入下面所示的依賴,可是在jar包裏面去看這個,你會發現裏面只有一些基本的配置文件,什麼類都沒有,就可以想到這個一類就相似一個公司前臺的做用,經過這個公司前臺,可以聯繫到公司內部。web

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

2.建立項目

2.1 建立一個空項目,在此基礎上建立兩個maven項目,具體見下圖。

  • db-spring-boot-starter用於編寫自定義的starter
  • test-db-spring-boot-starter用於測試

3.寫xxxconfiguration裏面的邏輯

3.1 配置目錄結構

3.2 HelloProperties

@Data
@ConfigurationProperties(prefix = "db.hello")  //配置文件的前綴
public class HelloProperties {
    private String before;
    private String after;

}
  • 這個配置類將 application.properties 中配置的屬性值直接注入到這個實例中, @ConfigurationProperties 類型安全的屬性注入,即將 application.properties 文件中前綴爲 "db.hello"的屬性注入到這個類對應的屬性上

3.3 HelloWorld

  • 此時這個類和properties類還沒什麼關係,必需要讓第三方傳入properties spring

    @Data
    public class HelloWorld {
        private HelloProperties properties;
    
        public String sayHelloWorld(String name) {
            return properties.getBefore() + ":" + name + "," + properties.getAfter();
        }
    }

3.4 HelloWorldAutoconfiguration

@Configuration //配置類
@ConditionalOnWebApplication //判斷當前是web環境
@EnableConfigurationProperties(HelloProperties.class) //向容器裏導入HelloProperties
public class HelloWorldAutoConfiguration {

    @Autowired
    HelloProperties properties;  //從容器中獲取HelloProperties組件

    /**
     * 從容器裏得到的組件傳給HelloWorld,而後再將
     * HelloWorld組件丟到容器裏
     * @return
     */
    @Bean
    public HelloWorld helloWorld() {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.setProperties(properties);
        return helloWorld;
    }
}
  • 首先 @Configuration 註解代表這是一個配置類。
  • @EnableConfigurationProperties 註解是使咱們以前配置的 @ConfigurationProperties 生效,讓配置的屬性成功的進入 Bean 中。
  • @ConditionalOnWebApplication 表示當前項目是WEB項目的條件下,後面的配置才生效。
  • 自動配置類中首先注入 HelloProperties ,這個實例中含有咱們在 application.properties 中配置的相關數據。
  • 提供一個 helloWorld的實例,將 helloWorld中的值注入進去。

作完這一步以後,咱們的自動化配置類就算是完成了瀏覽器

3.5 spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.n3.db.HelloWorldAutoConfiguration

3.6 把這兩個安裝到maven本地倉庫

  • 先是xxautoconfiguration,而後再starter

  • 到此爲止,一個簡單的HelloWorid的starter就作出來了,咱們只須要在咱們的項目中導入那個starter(也就是前臺惟一的做用)的依賴,就能夠了,看看個人starter的座標(還要記住,properties文件配置的@ConfigurationProperties(prefix = "db.hello"),這個prefix是能夠在咱們項目裏面配置文件配置屬性~~)

4.測試

4.1 新建一個測試模塊,導入咱們本身的starter的座標

4.2 修改配置

4.3編寫controller

@Controller
public class TestController {

    @Autowired
    HelloWorld helloWorld;

    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return helloWorld.sayHelloWorld("test");
    }
}

4.4 啓動 主啓動類,瀏覽器訪問

  • 瀏覽器訪問成功。

4.5 總結

  • Spring Boot在啓動時掃描項目所依賴的JAR包,尋找包含spring.factories文件的JAR包,
  • 而後讀取spring.factories文件獲取配置的自動配置類AutoConfiguration
  • 而後將自動配置類下知足條件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)
  • 這樣使用者就能夠直接用來注入,由於該類已經在容器中了
相關文章
相關標籤/搜索