最渣的 Spring Boot 文章

spring-boot-starter-parent

Maven的用戶能夠經過繼承spring-boot-starter-parent項目來得到一些合理的默認配置。這個parent提供瞭如下特性:java

  • 默認使用Java 8
  • 使用UTF-8編碼
  • 一個引用管理的功能,在dependencies裏的部分配置能夠不用填寫version信息,這些version信息會從spring-boot-dependencies裏獲得繼承。
  • 識別過來資源過濾(Sensible resource filtering.)
  • 識別插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
  • 可以識別application.properties和application.yml類型的文件,同時也能支持profile-specific類型的文件(如: application-foo.properties and application-foo.yml,這個功能能夠更好的配置不一樣生產環境下的配置文件)。
  • maven把默認的佔位符${…​}改成了@..@(這點你們仍是看下原文本身理解下吧,我我的用的也比較少
    since the default config files accept Spring style placeholders (${…​}) the Maven filtering is changed to use @..@ placeholders (you can override that with a Maven property resource.delimiter).)

starter

啓動器包含一些相應的依賴項, 以及自動配置等.mysql

Auto-configuration

Spring Boot 支持基於Java的配置, 儘管能夠將 SpringApplication 與 xml 一塊兒使用, 可是仍是建議使用 @Configuration.spring

能夠經過 @Import 註解導入其餘配置類, 也能夠經過 @ImportResource 註解加載XML配置文件.sql

Spring Boot 自動配置嘗試根據您添加的jar依賴項自動配置Spring應用程序. 例如, 若是項目中引入 HSQLDB jar, 而且沒有手動配置任何數據庫鏈接的bean, 則Spring Boot會自動配置內存數據庫.數據庫

您須要將 @EnableAutoConfiguration 或 @SpringBootApplication 其中一個註解添加到您的 @Configuration 類中, 從而選擇進入自動配置.

禁用自動配置

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

若是該類不在classpath中, 你可使用該註解的excludeName屬性, 並指定全限定名來達到相同效果. 最後, 你能夠經過 spring.autoconfigure.exclude 屬性 exclude 多個自動配置項(一個自動配置項集合)數組

@ComponentScan

SpringBoot在寫啓動類的時候若是不使用 @ComponentScan 指明對象掃描範圍, 默認指掃描當前啓動類所在的包裏的對象.緩存

@SpringBootApplication

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Inherited
 @SpringBootConfiguration
 @EnableAutoConfiguration
 @ComponentScan(excludeFilters={@ComponentScan.Filter(type=CUSTOM,classes=TypeExcludeFilter.class),})
public @interface SpringBootApplication

使用 @SpringBootApplication 註解至關於使用了下面三個註解.app

@EnableAutoConfiguration: 啓用 Spring Boot 的自動配置.
@ComponentScan: 對應用程序所在的包啓用 @Component 掃描.
@Configuration: 容許在上下文中註冊額外的bean或導入其餘配置類.dom

ApplicationRunner or CommandLineRunner 區別

應用服務啓動時,加載一些數據和執行一些應用的初始化動做。如:刪除臨時文件,清除緩存信息,讀取配置文件信息,數據庫鏈接等。maven

一、SpringBoot提供了CommandLineRunner接口。當有該接口多個實現類時,提供了@order註解實現自定義執行順序,也能夠實現Ordered接口來自定義順序。

注意:數字越小,優先級越高,也就是@Order(1)註解的類會在@Order(2)註解的類以前執行。

import com.example.studySpringBoot.service.MyMethorClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value=1)
public class SpringDataInit implements CommandLineRunner {

    @Autowired
    private MyMethorClassService myMethorClassService;

    @Override
    public void run(String... strings) throws Exception {
        int result = myMethorClassService.add(8, 56);
        System.out.println("----------SpringDataInit1---------"+result);
    }
}

二、SpringBoot提供的ApplicationRunner接口也能夠知足該業務場景。不一樣點:ApplicationRunner中run方法的參數爲ApplicationArguments,而CommandLineRunner接口中run方法的參數爲String數組。想要更詳細地獲取命令行參數,那就使用ApplicationRunner接口

import com.example.studySpringBoot.service.MyMethorClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

@Component
public class SpringDataInit3 implements ApplicationRunner,Ordered {

    @Autowired
    private MyMethorClassService myMethorClassService;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        int result = myMethorClassService.add(10, 82);
        System.out.println("----------SpringDataInit3---------"+result);
    }

    @Override
    public int getOrder() {
        return 3;
    }
}

