Springboot配置文件: application.yml application.properties(自帶)
yml的格式寫起來稍微舒服一點
在application.properties中數據是下面的樣子:
#IDEA的 properties配置文件是utf-8編碼的 #配置實體類Person字段 person.lastame=張三 person.age=18 person.birth=2018/11/12 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.petname=佩奇 person.dog.petage=2
如果跑測試出錯,說明在IDEA的settings中file encoding沒有設置為utf-8
在bean中:
package com.example.demo11.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import java.util.Date; import java.util.List; import java.util.Map; /** * 將配置文件中配置的每一個屬性的值,映射到這個組件中 * @ConfigurationProperties 告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定; * prefix = "person"; 配置文件中哪個下面的所有屬性進行一一映射 * * 只有這個組件是容器中的組件,才能使用容器提供的@ConfigurationProperties功能; */ @Data @NoArgsConstructor @AllArgsConstructor @ConfigurationProperties(prefix = "person") @Validated //配合ConfigurationProperties注解進行JSR303數據校驗 @Component public class Person { /** * <bean class="Person"> * <property name="lastName" value="字面量/${key}從環境變量,配置文件中獲取值/#{SpEL}"></property> * </bean> */ //必須為郵箱格式,該校驗必須在@ConfigurationProperties與@Validated在的情況下使用 @Email private String email; // @Value("${person.lastame}") private String lastame; // @Value("#{11*2}") private Integer age; // @Value("true") private boolean boss; // @Value("${person.birth}") private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; }
@Value的方式也能對應properties中的對應的值.但其只是對應單個數據比較有效,例如寫一個controller,獲取姓名:
controller: (這時候的bean中不使用@ConfigurationProperties和@Validated 而使用lastname)
@Value("${person.lastame}")
private String lastame;
package com.example.demo11.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${person.lastame}") private String name; @RequestMapping("/sayHello") public String sayHello(){ return "Hello , " + name; } }
運行主程序,(非測試) 查看路徑可以獲取到bean中person的lastname屬性值.
還挺方便.
>
|
>
簡單說下SpringBoot的測試類:
package com.example.demo11; import com.example.demo11.bean.Person; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class Demo11ApplicationTests { @Autowired private Person person; @Test public void contextLoads() { System.out.println(person); } }
SpringBoot 測試類,(單元測試)
注解
@SpringBootTest 說明這個類是一個SpringBoot的測試類,
@RunWith(SpringRunner.class) 說明是用Spring的驅動器來跑,而不是用原來的Junit
可以在測試期間很方便地類似編碼一樣進行自動注入等容器的功能.
如果不使用@ConfigurationProperties 也可以使用@Value注解
但@ConfigurationProperties這種支持數據名稱松散綁定,而@Value必須對應
配置文件yml還是properties都能獲取到值.
如果說,只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value
如果說,我們專門編寫一個javaBean來和配置文件進行映射,
我們就直接使用@ConfigurationProperties
特殊情況下可以@ConfigurationProperties和@Value結合使用.
兩種數據獲取的注解區別:

SpEL : Spring表達式語言 ...
自定義數據校驗注解: https://www.cnblogs.com/niceyoo/p/9497235.html
自定義數據校驗:
||||
自定義數據校驗:

注意,使用建立class的方式,將class改為@interface
詳見 https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/ 創建一個包含驗證邏輯的簡單應用(基於 JSP)下面的 >> 定制化的 constraint
IDValidator : (Annotation)
package com.example.demo11.validator.annotation; import com.example.demo11.validator.IDConstraintValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = {IDConstraintValidator.class}) @Target({ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface IDValidator { //提示信息 String message() default "身份證號長度需要在15或18位,並全為阿拉伯數字."; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
IDConstraintValidator:(定義一個類用來處理具體的驗證邏輯)
package com.example.demo11.validator; import com.example.demo11.validator.annotation.IDValidator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IDConstraintValidator implements ConstraintValidator<IDValidator,String> { @Override public void initialize(IDValidator constraintAnnotation) { } @Override public boolean isValid(String id, ConstraintValidatorContext constraintValidatorContext) { int length = id.length(); //驗證id全為數字,長度為15位或18位.(現在估計全是18位了?) if ((id.matches("^[0-9]*$")) && (length == 15 || length == 18)){ //驗證成功 return true; } //否則不予通過 return false; } }
之后在bean中加入屬性:
@IDValidator
private String idnumber;
這個屬性說明這是一個CN身份證號碼,上面的驗證邏輯也說明了這一點: (這樣是不准確的,因為身份證中還可能含有字母X,x)
身份證號碼為15位或者18位,15位時全為數字,18位前17位為數字,最后一位是校驗位,可能為數字或字符X
所以經過更改后:
IDConstraintValidator:
package com.example.demo11.validator; import com.example.demo11.validator.annotation.IDValidator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IDConstraintValidator implements ConstraintValidator<IDValidator,String> { @Override public void initialize(IDValidator constraintAnnotation) { } @Override public boolean isValid(String id, ConstraintValidatorContext constraintValidatorContext) { int length = id.length(); //直接使用身份證號碼的正則表達式: //身份證號碼為15位或者18位,15位時全為數字,18位前17位為數字,最后一位是校驗位,可能為數字或字符X,x //15位或18位的正則表達式為: //^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$ //下面的是18位的身份證驗證: if(id.matches("^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$")){ return true; } //否則不予通過 return false; } }
同樣提示message也更改為: 注解 - IDValidator 中:
//提示信息 String message() default "非正確的身份證格式.";
||||
部分的數據校驗注解:

JSR303上面的鏈接中還說明了使用自定義的驗證注解.
下面的圖表名了注解的有效性,但必須配合@ConfigurationProperties和@Validated
