1. 程式人生 > >SpringBoot獲取配置檔案資訊

SpringBoot獲取配置檔案資訊

預設application.properties中的資訊:

local.ip=192.168.238.133
local.port=8080

一、Environment(一)

直接在SpringBoot啟動類main方法中:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication
; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class App { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(App.class, args); String port = context.getEnvironment().getProperty
("local.port"); System.out.println(port); } }

二、Environment(二)

在SpringBoot啟動類App,下級新建ConfigurationFile:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public
class ConfigurationFile { @Autowired private Environment environment; public void getConfigInfo (){ String ip = environment.getProperty("local.ip"); System.out.println("ip = " + ip); } }

App.java

import com.xh.config.ConfigurationFile;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        ConfigurationFile configurationFile = context.getBean(ConfigurationFile.class);
        configurationFile.getConfigInfo();
    }

}

三、使用@value註解

在SpringBoot掃描包下新建ServerInfo.java:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ServerInfo {

    @Value("${local.ip}")
    private String ip;

    @Value("${local.port}")
    private Integer port;

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    @Override
    public String toString() {
        return "ServerInfo{" +
                "ip='" + ip + '\'' +
                ", port=" + port +
                '}';
    }
}

App.java

import com.xh.config.ServerInfo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        ServerInfo serverInfo = context.getBean(ServerInfo.class);
        System.out.println(serverInfo);
    }

}

注意: @Value(“${local.port}”)中,local.port必須在載入的配置檔案中,可以為空,不然會出現類似於Could not resolve placeholder 'local.ipq' in value "${local.ipq}" 的錯誤。

如果沒有配置項,可以給預設值,例:@Value("${local.ipq:192.168.238.145}") , 而我的配置檔案中沒有local.ipq項也不會報錯。

四、變數的引用

配置檔案中引用配置檔案,例在application.properties中:

local.ip=192.168.238.133
local.port=8080
my.address= ${local.ip}:${local.port}

得到的my.address得值就是:192.168.238.133:8080

五、獲取集合、陣列

配置方式:name[index] = value
application.properties中配置:

ds.hosts[0]=192.168.238.130
ds.hosts[1]=192.168.238.131
ds.hosts[2]=192.168.238.132

ds.ports[0]=8080
ds.ports[1]=8081
ds.ports[2]=8082

新建ClusterConfig.java :

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Component
@ConfigurationProperties("ds") // ds對應配置檔案ds.hosts[0]等中的ds字首
public class ClusterConfig {

    // 變數名對應配置檔案ds.hosts[0]等中的 hosts
    private List<String> hosts = new ArrayList<>();

    // 變數名對應配置檔案ds.ports[0]等中的 ports
    private Integer[] ports;

    public List<String> getHosts() {
        return hosts;
    }

    public void setHosts(List<String> hosts) {
        this.hosts = hosts;
    }

    public Integer[] getPorts() {
        return ports;
    }

    public void setPorts(Integer[] ports) {
        this.ports = ports;
    }

    @Override
    public String toString() {
        return "ClusterConfig{" +
                "hosts=" + hosts +
                ", ports=" + Arrays.toString(ports) +
                '}';
    }
}

App.java

import com.xh.config.ClusterConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        ClusterConfig clusterConfig = context.getBean(ClusterConfig.class);
        System.out.println(clusterConfig);
    }

}

六、SpringBoot設定屬性預設值

application.properties:

my.username=admin
my.password=123456

方法一:直接@Value("${my.username:root}")

方法二:

App.java中

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        // 如果沒有該配置項,則返回defaultValue,如果有該配置項,則返回對應值
        String myUsername = context.getEnvironment().getProperty("my.username","root");
        System.out.println("myUsername = " + myUsername);
        String mysqlUsername = context.getEnvironment().getProperty("mysql.username","root");
        System.out.println("mysqlUsername = " + mysqlUsername);
    }

}

控制檯列印結果:

myUsername = admin
mysqlUsername = root

方法三:SpringApplication、map設定多個值

在App.java中:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.HashMap;
import java.util.Map;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(App.class);
        Map<String, Object> defaultMap = new HashMap<String, Object>();
        // 如果沒有該配置項,則返回設定,如果有該配置項,則返回對應值
        defaultMap.put("my.username", "root");
        defaultMap.put("my.password", "111111");
        defaultMap.put("my.url", "jdbc:mysql://127.0.0.1:3306/test");
        defaultMap.put("my.username", "com.mysql.jdbc.Driver");
        // 還可以是Properties物件
        application.setDefaultProperties(defaultMap);
        ConfigurableApplicationContext context = application.run(args);
        System.out.println("my.username = " + context.getEnvironment().getProperty("my.username"));
        System.out.println("my.password = " + context.getEnvironment().getProperty("my.password"));
        System.out.println("my.url = " + context.getEnvironment().getProperty("my.url"));
        System.out.println("my.username = " + context.getEnvironment().getProperty("my.username"));
    }

}

控制檯列印結果:

my.username = admin
my.password = 123456
my.url = jdbc:mysql://127.0.0.1:3306/test
my.username = admin