मैं संदर्भ के लिए इस में छोड़ देंगे, लेकिन अद्यतन जवाब विभक्त नीचे है:
खैर ConfigurableApplicationContext
इंटरफ़ेस एक refresh() विधि है, जो होना चाहिए कि आप क्या चाहते हैं, लेकिन सवाल यह है: कैसे उपयोग करने के लिए वह विधि
private ConfigurableApplicationContext context;
@Autowired
public void setContext(ConfigurableApplicationContext ctx){
this.context = ctx;
}
अब दो मूल विकल्प मेरा सुझाव था होगा या तो
- Task Execution Framework का उपयोग करें: जिस तरीके से आप इसे करते हैं, आप एक सेम प्रकार
ConfigurableApplicationContext
की निर्भरता है कि के साथ शुरू करेंगे और अपने बीन को संपत्ति संसाधनों को नियमित रूप से देखते हैं, जब एप्लिकेशन में परिवर्तन मिलता है या
- expose the bean to JMX आपको रीफ्रेश को मैन्युअल रूप से ट्रिगर करने की अनुमति देता है।
टिप्पणियों का जिक्र करते हुए: के बाद से यह पूरे संदर्भ को ताज़ा करने के लिए असंभव लगता है, एक वैकल्पिक रणनीति एक गुण कारखाने सेम बना सकते हैं और इंजेक्षन कि अन्य सभी बीन्स में होगा।
public class PropertiesFactoryBean implements FactoryBean<Properties>{
public void setPropertiesResource(Resource propertiesResource){
this.propertiesResource = propertiesResource;
}
private Properties value=null;
long lastChange = -1L;
private Resource propertiesResource;
@Override
public Properties getObject() throws Exception{
synchronized(this){
long resourceModification = propertiesResource.lastModified();
if(resourceModification != lastChange){
Properties newProps = new Properties();
InputStream is = propertiesResource.getInputStream();
try{
newProps.load(is);
} catch(IOException e){
throw e;
} finally{
IOUtils.closeQuietly(is);
}
value=newProps;
lastChange= resourceModification;
}
}
// you might want to return a defensive copy here
return value;
}
@Override
public Class<?> getObjectType(){
return Properties.class;
}
@Override
public boolean isSingleton(){
return false;
}
}
आप अपने सभी अन्य बीन्स में यह गुण सेम इंजेक्षन सकता है, हालांकि, आपको सावधान रहना होगा करने के लिए हमेशा प्रोटोटाइप दायरे का उपयोग करें। यह सिंगलटन बीन्स, a solution can be found here के अंदर विशेष रूप से मुश्किल है।
public class PropertiesProvider implements ApplicationContextAware{
private String propertyBeanName;
private ApplicationContext applicationContext;
public void setPropertyBeanName(final String propertyBeanName){
this.propertyBeanName = propertyBeanName;
}
@Override
public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException{
this.applicationContext = applicationContext;
}
public String getProperty(final String propertyName){
return ((Properties) applicationContext.getBean(propertyBeanName)).getProperty(propertyName);
}
}
स्रोत
2010-11-03 08:05:22
चाहेंगे नहीं इस भार पूरा आवेदन संदर्भ:
आप हर जगह देखने तरीकों इंजेक्षन नहीं करना चाहते हैं, तो आप भी एक
PropertyProvider
सेम इस तरह इंजेक्षन सकता है? क्या आप कुछ नमूना साझा कर सकते हैं? मैं वसंत के लिए बहुत नया हूँ इसलिए मैं गलत हो सकता हूं। मैंने पूरे वसंत अनुप्रयोग संदर्भ को पुनः लोड करने के बारे में भी सोचा, लेकिन इसका मतलब यह होगा कि, वर्तमान में चल रही अन्य प्रक्रियाओं को बाधित किया जा सकता है। या शायद मैं गलत सोच रहा हूँ! – SJoeनहीं, आप सही हैं, पूरा संदर्भ ताज़ा किया जाएगा। –
उस स्थिति में मेरी वर्तमान में चल रही प्रक्रिया बाधित नहीं होगी। मेरा बैच एप्लिकेशन है और प्रक्रिया को पूरा करने में घंटों लग सकते हैं। इसके अतिरिक्त, मेरे पास वसंत के माध्यम से एक कॉन्फ़िगर किए गए शेड्यूलर फैक्ट्रीबीन है। मेरा सवाल है, अगर मैं पूरी तरह से एप्लिकेशन संदर्भ पुनः लोड करता हूं, तो शेड्यूलर रीसेट नहीं होगा? – SJoe