2015-03-16 10 views
20

मैं JDBC संपत्ति फ़ाइलें जो मैं mysql रंगमंच की सामग्री यह आसान है के रूप में application.properties करने के लिए उन जोड़ने सेट करने के लिए बाहरी विन्यास वेब सेवा से ले वसंत बूट में है:स्प्रिंग-बूट application.properties ओवरराइड कैसे प्रोग्राम के रूप में

spring.datasource.url=jdbc:mysql://localhost/mydb 
spring.datasource.username=root 
spring.datasource.password=root 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

मैं अपने ऐप में उन प्रोग्रामिक रूप से कैसे ओवरराइड कर सकता हूं?

ही वसंत बैच रंगमंच की सामग्री के लिए चला जाता है:

database.driver=com.mysql.jdbc.Driver 
database.url=jdbc:mysql://localhost/mydv 
database.username=root 
database.password=root 

उत्तर

24

आप एक जीवन चक्र श्रोता ApplicationEnvironmentPrepared घटना के लिए प्रतिक्रिया में अतिरिक्त संपत्ति स्रोतों जोड़ सकते हैं।

public class DatabasePropertiesListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> { 
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { 
    ConfigurableEnvironment environment = event.getEnvironment(); 
    Properties props = new Properties(); 
    props.put("spring.datasource.url", "<my value>"); 
    environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props)); 
    } 
} 

फिर src/मुख्य/संसाधन/META-INF/spring.factories में वर्ग रजिस्टर: की तर्ज पर

कुछ

org.springframework.context.ApplicationListener=my.package.DatabasePropertiesListener 

यह मेरे लिए काम किया, हालांकि, आप इस बिंदु पर क्या कर सकते हैं इस तरह सीमित हैं क्योंकि यह एप्लिकेशन स्टार्टअप चरण में काफी जल्दी है, आपको अन्य वसंत बीन्स आदि पर भरोसा किए बिना आवश्यक मूल्यों को प्राप्त करने का एक तरीका खोजना होगा।

+2

बिल्कुल मुझे जो चाहिए था। अगर यह किसी की मदद करता है, तो आप 'पर्यावरण' का उपयोग करके application.properties से मौजूदा गुण ला सकते हैं।getProperty ("") 'और इसे अपने कोड में आगे बढ़ाएं। मैं अपनी संपत्ति फ़ाइल में परिभाषित एक पूर्णांक से spring.hornetq.embedded.queues संपत्ति populating द्वारा hornetqueus की गतिशील संख्या का निर्माण समाप्त हो गया। – Avnish

+0

यह मेरे लिए भी काम करता है! मेरा उपयोग केस ऐप शुरू होने पर गतिशील रूप से डीबी पासवर्ड को डिक्रिप्ट करना है। – TonyLxc

+0

बढ़िया काम करता है! धन्यवाद! – user770119

0

तहत META-INF फ़ोल्डर बनाने वास्तव में इस फोल्डर और फाइल: वसंत> बैच> ओवरराइड> डेटा स्रोत-context.xml और अपने xml फ़ाइल में पैरामीटर आप इस तरह चाहते ओवरराइड करने के लिए सुनिश्चित करें:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${loader.jdbc.driver}" /> 
    <property name="url" value="${loader.jdbc.url}" /> 
    <property name="username" value="${loader.jdbc.username}" /> 
    <property name="password" value="${loader.jdbc.password}" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

या catalina.properties

<jee:jndi-lookup id="dataSource" 
    jndi-name="java:comp/env/jdbc/loader-batch-dataSource" lookup-on-startup="true" 
    resource-ref="true" cache="true" /> 
15

बस संदर्भ के लिए इस सूत्र के लिए एक और विकल्प प्रदान करने के लिए की तरह अपने बाहरी विन्यास फाइल का उपयोग करने की xml फ़ाइल में इस तरह की एक JNDI का उपयोग के रूप में जब मैं अपने आवश्यकता के लिए एक जवाब के लिए देखने के लिए शुरू कर दिया यह खोज सूची पर उच्च आया, लेकिन मेरे उपयोग के मामले को कवर नहीं किया।

मैं स्टार्टअप पर स्प्रिंग बूट प्रॉपर्टी को प्रोग्रामेटिक रूप से सेट करने की तलाश में था, लेकिन वसंत समर्थन करने वाली विभिन्न एक्सएमएल/कॉन्फ़िगर फ़ाइलों के साथ काम करने की आवश्यकता के बिना।

वसंत अनुप्रयोग परिभाषित होने पर गुणों को सेट करना सबसे आसान तरीका है। नीचे बुनियादी उदाहरण 9999.

@SpringBootApplication 
public class Demo40Application{ 

    public static void main(String[] args){ 
     SpringApplication application = new SpringApplication(Demo40Application.class); 

     Properties properties = new Properties(); 
     properties.put("server.port", 9999); 
     application.setDefaultProperties(properties); 

     application.run(args); 
    } 
} 
+1

यह आंतरिक गुणों को ओवरराइड नहीं करेगा, लेकिन अतिरिक्त गुण जोड़ने के लिए एक अच्छा समाधान –

11

को बिल्ला बंदरगाह वसंत बूट के बाद से सेट 1.3 EnvironmentPostProcessor इस उद्देश्य के लिए उपलब्ध है। इसके बारे में एक उपवर्ग बनाएँ और META-INF में रजिस्टर/है spring.factories एक अच्छा उदाहरण यहाँ:

https://github.com/spring-cloud/spring-cloud-sleuth/blob/48f3f9783f277a795d0210399f0ea09b7f1a4e71/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java

0

इस तरह आप यदि आप के लिए है प्रोग्राम के application.properties ओवरराइड कर सकते हैं।

public static void main(String[] args) { 
    SpringApplication app = new SpringApplication(Restdemo1Application.class); 
    app.setAdditionalProfiles("dev"); 
    // overrides "application.properties" with "application-dev.properties" 
    app.run(args); 

} 
1

इस विधि के साथ आपकी कॉन्फ़िगरेशन में आप डिफ़ॉल्ट गुण सेट कर सकते हैं।

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class) 
       .properties("propertyKey=propertyValue"); 
} 
संबंधित मुद्दे