02_spring-boot-starter.md

spring-boot-starter

在前面我們創(chuàng)建工程的時候呵曹,選擇了依賴Web,我們打開pom.xml肌括,將看到

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    ...
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    ...
  1. 這里的dependency里面沒有version標簽诅福,這是為什么呢?因為我們繼承了spring-boot-starter-parent需忿,該包中加入了大部分我們需要的依賴包及其版本號诅炉,根據(jù)mvn的依賴繼承原理,我們這里就不需要再寫版本號了屋厘。
  2. 我們的第一個依賴spring-boot-starter-web涕烧,它包含了編寫一個web站點需要的東西,比如我們要使用的注解:@SpringBootApplication, @RestController, @RequestMapping, @ResponseBody汗洒,等等议纯。

我們之后會經(jīng)常使用別人寫好的starter,必要的時候也需要自己寫溢谤。為了弄清楚其中的原委痹扇,我們接下來寫一個試試。

重構(gòu)項目結(jié)構(gòu)

1. 添加目錄learn-app溯香,將src目錄移動到learn-app下鲫构,修改頂層pom.xml

    ...
    <packaging>pom</packaging>
    ...
        <modules>
            <module>learn-app</module>
        </modules>
    ...
  1. 修改packaging為pom玫坛。
  2. 添加modules標簽结笨,將learn-app模塊引進來。

這一步不是必需的湿镀,只是為了方便我們以后的開發(fā)炕吸,也順便演示一下項目結(jié)構(gòu)的重構(gòu)技巧。

2. 在learn-app下添加pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>learn-app</artifactId>
    <packaging>jar</packaging>

    <name>learn-app</name>
    <description>spring-boot-learn-app</description>

    <parent>
        <groupId>me.readyou</groupId>
        <artifactId>spring-boot-learn</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

這里主要修改了parent標簽。

3. 在Maven Projects窗口的learn-app下重新創(chuàng)建Debug Configuration(見工程初始化)

創(chuàng)建包string-handler-spring-boot-starter

通常寫一個starter需要包含以下幾個部分:

  1. 主服務類:將來會通過Autowired使用的類。

  2. 屬性配置類:用來從配置文件或配置服務器獲取配置步氏。

  3. 自動配置類:根據(jù)配置的屬性患民,生成主服務類的對象考余,注入到系統(tǒng)中。

  4. 將自動配置類添加到resources/META-INF/spring.factories文件中,沒有這一步的話,上面一步不生效斩祭,即通過本配置,才能讓系統(tǒng)找到相應的自動配置類乡话,并進行依賴注入摧玫。

  5. 新建目錄與文件

    ├── pom.xml
    ├── src
    │   └── main
    │       ├── java
    │       │   └── me
    │       │       └── readyou
    │       │           └── springbootlearn
    │       │               └── starter
    │       │                   └── stringhandler
    │       │                       ├── StringHandlerAutoConfiguration.java
    │       │                       ├── StringHandlerProperties.java
    │       │                       └── StringHandlerService.java
    │       └── resources
    │           └── META-INF
    │               └── spring.factories
    
  6. 編輯pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>me.readyou</groupId>
        <artifactId>string-handler-spring-boot-starter</artifactId>
        <packaging>jar</packaging>
        <version>0.0.1-SNAPSHOT</version>
    
        <name>string-handler-spring-boot-starter</name>
        <description>starter to log execute time of controller</description>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                     <!--Import dependency management from Spring Boot-->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>1.5.2.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>
    
  7. 編輯StringHandlerService.java

    package me.readyou.springbootlearn.starter.stringhandler;
    
    /**
     * Created by wuxinlong on 18/5/2.
     */
    // 這是我們要提供的Service,但這里并不需要@service的注解
    // 因為我們在自動配置類中绑青,會直接調(diào)用構(gòu)造函數(shù)生成對象
    public class StringHandlerService {
        private int handleType;
    
        public StringHandlerService(int handleType) {
            this.handleType = handleType;
        }
    
        public String doHandle(String str) {
            if (str == null) {
                return null;
            }
    
            switch (handleType) {
                case 1:
                    return str.toLowerCase();
                case 2:
                    return str.toUpperCase();
                default:
                    return str.toUpperCase();
            }
        }
    }
    
  8. 編輯StringHandlerProperties.java

    package me.readyou.springbootlearn.starter.stringhandler;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * Created by wuxinlong on 18/5/2.
     */
    @ConfigurationProperties("spring.boot.learn.string.handler")
    public class StringHandlerProperties {
        private int handleType;
    
        public int getHandleType() {
            return handleType;
        }
    
        public StringHandlerProperties setHandleType(int handleType) {
            this.handleType = handleType;
            return this;
        }
    }
    
  9. 編輯StringHandlerAutoConfiguration.java诬像,通過Autowired使用StringHandlerProperties獲取屬性屋群,并利用屬性生成真正的Service對象:

    package me.readyou.springbootlearn.starter.stringhandler;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * Created by wuxinlong on 18/5/2.
     */
    @Configuration
    @ConditionalOnClass(StringHandlerService.class)
    @EnableConfigurationProperties(StringHandlerProperties.class)
    public class StringHandlerAutoConfiguration {
        @Autowired
        private StringHandlerProperties stringHandlerProperties;
    
        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnProperty(prefix = "spring.boot.learn.string.handler", value = "enabled", havingValue = "true")
        StringHandlerService exampleService() {
            return new StringHandlerService(stringHandlerProperties.getHandleType());
        }
    }
    

    解釋一下這里的幾個注解:@Bean表示生成一個新的Bean;@ConditionalOnMissingBean表示沒有該類時才配置坏挠,防止重復配置谓晌;@ConditionalOnProperty只有屬性滿足某些條件時才生效。

  10. 編輯spring.factories

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    me.readyou.springbootlearn.starter.stringhandler.StringHandlerAutoConfiguration
    
  11. 執(zhí)行命令mvn install安裝包到本地倉庫癞揉。

