วิธีเข้าถึงค่าที่กำหนดในไฟล์ application.properties ใน Spring Boot


312

ฉันต้องการเข้าถึงค่าที่มีให้application.propertiesเช่น:

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

userBucket.path=${HOME}/bucket

ฉันต้องการเข้าถึงuserBucket.pathในโปรแกรมหลักของฉันในแอปพลิเคชัน Spring Boot

คำตอบ:


467

คุณสามารถใช้@Valueคำอธิบายประกอบและเข้าถึงคุณสมบัติได้ไม่ว่าคุณจะใช้ Spring bean ใด

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

ส่วนการกำหนดค่าภายนอกของเอกสาร Spring Boot อธิบายรายละเอียดทั้งหมดที่คุณอาจต้องการ


5
เป็นอีกทางเลือกหนึ่งที่สามารถรับสิ่งเหล่านั้นได้จากฤดูใบไม้ผลิEnvironmentหรือผ่านทาง@ConfigurationProperties
sodik

3
ในการเพิ่มคำตอบของ @sodik นี่คือตัวอย่างที่แสดงวิธีรับEnvironment stackoverflow.com/questions/28392231/…
cristi

ถ้าคุณต้องการเข้าถึงค่ามากกว่า 10 ค่าคุณจะต้องทำซ้ำตัวอย่าง 10 ครั้งหรือไม่
Jesse

วิธีการหนึ่งที่จะทำเช่นนั้น แต่มันยุ่งยาก มีวิธีการอื่นขึ้นอยู่กับ@Configurationชั้นเรียนมีการวิเคราะห์ปัญหาได้ดีในบล็อกโพสต์
Master Slave

2
โปรดทราบนี่ใช้งานได้เฉพาะใน@Component(หรืออนุพันธ์อื่น ๆ ของมัน@Repositoryเท่านั้น)
Janac Meena

210

อีกวิธีหนึ่งคือการฉีดorg.springframework.core.env.Environmentไปที่ถั่วของคุณ

@Autowired
private Environment env;
....

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

6
ยังมีประโยชน์เมื่อชื่อของคุณสมบัติที่คุณต้องการเข้าถึงการเปลี่ยนแปลงแบบไดนามิก
Paulo Merson

3
ถ้าคุณต้องการค้นหาคุณสมบัติ และฉันขอแนะนำให้รวมคำสั่งการนำเข้าเพื่อให้ทุกคนสามารถเห็นชื่อแพคเกจสภาพแวดล้อมอาจเป็น
org.springframework.core.env.Environment

2
ระวังอย่าให้นำเข้าสภาพแวดล้อมที่ผิด ฉัน intellij นำเข้า CORBA Environment โดยอัตโนมัติ
Janac Meena

3
ทำไม env ของฉันจึงเป็นโมฆะ?
Janac Meena

2
@JanacMeena มีปัญหาเดียวกันของ IntelliJ การนำเข้าคลาส CORBA อัตโนมัติแทนorg.springframework.core.env.Environment
Rasshu

31

@ConfigurationPropertiesสามารถใช้เพื่อทำแผนที่ค่าจาก.properties( .ymlสนับสนุนด้วย) กับ POJO

พิจารณาไฟล์ตัวอย่างต่อไปนี้

.คุณสมบัติ

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
}

ตอนนี้ค่าคุณสมบัติสามารถเข้าถึงได้โดยการเรียกใช้อัตโนมัติemployeePropertiesดังต่อไปนี้

@Autowired
private Employee employeeProperties;

public void method() {

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

}

1
ฉันใช้วิธีนี้และได้รับผลตอบแทนที่เป็นโมฆะฉันวางไฟล์คุณสมบัติของฉันใน src / test / resources และคุณสมบัติคลาส java (ซึ่งค่าคุณสมบัติที่จะถูกบันทึกไว้) ใน src / main / package / properties สิ่งที่ฉันหายไป? ขอบคุณ
Ahmad Leo Yudanto

คุณต้องบันทึกไฟล์ไว้src/main/resourcesหากคุณไม่ได้ทำการทดสอบรหัสจากการทดสอบสปริง
JoBⅈN

