Cách truy cập một giá trị được xác định trong tệp application.properIES trong Spring Boot


312

Tôi muốn truy cập các giá trị được cung cấp trong application.properties, ví dụ:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

Tôi muốn truy cập userBucket.pathvào chương trình chính của mình trong ứng dụng Spring Boot.

Câu trả lời:


467

Bạn có thể sử dụng @Valuechú thích và truy cập vào tài sản trong bất kỳ mùa xuân nào bạn đang sử dụng

@Value("${userBucket.path}")
private String userBucketPath;

Phần Cấu hình ngoài của tài liệu Spring Boot, giải thích tất cả các chi tiết mà bạn có thể cần.


5
như một người thay thế có thể lấy những thứ đó từ mùa xuân Environmenthoặc qua@ConfigurationProperties
sodik

3
Để thêm vào trên các câu trả lời @ sodik, đây là một ví dụ cho thấy cách để có được môi trường stackoverflow.com/questions/28392231/...
Cristi

Điều gì sẽ xảy ra nếu bạn cần truy cập hơn 10 giá trị, bạn có phải tiếp tục lặp lại 10 lần ví dụ của mình không?
Jesse

một cách tiếp cận sẽ là làm như vậy, nhưng nó cồng kềnh. Có các cách tiếp cận khác nhau dựa trên @Configurationcác lớp, vấn đề được phân tích kỹ trong bài đăng trên blog sau
Master Slave

2
Lưu ý, điều này chỉ hoạt động trên một @Component(hoặc bất kỳ dẫn xuất nào của nó @Repository, v.v.)
Janac Meena

211

Một cách khác là tiêm org.springframework.core.env.Environmentvào đậu của bạn.

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
cũng hữu ích khi tên của tài sản bạn cần truy cập thay đổi linh hoạt
Paulo Merson

3
Điều gì nếu bạn muốn tìm kiếm các tài sản? Và tôi có thể đề xuất bao gồm cả câu lệnh nhập để tất cả có thể thấy tên gói Môi trường, có thể là org.springframework.core.env.En Môi trường
chrisinmtown

2
Cẩn thận không nhập sai Môi trường. Tôi intellij tự động nhập môi trường CORBA.
Janac Meena

3
Tại sao env của tôi là null?
Janac Meena

2
@JanacMeena có cùng vấn đề với lớp CORBA tự động nhập IntelliJ thay vìorg.springframework.core.env.Environment
Rasshu

31

@ConfigurationPropertiescó thể được sử dụng để ánh xạ các giá trị từ .properties( .ymlcũng được hỗ trợ) sang POJO.

Hãy xem xét tệp Ví dụ sau.

.tính chất

cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket

Employee.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {

    private String name;
    private String dept;

    //Getters and Setters go here
}

Bây giờ giá trị thuộc tính có thể được truy cập bằng cách tự động employeePropertiesnhư sau.

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

1
Tôi đã sử dụng cách này và nhận được null, tôi đặt tệp thuộc tính của mình vào lớp java src / test / resource và thuộc tính (trong đó giá trị thuộc tính được lưu) trong src / main / gói / thuộc tính. những gì tôi đã mất? cảm ơn
Ahmad Leo Yudanto

bạn phải lưu các tệp vào src/main/resourcesnếu bạn không kiểm tra mã của mình từ kiểm tra Spring.
JoBⅈN

Giống như @AhmadLeoYudanto và tôi không thể làm gì để thay đổi điều đó
Dimitri Kopriwa

6

Hiện tại, tôi biết về ba cách sau:

1. @ValueChú thích

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • Theo kinh nghiệm của tôi, có một số tình huống khi bạn không thể nhận được giá trị hoặc nó được đặt thành null. Chẳng hạn, khi bạn cố gắng đặt nó trong một preConstruct()phương thức hoặc một init()phương thức. Điều này xảy ra bởi vì giá trị tiêm xảy ra sau khi lớp được xây dựng đầy đủ. Đây là lý do tại sao tốt hơn là sử dụng tùy chọn thứ 3.

2. @PropertySourceChú thích

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceđặt các giá trị từ tệp nguồn thuộc tính trong một Environmentbiến (trong lớp của bạn) khi lớp được tải. Vì vậy, bạn có thể tìm nạp dễ dàng lời bạt.
    • Có thể truy cập thông qua biến môi trường hệ thống.

3. @ConfigurationPropertiesChú thích.

  • Điều này chủ yếu được sử dụng trong các dự án Spring để tải các thuộc tính cấu hình.
  • Nó khởi tạo một thực thể dựa trên dữ liệu thuộc tính.

    • @ConfigurationProperties xác định tệp thuộc tính để tải.
    • @Configuration tạo một bean dựa trên các biến tập tin cấu hình.
    @ConfigurationProperIES (tiền tố = "người dùng")
    @Configuration ("UserData")
    người dùng lớp {
      // Thuộc tính & getter / setter của họ
    }
    
    @Autowired
    người dùng riêngData userData;
    
    userData.getPropertyName ();

Điều gì nếu vị trí mặc định bị ghi đè spring.config.location? Số 2 vẫn hoạt động chứ?
bmauter

Trong trường hợp như vậy, ưu tiên đi vào nơi. Theo tôi biết khi bạn đặt spring.config.location bằng dòng lệnh, nó có mức độ ưu tiên cao để nó ghi đè lên cái hiện có.
Dhwanil Patel

5

Bạn có thể làm theo cách này là tốt ....

@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {

    @Autowired
    private Environment env;

    public String getConfigValue(String configKey){
        return env.getProperty(configKey);
    }
}

Sau đó, bất cứ nơi nào bạn muốn đọc từ application.properations, chỉ cần chuyển khóa cho phương thức getConfigValue.

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 