使用starter包

  1. 添加依賴

    <!-- spring-boot-learn/pom.xml -->
    ...
                <dependency>
                    <groupId>me.readyou</groupId>
                    <artifactId>string-handler-spring-boot-starter</artifactId>
                    <version>0.0.1-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    ...
    
    <!-- spring-boot-learn/learn-app/pom.xml -->
    ...
            <dependency>
                <groupId>me.readyou</groupId>
                <artifactId>string-handler-spring-boot-starter</artifactId>
            </dependency>
        </dependencies>
    ...
    
  2. 修改spring-boot-learn/learn-app/src/main/resources/application.properties,添加配置:

    spring.boot.learn.string.handler.enabled=true
    spring.boot.learn.string.handler.handleType=2
    
  3. 在controller類中使用

// ...
public class HelloController {
    @Autowired
    private StringHandlerService stringHandlerService;

    @RequestMapping("/")
    @ResponseBody
    String home() {
        String msg = "Hello World!";
        return stringHandlerService.doHandle(msg);
    }
}

效果

  1. 重啟服務溺欧,瀏覽器中可以看到全小寫的hello world!喊熟。
  2. 修改配置項:spring.boot.learn.string.handler.handleType=2,重啟服務姐刁,瀏覽器中可以看到全大寫的HELLO WORLD!芥牌。

原文鏈接

https://github.com/readyou/spring-boot-learn/blob/master/docs/01_project-init.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市聂使,隨后出現(xiàn)的幾起案子壁拉,更是在濱河造成了極大的恐慌,老刑警劉巖柏靶,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弃理,死亡現(xiàn)場離奇詭異,居然都是意外死亡屎蜓,警方通過查閱死者的電腦和手機痘昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炬转,“玉大人辆苔,你說我怎么就攤上這事《笈” “怎么了驻啤?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荐吵。 經(jīng)常有香客問我骑冗,道長,這世上最難降的妖魔是什么先煎? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任沐旨,我火速辦了婚禮,結(jié)果婚禮上榨婆,老公的妹妹穿的比我還像新娘磁携。我一直安慰自己,他們只是感情好良风,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布谊迄。 她就那樣靜靜地躺著闷供,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统诺。 梳的紋絲不亂的頭發(fā)上歪脏,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音粮呢,去河邊找鬼婿失。 笑死,一個胖子當著我的面吹牛啄寡,可吹牛的內(nèi)容都是我干的豪硅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挺物,長吁一口氣:“原來是場噩夢啊……” “哼懒浮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起识藤,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砚著,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痴昧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽穆,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年赶撰,在試婚紗的時候發(fā)現(xiàn)自己被綠了秧骑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡扣囊,死狀恐怖乎折,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侵歇,我是刑警寧澤骂澄,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惕虑,受9級特大地震影響坟冲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溃蔫,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一健提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伟叛,春花似錦私痹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽账千。三九已至,卻和暖如春暗膜,著一層夾襖步出監(jiān)牢的瞬間匀奏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工学搜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娃善,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓瑞佩,卻偏偏與公主長得像聚磺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钉凌,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355