เหมือนกับ @AhmadLeoYudanto และไม่มีอะไรที่ฉันสามารถทำได้เพื่อเปลี่ยนแปลง
Dimitri Kopriwa

6

ปัจจุบันฉันรู้เกี่ยวกับสามวิธีต่อไปนี้:

1. @Valueคำอธิบายประกอบ

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • nullจากประสบการณ์ของผมมีบางสถานการณ์เมื่อคุณไม่สามารถที่จะได้รับค่าหรือมีการตั้งค่า ตัวอย่างเช่นเมื่อคุณพยายามตั้งค่าในpreConstruct()วิธีการหรือinit()วิธีการ สิ่งนี้เกิดขึ้นเพราะการฉีดค่าเกิดขึ้นหลังจากที่คลาสก่อสร้างเสร็จสมบูรณ์ นี่คือเหตุผลที่ดีกว่าถ้าใช้ตัวเลือก 3'rd

2. @PropertySourceคำอธิบายประกอบ

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

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceตั้งค่าจากไฟล์แหล่งคุณสมบัติในEnvironmentตัวแปร (ในคลาสของคุณ) เมื่อโหลดคลาส ดังนั้นคุณสามารถดึงข้อมูลได้อย่างง่ายดาย
    • สามารถเข้าถึงได้ผ่านตัวแปรสภาพแวดล้อมของระบบ

3. @ConfigurationPropertiesคำอธิบายประกอบ

  • ส่วนใหญ่จะใช้ในโครงการสปริงเพื่อโหลดคุณสมบัติการกำหนดค่า
  • เริ่มต้นเอนทิตีตามข้อมูลคุณสมบัติ

    • @ConfigurationProperties ระบุไฟล์คุณสมบัติที่จะโหลด
    • @Configuration สร้าง bean ตามตัวแปรไฟล์คอนฟิกูเรชัน
    @ConfigurationProperties (คำนำหน้า = "ผู้ใช้")
    @Configuration ( "UserData")
    ผู้ใช้ชั้นเรียน {
      // อสังหาริมทรัพย์ & ผู้ทะเยอทะยานของพวกเขา / setter
    }
    
    @Autowired
    UserData ส่วนตัว userData;
    
    userData.getPropertyName ();

เกิดอะไรขึ้นถ้าสถานที่เริ่มต้นจะถูกแทนที่ด้วยspring.config.location? # 2 ยังใช้งานได้หรือไม่
bmauter

ในกรณีดังกล่าวมีการจัดลำดับความสำคัญเข้ามาในสถานที่ ตามที่ฉันรู้เมื่อคุณตั้งค่า spring.config.location โดยใช้บรรทัดคำสั่งมันมีความสำคัญสูงดังนั้นจึงแทนที่ที่มีอยู่
Dhwanil Patel

5

คุณสามารถทำได้ด้วยวิธีนี้เช่นกัน ....

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

    @Autowired
    private Environment env;

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

จากนั้นทุกที่ที่คุณต้องการอ่านจาก application.properties เพียงแค่ส่งคีย์ไปที่เมธอด getConfigValue

@Autowired
ConfigProperties configProp;

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

1
แพคเกจคือEnvironmentอะไร?
e-info128

1
ค้นหาได้ที่นี่: org.springframework.core.env.Environment
lucifer

เกิดอะไรขึ้นถ้าสถานที่เริ่มต้นจะถูกแทนที่ด้วยspring.config.location?
bmauter

3

คุณสามารถใช้@Valueเพื่อโหลดตัวแปรจากapplication.propertiesถ้าคุณจะใช้ค่านี้ในที่เดียว แต่ถ้าคุณต้องการวิธีการรวมศูนย์มากขึ้นในการโหลดตัวแปร@ConfigurationPropertiesนี้เป็นวิธีที่ดีกว่า

นอกจากนี้คุณสามารถโหลดตัวแปรและแปลงโดยอัตโนมัติหากคุณต้องการชนิดข้อมูลที่แตกต่างเพื่อดำเนินการตรวจสอบและตรรกะทางธุรกิจของคุณ

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

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

