2011-08-28 8 views
29

अगर मेरे पास 2 स्प्रिंग्स फ़ाइलें हैं जो मेरे स्प्रिंग एक्सएमएल में इतनी हैं:वसंत उपयोग: एक बीन में एनोटेशन के माध्यम से गुण इंजेक्शन

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/> 
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/> 

मैं इन गुण फ़ाइलों को java.util.Properties के साथ बीन में एनोटेशन के माध्यम से कैसे इंजेक्ट कर सकता हूं?

मैं वसंत एनोटेशन के माध्यम से विशिष्ट गुणों को कैसे पकड़ सकता हूं?

चीयर्स!

उत्तर

44
@Autowired 
@Qualifier("serverProperties") 
private Properties serverProperties; 
@Autowired 
@Qualifier("someConfig") 
private Properties otherProperties; 

या

@Resource(name = "serverProperties") 
private Properties serverProperties; 
@Resource(name = "someConfig") 
private Properties otherProperties; 

आमतौर पर, @Autowired वसंत में से प्रकार autowiring के लिए प्रयोग किया जाता है, और @Resource द्वारा नाम के लिए प्रयोग किया जाता है। @ ऑटोवायर + @ क्वालीफायर ऑटो-फायरिंग के नाम से दोगुना हो सकता है, लेकिन यह वास्तव में fine-tune the type की क्षमता के साथ ऑटो-फायरिंग के लिए है।

+0

जानकारी और कोड उदाहरण के लिए धन्यवाद! काम करता है – NightWolf

2

आप इस प्रश्न का हिट फिल्मों में से एक बहुत कुछ है के रूप में @PropertySource

@Configuration 
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"}) 
public class MyConfiguration { 
} 
+0

यह अच्छा है, यह पूरी तरह से एक्सएमएल विन्यास की आवश्यकता को समाप्त करता है। – bluecollarcoder

15

उपयोग कर सकते हैं। मैंने सोचा कि स्पेल (स्प्रिंग एक्सप्रेशन भाषा) का उपयोग करके एक और विकल्प इंगित करना फायदेमंद होगा - यदि आपको विशिष्ट गुणों की आवश्यकता है तो उन्हें विशिष्ट बीन गुणों पर @ वैल्यू एनोटेशन का उपयोग करके इंजेक्शन दिया जा सकता है;

class SomeClass { 
    @Value("#{serverProperties['com.svr.prop']}") 
    private String aServerCfgProperty; 

    @Value("#{someConfig['another.config.setting']}") 
    private String someOtherProperty; 
} 

आप अनुक्रमण वाक्य रचना ['index.val'] उपयोग करने के लिए आप बस उसे सीधे प्राप्त कर सकते हैं की आवश्यकता नहीं है;

@Value("#{someConfig}") 
private Properties someConfig 

@Value("#{serverProperties}") 
private Properties svrProps; 

मैं इस बल्कि उपयोगी पाया और गुण का उपयोग करने से दूर चले गए सीधे @ संसाधन के माध्यम से इंजेक्शन वस्तु/@ Autowired।

अनुक्रमित गुण ऑब्जेक्ट के साथ @Value का उपयोग करने का एक और अच्छा कारण यह है कि कुछ आईडीई (उदा। इंटेलिजे) वास्तविक संपत्ति नामों को दोबारा कर सकते हैं यदि आपके पास प्रोजेक्ट में .properties फ़ाइल भी अच्छी है। स्पेल अनुक्रमण ['key'] सेम का उपयोग करने - एक और टिप EProperties की तरह कुछ (जो निवासी जावा गुण वस्तु फैली) यदि आप वसंत के PropertiesPlaceholderConfigurer वर्ग (जो दुर्भाग्य से नहीं करता है उसके गुण को बेनकाब का उपयोग किए बिना गुण फ़ाइलों में शामिल किए जाने/नेस्टिंग/प्रतिस्थापन क्या करना चाहते हैं का उपयोग करने के लिए है Map<> का उदाहरण होना चाहिए यानी जावा प्रॉपर्टी ऑब्जेक्ट का नक्शा बढ़ाएं) ...

अंत में, स्पेल के साथ एक और साफ सुविधा है कि आप सीधे सेम के गुणों तक पहुंच सकते हैं। तो उदाहरण के लिए कहें कि ऊपर दिए गए उदाहरण में SomeClass एक स्प्रिंग बीन उदा। someClass फिर एक और बीन क्लास में हम कर सकते थे;

@Value("#{someClass.someOtherProperty}") 
private String injectedBeanProp 

तुम भी एक गेटर विधि कह सकते हैं:

@Value("#{someClass.getSomeOtherProperty()}") 
private String injectedBeanProp 

स्पेल गाइड यहाँ देखें; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

+1

बस एक नोट स्पेल 3+ – NightWolf

+0

में है और अधिक; http://blog.nemccarthy.me/?p=304 – NightWolf

+0

मुझे बस @ वैल्यू एनोटेशन के लिए शून्य मान मिल रहा है !!! –

0

अधिकांश समय मैं एक उपयोगिता के लिए सभी गुण संपुटित और मेरी क्षुधा में इस्तेमाल किया। इस तरह आपको ऐप परत में प्रत्येक गुण फ़ाइल को चिंता/प्रबंधित करने की आवश्यकता नहीं है। रंगमंच की सामग्री सूची में गुण: Autowired setProps (...) तुम सब लोड util पढ़ता है।

import java.util.List; 
import java.util.Properties; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class AppProperiesProcessor { 

private List<Properties> props; 
private Properties mergedProperties; 

@Autowired 
public final void setProps(List<Properties> props) { 
    this.props = props; 
} 

public String getProp(final String keyVal) { 

    if (null == this.mergedProperties) { 
     this.mergedProperties = new Properties(); 

     for (Properties prop : this.props) { 
      this.mergedProperties.putAll(prop); 
     } 
    } 
    return mergedProperties.getProperty(keyVal); 
    } 
} 
1

एक्सएमएल फ़ाइल

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 
    <context:component-scan base-package="com.sha.home" /> 
    <mvc:annotation-driven/> 
    <util:properties id="dbProp" location="classpath:db.properties" /> 
    <!-- <context:property-placeholder location="classpath:db.properties"/> --> 

</beans> 
जावा फ़ाइल @value ("# {dbProp}") निजी गुण dbProperties में

;

System.out.println ("urllll" + dbProperties.getProperty ("jdbc.url"));

संबंधित मुद्दे