spring boot 自定義starter

来源:http://www.cnblogs.com/elvinle/archive/2017/12/12/8028686.html
-Advertisement-
Play Games

spring boot 使用 starter 解決了很多配置問題, 但是, 他是怎麼來解決這些問題的呢? 這裡通過一個簡單的例子, 來看一下, starter是怎麼來設置預設配置的. 一. 建 starter 項目 自定義的starter, 項目命名規範是 : 自定義名-spring-boot-st ...


spring boot 使用 starter 解決了很多配置問題, 但是, 他是怎麼來解決這些問題的呢? 

這裡通過一個簡單的例子, 來看一下, starter是怎麼來設置預設配置的.

一. 建 starter 項目

自定義的starter, 項目命名規範是 : 自定義名-spring-boot-starter

先來看一下, 我最後的目錄結構

 

1. 修改pom.xml文件

<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>org.elvin</groupId>
  <artifactId>my-spring-boot-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-spring-boot-starter</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>1.5.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

其實只是加入了 spring-boot-autoconfigure 

 App文件中的main方法, 我註釋掉了, 這個在這裡沒有用到

2. 配置屬性對應的接收文件

package org.elvin;

import org.springframework.boot.context.properties.ConfigurationProperties;/**
 * author: Elvin
 * Date: 2017/12/12 14:51
 * Description:
 */
@ConfigurationProperties(prefix = "hello")
public class HelloServiceProperties {
    //預設配置內容
    private static final String MSG = "world";

    private String msg = MSG;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

3. 對外Service

package org.elvin;

/**
 * author: Elvin
 * Date: 2017/12/12 14:55
 * Description:
 */
public class HelloService {

    private String msg;

    public String sayHello(){
        return "Hello " + msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

4. 對外service與配置對應文件關聯

package org.elvin;

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;

/**
 * author: Elvin
 * Date: 2017/12/12 14:59
 * Description:
 */
@Configuration
@EnableConfigurationProperties(HelloServiceProperties.class)
@ConditionalOnClass(HelloService.class)
@ConditionalOnProperty(prefix = "hello", value="enabled", matchIfMissing =true )
public class HelloServiceAutoConfiguration {

    @Autowired
    private HelloServiceProperties helloServiceProperties;

    @Bean
    @ConditionalOnMissingBean(HelloService.class)
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        helloService.setMsg(helloServiceProperties.getMsg());
        return helloService;
    }
}

5. starter配置 : spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.elvin.HelloServiceAutoConfiguration

做完這些之後, 通過 mvn clean install , 打包到maven庫裡面

 

二. spring boot 項目使用

新建一個spring boot 項目, 選擇web即可.

目錄結構: 

先看一下引用pom.xml

        <dependency>
            <groupId>org.elvin</groupId>
            <artifactId>my-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

再看一下HelloController

package org.elvin.learn.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import  org.elvin.*;

/**
 * author: Elvin
 * Date: 2017/12/12 15:34
 * Description:
 */
@RestController
@RequestMapping("hello")
public class HelloController {

    @Autowired
    private HelloService helloService;

    @RequestMapping("index")
    public String index(){
        return helloService.sayHello();
    }

}

這裡的 HelloService 就是 前面自定義 starter 裡面的. 

1. 結果: 未配置情況下, 應該是輸出 hello world

2. 在配置文件中, 加入 hello.msg=hahahahahah

這個例子很簡單, 只是顯示一下主要的過程, 別的都是各插件自己的邏輯判斷了.

參考資料:

  JavaEE開發的顛覆者 Spring Boot實戰


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、Java開發環境概述 JDK:Java開發工具包(Java Development Kit),包括java編譯器、java運行時環境和常用的類庫; JRE:Java運行時環境(Java Runtime Environment)。 2、跨平臺特性 ①平臺指的是操作系統(Windows,Linux, ...
  • 如果上一篇我轉發的關於ubuntu的博文,你看完覺得還沒準備好,那麼,本篇從最基礎的開始,安裝虛擬機到正常使用ubuntu 虛擬機 1.什麼是虛擬機 虛擬機(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整電腦系統。 通俗的說,我們平常看得見摸 ...
  • 題目描述 如題,已知一個數列,你需要進行下麵兩種操作: 1.將某一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的總個數。 第二行包含N個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。 接下來M行每行包含3個整數, ...
  • 最近從百度雲盤上下載了一批視頻,然而這些視頻的文件名都帶有廣告。有潔癖的我看著感覺難受,於是想修改過來。但是一個個的修改文件名又嫌麻煩,聯想到業餘時看過的python,於是用python寫了幾行代碼輕鬆地批量修改了文件名稱。 代碼如下: python學習起來著實有趣,聽說python明年在某個省份要 ...
  • 類型檢查 創建類的實例時,該實例的類型為類本身: 要測試實例是否屬於某個類,可以使用type()內置函數: 當然,python中不建議如此檢查,更好的辦法是使用內置類型檢查函數isinstance(obj, cls): 同樣的,內置函數issubclass(cls1, cls2)可以用做子類的檢查: ...
  • 背景: 以前學的Java進行開發,多用到Mybatis,Hiberante等ORM框架,最近需要上手一個C#的項目,由於不是特別難,也不想再去學習C#的ORM框架,所以就想著用反射簡單的實現一下ORM框架的內容,簡單的增刪改查,沒有用到多表之間的聯繫。 反射: Java和C#中的反射大體相同,主要是 ...
  • 由於自己的公司的項目需要調用視頻地址 1:當為鏈接時:直接在播放器用資料庫查找的地址 2:當為外部鏈接時:直接用window.location.href('資料庫查找的地址') 3:當為H5鏈接時:使用<ifram src="資料庫查找的地址">播放 4:當為其餘網站鏈接時,要去第三方網站讀取jso ...
  • 瞭解會話的產生過程、會話的特性、簡單的Cookie、在URL中內嵌會話ID以及這樣做帶來什麼後果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...