1
Gói Environmentgì?
điện tử128

1
Tìm nó ở đây: org.springframework.core.env.En Môi trường
lucifer

Điều gì nếu vị trí mặc định bị ghi đè spring.config.location?
bmauter

3

Bạn có thể sử dụng @Valueđể tải các biến từ application.propertiesnếu bạn sẽ sử dụng giá trị này ở một nơi, nhưng nếu bạn cần một cách tập trung hơn để tải các biến @ConfigurationPropertiesnày thì cách tiếp cận tốt hơn.

Ngoài ra, bạn có thể tải các biến và truyền tự động nếu bạn cần các loại dữ liệu khác nhau để thực hiện xác thực và logic nghiệp vụ của mình.

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

làm theo các bước sau 1: - tạo lớp cấu hình của bạn như bên dưới, bạn có thể thấy

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class YourConfiguration{

    // passing the key which you set in application.properties
    @Value("${userBucket.path}")
    private String userBucket;

   // getting the value from that key which you set in application.properties
    @Bean
    public String getUserBucketPath() {
        return userBucket;
    }
}

2: - khi bạn có một lớp cấu hình, sau đó nhập vào biến từ một cấu hình mà bạn cần.

@Component
public class YourService {

    @Autowired
    private String getUserBucketPath;

    // now you have a value in getUserBucketPath varibale automatically.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

Một ứng dụng có thể đọc 3 loại giá trị từ tệp application.properIES.

ứng dụng


     my.name=kelly

my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}

tập tin lớp

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

@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;

Nếu bạn không có thuộc tính trong application.properations thì bạn có thể sử dụng giá trị mặc định

        @Value("${your_name : default value}")
         private String msg; 

0

Spring-boot cho phép chúng tôi một số phương pháp để cung cấp các cấu hình bên ngoài, bạn có thể thử sử dụng các tệp application.yml hoặc yaml thay vì tệp thuộc tính và cung cấp các thiết lập tệp thuộc tính khác nhau theo các môi trường khác nhau.

Chúng tôi có thể tách các thuộc tính cho từng môi trường thành các tệp yml riêng biệt trong các cấu hình lò xo riêng biệt. Sau đó, trong quá trình triển khai, bạn có thể sử dụng:

java -jar -Drun.profiles=SpringProfileName

để chỉ định sử dụng cấu hình lò xo nào. Lưu ý rằng các tệp yml phải có tên như

application-{environmentName}.yml

cho chúng được tự động đưa lên bởi springboot.

Tham khảo: https://docs.spring.io/spring-boot/docs/civerse/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-propericat

Để đọc từ tệp application.yml hoặc thuộc tính:

Các cách đơn giản nhất để đọc một giá trị từ tập tin bất động sản hoặc yml là sử dụng annotation.Spring mùa xuân @value tự động tải tất cả các giá trị từ yml đối với môi trường mùa xuân, vì vậy chúng ta có thể trực tiếp sử dụng những giá trị từ môi trường như:

@Component
public class MySampleBean {

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

// ...

}

Hoặc một phương pháp khác mà mùa xuân cung cấp để đọc các loại đậu được gõ mạnh như sau:

YML

ymca:
    remote-address: 192.168.1.1
    security:
        username: admin

POJO tương ứng để đọc yml:

@ConfigurationProperties("ymca")
public class YmcaProperties {
    private InetAddress remoteAddress;
    private final Security security = new Security();
    public boolean isEnabled() { ... }
    public void setEnabled(boolean enabled) { ... }
    public InetAddress getRemoteAddress() { ... }
    public void setRemoteAddress(InetAddress remoteAddress) { ... }
    public Security getSecurity() { ... }
    public static class Security {
        private String username;
        private String password;
        public String getUsername() { ... }
        public void setUsername(String username) { ... }
        public String getPassword() { ... }
        public void setPassword(String password) { ... }
    }
}

Phương pháp trên hoạt động tốt với các tệp yml.

Tham khảo: https://docs.spring.io/spring-boot/docs/civerse/reference/html/boot-features-external-config.html


0

Đối với tôi, không ai ở trên đã trực tiếp làm việc cho tôi. Những gì tôi đã làm là như sau:

Ngoài ra, @Rodrigo Villalba Zayas trả lời trên đó tôi đã thêm vào
implements InitializingBeanlớp
và thực hiện phương thức

@Override
public void afterPropertiesSet() {
    String path = env.getProperty("userBucket.path");
}

Nó sẽ trông như thế

import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {

    @Autowired
    private Environment env;
    private String path;

    ....

    @Override
    public void afterPropertiesSet() {
        path = env.getProperty("userBucket.path");
    }

    public void method() {
        System.out.println("Path: " + path);
    }
}

0

Cách tốt nhất để có được giá trị tài sản đang sử dụng.

1. Sử dụng chú thích giá trị

@Value("${property.key}")
private String propertyKeyVariable;

2. Sử dụng đậu Enviornment

@Autowired
private Environment env;

public String getValue() {
    return env.getProperty("property.key");
}

public void display(){
  System.out.println("# Value : "+getValue);
}

0

Điều tốt nhất là sử dụng @Valuechú thích, nó sẽ tự động gán giá trị cho đối tượng của bạn private Environment en. Điều này sẽ làm giảm mã của bạn và sẽ dễ dàng lọc các tệp của bạn.


0

Có hai cách,

  1. bạn có thể trực tiếp sử dụng @Valuetrong lớp học của bạn
    @Value("#{'${application yml field name}'}")
    public String ymlField;

HOẶC LÀ

  1. Để làm cho nó sạch, bạn có thể dọn sạch @Configurationlớp nơi bạn có thể thêm tất cả@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.