स्प्रिंग बूट में Application.properties फ़ाइल में परिभाषित मूल्य का उपयोग कैसे करें


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अपने मुख्य कार्यक्रम में स्प्रिंग बूट एप्लिकेशन तक पहुंचना चाहता हूं।

जवाबों:


467

आप @Valueएनोटेशन का उपयोग कर सकते हैं और जिस भी स्प्रिंग बीन का उपयोग कर रहे हैं, उसमें संपत्ति का उपयोग कर सकते हैं

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

स्प्रिंग बूट डॉक्स का बाहरी कॉन्फ़िगरेशन अनुभाग, उन सभी विवरणों की व्याख्या करता है जिनकी आपको आवश्यकता हो सकती है।


5
एन विकल्प के रूप में वे भी वसंत से Environmentया के माध्यम से प्राप्त कर सकते हैं@ConfigurationProperties
'14:

3
@ Sodik के जवाब के शीर्ष पर जोड़ने के लिए, यह एक उदाहरण है कि शो कैसे प्राप्त करने के लिए है पर्यावरण stackoverflow.com/questions/28392231/...
Cristi

यदि आपको 10 से अधिक मूल्यों तक पहुंचने की आवश्यकता है, तो क्या आपको अपना उदाहरण 10 बार दोहराना होगा?
जेसी

एक दृष्टिकोण ऐसा करने के लिए होगा, लेकिन इसकी बोझिल। @Configurationकक्षाओं के आधार पर वैकल्पिक दृष्टिकोण हैं, निम्नलिखित ब्लॉग पोस्ट
मास्टर दास

2
ध्यान दें, यह केवल @Component(या इसके किसी भी व्युत्पत्ति @Repository, आदि) पर काम करता है
जनक मीणा

210

एक और तरीका org.springframework.core.env.Environmentआपके बीन को इंजेक्ट कर रहा है।

@Autowired
private Environment env;
....

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

6
उपयोगी भी जब संपत्ति का नाम आपको परिवर्तनों को गतिशील रूप से एक्सेस करने की आवश्यकता है
पाउलो मर्सन

3
यदि आप गुणों की खोज करना चाहते हैं तो क्या होगा? और क्या मैं आयात विवरण सहित सुझाव दे सकता हूं ताकि सभी पर्यावरण पैकेज का नाम देख सकें, शायद
org.springframework.core.env.Environment

2
सावधान रहें कि गलत पर्यावरण का आयात न करें। मैंने कॉर्बा पर्यावरण को ऑटो-इंपोर्ट किया।
जनक मीणा

3
मेरा एनवी नल क्यों है?
जनक मीणा

2
@JanacMeena को IntelliJ ऑटो इंपोर्ट करने वाली CORBA की क्लास की ही समस्या थीorg.springframework.core.env.Environment
रस्सु

31

@ConfigurationPropertiesPOJO से .properties( .ymlभी समर्थित) मानों को मैप करने के लिए उपयोग किया जा सकता है ।

निम्नलिखित उदाहरण फ़ाइल पर विचार करें।

।गुण

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 / main / package / properties में src / test / resource और properties java class (जिसमें गुण सहेजे जा रहे हैं) में डाल दिया। मुझे क्या याद आ रहा है? धन्यवाद
अहमद लियो युदंतो १६'१

src/main/resourcesयदि आप स्प्रिंग कोड से अपने कोड का परीक्षण नहीं कर रहे हैं तो आपको फ़ाइलों को सहेजना होगा ।
जोबएन

@AhmadLeoYudanto के समान और कुछ भी नहीं है जो मैं उस बदलाव को कर सकता हूं
दिमित्री कोपरिवा

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>
  • PropertySouceEnvironmentवर्ग लोड होने पर (आपकी कक्षा में) प्रॉपर्टी सोर्स फ़ाइल से मान सेट करता है। तो आप आसानी से बाद में लाने में सक्षम हैं।
    • सिस्टम पर्यावरण चर के माध्यम से सुलभ।

