Spring Boot簡明教程--Spring Boot 屬性注入

@Value注入

//application.yml中配置
user.name=admin 
// 屬性類代碼
@Component
public class MyBean {

    @Value("${user.name}")
    private String name;

    // ...應(yīng)有屬性的getter、setter方法

}

注意:

  • 屬性類上的@Component一定要加上,只有加上該注解,這個(gè)屬性類才會被加載到Spring的容器中,才可被注入使用。
  • 注入和之前將的一樣有JavaBean 屬性綁定和構(gòu)造器綁定,通常設(shè)置該屬性類的getter、setter方法即可,否則屬性值不能進(jìn)行綁定
  • 需要注入的屬性是寫在配置文件中的,但是不排除通過命令行執(zhí)行的時(shí)候注入情況java -jar app.jar --user.name="Spring"
  • 配置不一定寫在application.yml中也可能單獨(dú)新建一個(gè)配置文件,這時(shí)候步驟為:1)在resource目錄下新建user.yml文件,寫入配置屬性。2)使用@PropertySource("classpath:user.yml")定義配置文件位置
// 屬性類代碼
@Component
@PropertySource("classpath:user.yml")
public class MyBean {

    @Value("${user.name}")
    private String name;

    // ...應(yīng)有屬性的getter、setter方法

}

類型安全的屬性注入

使用@Value(“ $ {property}”)批注來注入配置屬性有時(shí)會很麻煩,尤其是使用多個(gè)屬性或數(shù)據(jù)本質(zhì)上是分層時(shí)。 Spring Boot提供了一種使用屬性的替代方法,該方法使強(qiáng)類型的Bean可以管理和驗(yàn)證應(yīng)用程序的配置。
在MyBean上加上注解:@ConfigurationProperties(prefix = "user")

// 屬性類代碼
@Component
@PropertySource("classpath:user.yml")
@ConfigurationProperties(prefix = "user")
public class MyBean {

    //@Value("${user.name}")
    private String name;

    // ...應(yīng)有屬性的getter、setter方法

}

注入復(fù)雜數(shù)據(jù)類型

上面描述的都是簡單的數(shù)據(jù)類型注入方法,那么復(fù)雜的數(shù)據(jù)類型應(yīng)該怎么在配置文件中定義呢?假如有一個(gè)MyPojo 有name和description兩個(gè)屬性,在AcmeProperties定義MyPojo的List和Map值。

List

單純的List

  • application.yml
//list: [111,222]也是可以的
zp:
  list:
    - 111
    - 222
  name: 666
  • Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
    private List<String> list;
}
  • controller
@RequiredArgsConstructor
@RestController
public class HelloController {
//    @Autowired
    private final Zp zp;
    @Value("${zp.name}")
    private String name;
    @RequestMapping("/test")
    public List<String> hello(){
        return zp.getList();
    }
    @RequestMapping("/test1")
    public String hello1(){
        return name;
    }
}

包含類的List

  • application.yml
zp:
  list:
    - name: "my name"
      description: "my description"
    - name: "another name"
      description: "another description"
  • application.properties
zp.list[0].name=my name
zp.list[0].description=my description
zp.list[1].name=another name
zp.list[1].description=another description
  • Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
    private List<MyPojo> list;

    @Data
    public static class  MyPojo{
        private String name;
        private String description;
    }
}

Map

  • application.yml
zp:
  map:
    key1:
      name: "dev name 1"
    key2:
      name: "dev name 2"
      description: "dev description 2"
  • application.properties
zp.map.key1.name=dev name 1
zp.map.key2.name=dev name 2
zp.map.key2.description=dev description 2
  • Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
    private Map<String, MyPojo> map;

    @Data
    public static class  MyPojo{
        private String name;
        private String description;
    }
}

補(bǔ)充知識

SpEL(Spring Expression Language)即Spring表達(dá)式語言,可以在運(yùn)行時(shí)查詢和操作數(shù)據(jù)。使用#{...}作為定界符, 所有在大括號中的字符都將被認(rèn)為是 SpEL。

#{…}和${…}

${…}用于獲取屬性文件中對應(yīng)的值,但是如果屬性文件中沒有這個(gè)屬性,則會報(bào)錯(cuò)??梢酝ㄟ^賦予默認(rèn)值解決這個(gè)問題

@Value("${zp.host:127.0.0.1}")

#{…}{}里面的內(nèi)容必須符合SpEL表達(dá)式,常見的如

@Value("#{'Hello World'.concat('!')}")
@Value("#{'Hello World'.bytes.length}")
@Value("#{'${words}'.split('\\|')}")
/**
 * 注入其他Bean屬性:注入config對象的屬性tool
 */
@Value("#{config.tool}")

參考文獻(xiàn)

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-typesafe-configuration-properties

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容