3

ทำตามขั้นตอนเหล่านี้ 1: - สร้างคลาสการกำหนดค่าของคุณตามด้านล่างที่คุณเห็น

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: - เมื่อคุณมีคลาสการกำหนดค่าจากนั้นฉีดในตัวแปรจากการกำหนดค่าที่คุณต้องการ

@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

แอปพลิเคชันสามารถอ่านค่าได้ 3 ประเภทจากไฟล์ application.properties

application.properties


     my.name=kelly

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

ไฟล์คลาส

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

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

หากคุณไม่มีคุณสมบัติใน application.properties คุณสามารถใช้ค่าเริ่มต้นได้

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

0

Spring-boot ทำให้เรามีวิธีการหลายวิธีในการกำหนดค่าภายนอกคุณสามารถลองใช้ไฟล์ application.yml หรือ yaml แทนไฟล์คุณสมบัติและจัดเตรียมการตั้งค่าไฟล์คุณสมบัติที่แตกต่างกันตามสภาพแวดล้อมที่แตกต่างกัน

เราสามารถแยกคุณสมบัติสำหรับแต่ละสภาพแวดล้อมออกเป็นไฟล์ yml แยกต่างหากภายใต้สปริงโปรไฟล์แยกจากนั้นในระหว่างการปรับใช้คุณสามารถใช้:

java -jar -Drun.profiles=SpringProfileName

เพื่อระบุโปรไฟล์ฤดูใบไม้ผลิที่จะใช้โปรดทราบว่าไฟล์ yml ควรเป็นชื่อดังนี้

application-{environmentName}.yml

สำหรับพวกเขาที่จะถูกนำขึ้นโดยอัตโนมัติโดย springboot

การอ้างอิง: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

หากต้องการอ่านจากไฟล์ application.yml หรือคุณสมบัติ:

วิธีที่ง่ายที่สุดในการอ่านค่าจากไฟล์คุณสมบัติหรือ YML คือการใช้ annotation.Spring ฤดูใบไม้ผลิ @value โหลดโดยอัตโนมัติค่าทั้งหมดจาก YML กับสภาพแวดล้อมในฤดูใบไม้ผลิเพื่อให้เราโดยตรงสามารถใช้ค่าเหล่านั้นจากสภาพแวดล้อมเช่น:

@Component
public class MySampleBean {

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

// ...

}

หรือวิธีอื่นที่สปริงให้อ่านถั่วที่พิมพ์อย่างมากมีดังนี้:

YML

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

POJO ที่สอดคล้องกันเพื่ออ่าน 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) { ... }
    }
}

วิธีการดังกล่าวทำงานได้ดีกับไฟล์ yml

การอ้างอิง: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html


0

สำหรับฉันแล้วไม่มีข้อใดตรงกับการทำงานของฉันโดยตรง สิ่งที่ฉันทำมีดังต่อไปนี้:

นอกจากนี้เพื่อ @Rodrigo Villalba Zayas คำตอบที่นั่นฉันเพิ่ม
implements InitializingBeanไปยังชั้นเรียน
และใช้วิธีการ

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

เพื่อที่จะได้หน้าตา

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

วิธีที่ดีที่สุดในการรับค่าคุณสมบัติใช้

1. การใช้หมายเหตุประกอบมูลค่า

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

2. การใช้ Enviornment bean

@Autowired
private Environment env;

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

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

0

สิ่งที่ดีที่สุดคือการใช้คำอธิบายประกอบมันจะคุ้มค่ากำหนดโดยอัตโนมัติไปยังวัตถุของคุณ@Value private Environment enวิธีนี้จะลดรหัสของคุณและจะกรองไฟล์ของคุณได้ง่าย


0

มีสองทางคือ

  1. คุณสามารถใช้@Valueในชั้นเรียนได้โดยตรง
    @Value("#{'${application yml field name}'}")
    public String ymlField;

หรือ

  1. เพื่อให้สะอาดคุณสามารถล้าง@Configurationคลาสที่คุณสามารถเพิ่มทั้งหมดของคุณ@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.