3. @ConfigurationPropertiesएनोटेशन।

  • यह ज्यादातर कॉन्फ़िगरेशन संपत्तियों को लोड करने के लिए स्प्रिंग प्रोजेक्ट्स में उपयोग किया जाता है।
  • यह संपत्ति डेटा के आधार पर एक इकाई को इनिशियलाइज़ करता है।

    • @ConfigurationProperties लोड करने के लिए संपत्ति फ़ाइल की पहचान करता है।
    • @Configuration कॉन्फ़िगरेशन फ़ाइल चर पर आधारित बीन बनाता है।
    @ConfigurationProperties (उपसर्ग = "उपयोगकर्ता")
    @Configuration ( "UserData")
    वर्ग उपयोगकर्ता {
      // संपत्ति और उनके गेटटर / सेटर
    }
    
    @Autowired
    निजी उपयोगकर्ता दाता उपयोगकर्ताडेटा;
    
    userData.getPropertyName ();

यदि डिफ़ॉल्ट स्थान को ओवरराइड किया गया हो तो क्या होगा spring.config.location? क्या # 2 अभी भी काम करता है?
ब्यूमर

ऐसे में प्राथमिकता जगह में आती है। जैसा कि मैं जानता हूं कि जब आप स्प्रिंग सेट करते हैं। कमांड लाइन का उपयोग करके। यह उच्च प्राथमिकता है तो यह मौजूदा को ओवरराइड करता है।
धवनिल पटेल

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?
ई-जानकारी128

1
इसे यहाँ देखें: org.springframework.core.env.Environment
lucifer

यदि डिफ़ॉल्ट स्थान को ओवरराइड किया गया हो तो क्या होगा spring.config.location?
बाम्यूटर

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

एक एप्लिकेशन Application.properties फ़ाइल से 3 प्रकार के मूल्य पढ़ सकता है।

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

स्प्रिंग-बूट हमें कई तरीकों से बाहरी कॉन्फ़िगरेशन प्रदान करने की अनुमति देता है, आप प्रॉपर्टी फ़ाइल के बजाय application.yml या yaml फ़ाइलों का उपयोग करके कोशिश कर सकते हैं और विभिन्न वातावरणों के अनुसार अलग-अलग प्रॉपर्टी फ़ाइलें सेटअप प्रदान कर सकते हैं।

हम अलग-अलग स्प्रिंग प्रोफाइल के तहत अलग-अलग yml फ़ाइलों में प्रत्येक पर्यावरण के लिए गुणों को अलग कर सकते हैं। फिर तैनाती के दौरान आप उपयोग कर सकते हैं:

java -jar -Drun.profiles=SpringProfileName

निर्दिष्ट करने के लिए कि कौन सी स्प्रिंग प्रोफ़ाइल का उपयोग करना है। ध्यान दें कि yml फ़ाइलों का नाम जैसा होना चाहिए

application-{environmentName}.yml

उनके लिए स्प्रिंगबूट द्वारा स्वचालित रूप से उठाया जाना चाहिए।

संदर्भ: 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 से मान पढ़ने का सबसे आसान तरीका है, स्प्रिंग @value एनोटेशन का उपयोग करना। स्वचालित रूप से yml से स्प्रिंग वातावरण तक सभी मानों को स्वचालित रूप से लोड किया जाता है, इसलिए हम सीधे पर्यावरण से उन मानों का उपयोग कर सकते हैं:

@Component
public class MySampleBean {

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

// ...

}

या एक अन्य विधि जो वसंत जोरदार टाइप की हुई फलियों को पढ़ने के लिए प्रदान करता है वह इस प्रकार है:

YML

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

Yml पढ़ने के लिए POJO के अनुरूप:

@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. एनवायरनमेंट बीन का उपयोग करना

@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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.