SpringBoot 開發實踐(7):讀取自定義配置

前言

在開發中,我們可以通過自定義配置來靈活配置我們的項目。過去,在 SpringMVC 中,我們需要在各種 XML 中定義我們的各項配置,使用起來相對繁瑣。而 SpringBoot 爲我們提供了更爲方便的方式定義配置,只需要在 application.yml 中添加我們需要的配置,然後通過註解讀取配置即可。

使用 @Value 讀取配置

在類中,我們可以通過給屬性打上 @Value 註解,將配置中的參數值綁定到屬性上。

application.yml 中,我們添加如下配置。

myconfig:
  name: InterHorse

創建測試用的 Controller 類,將綁定的參數值打印到日誌中。

@Controller
public class MyController {
    private static final Logger LOG = LoggerFactory.getLogger(MyController.class);

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

    @ResponseBody
    @RequestMapping(value = "/test1")
    private void test1() {
        LOG.info("name:{}", name);
    }
}

@Value 中,使用 ${} 讀取配置中的內容。Yml 中每一層級用"."號分割。

調用 http://127.0.0.1:8080/test1 接口,配置的 name 屬性值 InterHorse 即被輸出。

c.i.s.c.controller.MyController          : name:InterHorse

使用 @ConfigurationProperties 讀取配置

除了使用 @Value 直接將配置綁定到屬性上,我們也可以使用 @ConfigurationProperties 註解,將配置綁定到實體中。

application.yml 中,繼續添加如下配置。

myconfig:
  name: InterHorse
  city: Beijing
  friends:
    - Martin
    - Bill
    - Jenny
  age: 3

其中,friends 下的 “-” 表示爲數組類型。

創建 MyConfigProp 實體類

@Component
@ConfigurationProperties(prefix = "myconfig")
public class MyConfigProp {
    private String name;
    private String city;
    private List<String> friends;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@ConfigurationProperties 中的 prefix 爲 yml 中想要讀取的配置的層級關係。類中的屬性名和要和自定義配置中的屬性名相匹配,SpringBoot 會根據寬鬆的綁定規則將配置與實體中的屬性綁定。

有關寬鬆的綁定規則,如下面示例所示,所有格式都會被識別爲 myName 屬性:

config.my-name = InterHorse
config.myName = InterHorse
config.myname = InterHorse
config.my_name = InterHorse
config.MY_NAME = InterHorse

注意,@Component 的作用是爲了讓 SpringBoot 將該實體掃描到,這樣 @ConfigurationProperties 註解纔會生效。

接下來我們進行還是創建一個接口測試,在上面的 Controller 中填下如下內容

@Controller
public class MyController {
    private static final Logger LOG = LoggerFactory.getLogger(MyController.class);

    @Autowired
    private MyConfigProp myConfigProp;

    @ResponseBody
    @RequestMapping(value = "/test2")
    private void test2() {
        List<String> friends = myConfigProp.getFriends();

        LOG.info("name:{}, city:{}, age:{}",
                myConfigProp.getName(), myConfigProp.getCity(), myConfigProp.getAge());
        for (String n : friends) {
            LOG.info("friend name:{}", n);
        }
    }
}

調用 http://127.0.0.1:8080/test2 接口,配置即被輸出。

c.i.s.c.controller.MyController          : name:InterHorse, city:Beijing, age:3
c.i.s.c.controller.MyController          : friend name:Martin
c.i.s.c.controller.MyController          : friend name:Bill
c.i.s.c.controller.MyController          : friend name:Jenny

以上就是 SpringBoot 中自定義配置的讀取方法。

本章代碼地址:GitHub


我是因特馬,一個愛分享的斜槓程序員~

歡迎關注我的公衆號:一隻因特馬

原文作者: 一隻因特馬
原文鏈接: https://www.interhorse.cn/a/4223378434/
版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-ND 許可協議。轉載請註明出處!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章