天天看點

開發實用篇(一)

熱部署

手工啟動熱部署

啟動熱部署

步驟①:導入開發者工具對應的坐标

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

步驟②:建構項目,可以使用快捷鍵激活此功能

開發實用篇(一)
關于熱部署
  • 重新開機(Restart):自定義開發代碼,包含類、頁面、配置檔案等,加載位置restart類加載器
  • 重載(ReLoad):jar包,加載位置base類加載器
  • 熱部署僅僅執行​

    ​Restart​

    ​ 操作
小結
  1. 開啟開發者工具後啟用熱部署
  2. 使用建構項目操作啟動熱部署
  3. 熱部署僅僅加載目前開發者自定義開發的資源,不加載 jar 資源

自動啟動熱部署

步驟①:設定自動建構項目

開發實用篇(一)

步驟②:允許在程式運作時進行自動建構

開發實用篇(一)
  • 這樣程式在運作的時候就可以進行自動建構了,實作了熱部署的效果。
  • 激活方式:IDEA 失去焦點5秒後啟動熱部署

熱部署範圍配置

配置中預設不參與熱部署的目錄資訊如下
  • ​/META-INF/maven​

  • ​/META-INF/resources​

  • ​/resources​

  • ​/static​

  • ​/public​

  • ​/templates​