外部化配置

Spring Boot容許你外部化你的配置,這樣你就能夠在不一樣的環境中使用相同的應用程序代碼,你可使用 properties 文件、YAML文件、環境變量和命令行參數來外部化配置,屬性值能夠經過使用 @Value 註解直接注入到你的bean中,經過Spring的 Environment 抽象訪問,或者經過 @ConfigurationProperties 綁定到結構化對象。

@ConfigurationProperties("spring.datasource.username")

Spring Boot使用一種很是特殊的 PropertySource 命令, 該命令旨在容許對值進行合理的覆蓋, 屬性按如下順序考慮:

  • Devtools全局設置屬性在你的主目錄( ~/.spring-boot-devtools.properties 當devtools處於激活狀態時。
  • 測試中的 @TestPropertySource 註解
  • 測試中的 @SpringBootTest#properties 註解屬性
  • 命令行參數
  • 來自 SPRING_APPLICATION_JSON(嵌入在環境變量或系統屬性中的內聯JSON)的屬性
  • ServletConfig 初始化參數
  • ServletContext 初始化參數
  • java:comp/env 中的JNDI屬性
  • Java系統屬性(System.getProperties()
  • 操做系統環境變量
  • 一個只有random.*屬性的RandomValuePropertySource
  • 在你的jar包以外的特殊配置文件的應用程序屬性(application-{profile}.properties 和YAML 變體)
  • 在jar中打包的特殊配置文件的應用程序屬性(application-{profile}.properties 和YAML 變體)
  • 在你的jar包以外的應用程序屬性(application.properties 和YAML 變體)
  • 打包在jar中的應用程序屬性(application.properties 和YAML 變體)
  • @PropertySource 註解在你的 @Configuration 類上
  • 默認屬性(經過設置 SpringApplication.setDefaultProperties 指定)

訪問命令行屬性

在默認狀況下, SpringApplication 會轉換任何命令行選項參數 (也就是說,參數從 -- 開始, 像 --server.port=9000) 到一個 property, 並將它們添加到Spring Environment 中, 如前所述, 命令行屬性老是優先於其餘屬性源.

若是不但願將命令行屬性添加到 Environment 中, 你可使用 SpringApplication.setAddCommandLineProperties(false) 禁用它們.

應用程序屬性文件

SpringApplication 在如下位置從 application.properties 文件加載屬性並將它們添加到Spring Environment :

  • 當前目錄子目錄的 /config
  • 當前目錄
  • 類路徑下 /config
  • 類路徑的根目錄

列表按優先順序排序(在列表中較高的位置定義的屬性覆蓋在較低位置定義的屬性).

特殊配置文件的屬性

咱們可能在不一樣環境下使用不一樣的配置, 這些配置有多是在同一個文件中或不一樣文件中.

1.在相同文件中

##################################### Determime which configuration be used
spring: 
      profiles: 
            active: "dev"
      # Mysql connection configuration(share)
      datasource: 
            platform: "mysql"
            driverClassName: "com.mysql.cj.jdbc.Driver"
            max-active: 50
            max-idle: 6
            min-idle: 2
            initial-size: 6
            
---
##################################### for dev environment
spring: 
      profiles: "dev"
      datasource: 
            # mysql connection user(dev)
            username: "root"
            # mysql connection password(dev)
            password: "r9DjsniiG;>7"
---
##################################### for product environment
spring: 
      profiles: "product"
      datasource: 
            # mysql connection user(product)
            username: "root"
            # mysql connection password(product)
            password: "root"
---
##################################### for test environment
spring: 
      profiles: "test"
      datasource: 
            # mysql connection user(test)
            username: "root"
            # mysql connection password(test)
            password: "root"

這樣在配置完相同屬性的時, 還能夠對不一樣的環境進行不一樣的配置.

2.多個配置文件.

咱們能夠把特定環境的配置, 放入多個配置文件中, 可是要按照 application-{profile}.properties 格式. 以下圖.

clipboard.png

spring.profiles.active 屬性進行設置.

咱們也能夠把配置文件放在 jar 外面, 使用 spring.config.location 屬性進行設置.

clipboard.png

java -jar beetltest-0.0.1-SNAPSHOT.jar -spring.config.location=classpath:/application.properties
相關文章
相關標籤/搜索