自定義不參與重新開機排除項
spring:
  devtools:
    restart:
      # 設定不參與熱部署的檔案或檔案夾
      exclude: static/**,public/**,config/application.yml      

關閉熱部署

屬性加載優先順序
  • 參看​​https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config​​
開發實用篇(一)
禁用熱部署
  • 配置檔案中
devtools:
    restart:
      # 設定不參與熱部署的檔案或檔案夾
      exclude: static/**,public/**,config/application.yml
            # 禁用熱部署
      enabled: false      
  • 如果當心配置檔案層級過多導緻互相覆寫最終引起配置失效,可以提高配置的層級
  • 在更高層級中配置關閉熱部署。
  • 例如在啟動容器前通過系統屬性設定關閉熱部署功能。
@SpringBootApplication
public class Springboot12HotDeployApplication {

    public static void main(String[] args) {
        // 禁用熱部署
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(Springboot12HotDeployApplication.class, args);
    }

}      

配置進階

@ConfigurationProperties

  • 在基礎篇學習了​

    ​@ConfigurationProperties​

    ​ 注解,此注解的作用是用來為 bean 綁定屬性的。開發者可以在yml配置檔案中以對象的格式添加若幹屬性
servers:
  ip-address: 192.168.0.1 
  port: 2345
  timeout: -1      
  • 然後再建立一個用來封裝資料的實體類,注意要提供屬性對應的​

    ​setter​

    ​方法
@Component
@Data
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}      
  • 使用​

    ​@ConfigurationProperties​

    ​ 注解就可以将配置中的屬性值關聯到開發的模型類上
@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}      
  • 在啟動類中測試
@SpringBootApplication
public class Springboot13ConfigurationApplication {

    public static void main(String[] args) {
        // 擷取容器對象
        ConfigurableApplicationContext run = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
        ServerConfig bean = run.getBean(ServerConfig.class);
        System.out.println(bean);

    }
}      
我們還可以使用 ​

​@ConfigurationProperties​

​ 為第三方bean綁定屬性

步驟①:使用 @Bean 注解定義第三方bean

@Bean
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}      

步驟②:在yml中定義要綁定的屬性,注意 ​

​datasource​

​ 此時全小寫

dataSource:
  driverClassName:      

步驟③:使用 ​

​@ConfigurationProperties​

​​ 注解為第三方 bean 進行屬性綁定,注意字首是全小寫的 ​

​datasource​

@Bean
@ConfigurationProperties(prefix = "datasource")
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}      
  • 在啟動類中測試
@SpringBootApplication
public class Springboot13ConfigurationApplication {

    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DruidDataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }

    public static void main(String[] args) {
                // 擷取容器對象
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot13ConfigurationApplication.class, args);
        ServerConfig bean = ctx.getBean(ServerConfig.class);
        System.out.println(bean);

        DruidDataSource ds = ctx.getBean(DruidDataSource.class);
        System.out.println(ds.getDriverClassName());
    }

}      
關于 ​

​@EnableConfigurationProperties​

​ 注解
  • 作用:标注使用​

    ​@ConfigurationProperties​

    ​ 注解綁定屬性的類有哪些

步驟①:在啟動類上開啟 ​

​@EnableConfigurationProperties​

​​ 注解,并标注要使用​

​@ConfigurationProperties​

​ 注解綁定屬性的類

@SpringBootApplication
@EnableConfigurationProperties({ServerConfig.class})
public class Springboot13ConfigurationApplication {
}      

步驟②:在對應的類上直接使用 ​

​@ConfigurationProperties​

​ 進行屬性綁定

//@Component 此時無需使用這個注解
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;

}      
注意:
  • 當使用​

    ​@EnableConfigurationProperties​

    ​​ 注解時,spring 會預設将其标注的類定義為bean,是以無需再次聲明​

    ​@Component​

    ​ 注解了
  • ​@EnableConfigurationProperties​

    ​與​

    ​@Component​

    ​不能同時使用
解除使用 ​

​@ConfigurationProperties​

​ 注釋警告
開發實用篇(一)

如果出現這個提示,隻需要添加一個坐标後此提醒就消失了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>      
小結
  1. 使用@ConfigurationProperties可以為使用@Bean聲明的第三方bean綁定屬性
  2. 當使用@EnableConfigurationProperties聲明進行屬性綁定的bean後,無需使用@Component注解再次進行bean聲明

寬松綁定/松散綁定

寬松綁定:即配置檔案中的命名格式與變量名的命名格式可以進行格式上的最大化相容

​@ConfigurationProperties​

​ 綁定屬性支援屬性名寬松綁定
開發實用篇(一)
servers:
#  ipAddress: 192.168.0.1       # 駝峰模式
#  ip_address: 192.168.0.2      # 下劃線模式
  ip-address: 192.168.0.3      # 烤肉串模式(推薦)
#  IP_ADDRESS: 192.168.0.4      # 常量模式      
寬松綁定不支援注解 ​

​@Value​

​ 引用單個屬性的方式
@SpringBootTest
class Springboot13ConfigurationApplicationTests {

    @Value("${servers.ipAddress}") // 這裡不支援寬松綁定
    private String msg;

    @Test
    void contextLoads() {
        System.out.println(msg);
    }

}      
綁定字首名命名規範:僅能使用純小寫字母、數字、中劃線作為合法的字元
開發實用篇(一)
@Bean
    @ConfigurationProperties(prefix = "data-source")
    public DruidDataSource datasource() {
        DruidDataSource ds = new DruidDataSource();
        return ds;
    }      

​@Value​

​ 和 ​

​@ConfigurationProperties​

​ 比較
  • 無論配置檔案是​

    ​yml​

    ​​ 還是​

    ​properties​

    ​ 他們都能擷取到值。
  • 如果說,我們隻是在某個業務邏輯中需要擷取一下配置檔案中的某項值,使用​

    ​@Value​

    ​。
  • 如果說,我們專門編寫了一個 JavaBean 來和配置檔案進行映射,我們就直接使用​

    ​@ConfigurationProperties​

    ​。
小結
  1. @ConfigurationProperties 綁定屬性支援屬性名寬松綁定
  2. @Value注解不支援松散綁定
  3. 綁定字首命名命名規則
  4. 綁定字首名推薦采用烤肉串命名規則,即使用中劃線做分隔符

常用計量機關綁定

SpringBoot 支援JDK8提供的時間與空間計量機關
//@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {

    private String ipAddress;
    private int port;
    private long timeout;
    
    // 時間計量機關
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
    
    // 空間計量機關
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;

}      
  • Duration:表示時間間隔,可以通過​

    ​@DurationUnit​

    ​ 注解描述時間機關,例如上例中描述的機關分鐘(ChronoUnit.MINUTES)
  • DataSize:表示存儲空間,可以通過​

    ​@DataSizeUnit​

    ​ 注解描述存儲空間機關,例如上例中描述的機關為MB(DataUnit.MEGABYTES)

資料校驗

  • 開啟資料校驗有助于系統安全性,J2EE規範中JSR303規範定義了一組有關資料校驗相關的API
開啟Bean資料校驗

步驟①:開啟校驗架構

<!--1.導入JSR303規範-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate架構提供的校驗器做實作-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>      

步驟②:在需要開啟校驗功能的類上使用 ​

​@Validated​

​ 注解開啟校驗功能

//@Component
@Data
@ConfigurationProperties(prefix = "servers")
// 2.開啟對目前bean的屬性注入校驗
@Validated
public class ServerConfig {
}      

步驟③:對具體的字段設定校驗規則

//@Component
@Data
@ConfigurationProperties(prefix = "servers")
// 2.開啟對目前bean的屬性注入校驗
@Validated
public class ServerConfig {

    // 設定具體的校驗規則
    @Max(value = 8888, message = "最大值不能超過8888")
    @Min(value = 202, message = "最小值不能低于202")
    private int port;      
開發實用篇(一)
小結
  1. 啟用Bean屬性校驗
  • 導入JSR303與Hibernate校驗架構坐标
  • 使用@Validated注解啟用校驗功能
  • 使用具體校驗規則規範資料校驗格式

進制資料轉換規則

# 字面值表示方式

boolean: TRUE       #TRUE,true,True,FALSE,false , False 均可
float: 3.14         #6.8523015e+5 # 支援科學計數法
int: 123            #0b1010_0111_0100_1010_1110 # 支援二進制、八進制、十六進制
# null: ~             # 使用 ~ 表示 null
string: HelloWorld  # 字元串可以直接書寫
string2: "Hello World"  # 可以使用雙引号包裹特殊字元
date: 2018-02-17        # 日期必須使用 yyyy-MM-dd 格式
datetime: 2018-02-17T15:02:31+08:00   # 時間和日期之間使用 T 連接配接,最後使用 + 代表時區      
  • 注意在配制檔案中 字元串的書寫 加上引号包裹,養成習慣,遇到0開頭的資料多注意。
  1. 注意yaml檔案中對于數字的定義支援進制書寫格式,如需使用字元串請使用引号明确标注

繼續閱讀