2009-02-10 10 views
32

मैं अपने सर्वलेट कंटेनर को पुन: प्रारंभ बिना स्प्रिंग विन्यास फाइल कैसे ताज़ा कर सकते हैं पुन: प्रारंभ करने के बिना स्प्रिंग विन्यास फाइल रिफ्रेशिंग?पुन: लोड/सर्वलेट कंटेनर

मैं JRebel के अलावा किसी अन्य समाधान के लिए देख रहा हूँ।

उत्तर

7

मैं आपको ऐसा करने की सलाह नहीं दूंगा। आप सिंगलटन बीन्स के साथ क्या होने की उम्मीद करते हैं, जिनकी कॉन्फ़िगरेशन संशोधित होती है? क्या आप सभी सिंगलेट्स को फिर से लोड करने की उम्मीद करते हैं? लेकिन कुछ ऑब्जेक्ट्स उस सिंगलेट्स के संदर्भ रख सकते हैं।

इस पोस्ट के साथ-साथ Automatic configuration reinitialization in Spring

10

खैर देखें, आपके ऐप का परीक्षण करते हुए इस तरह के एक संदर्भ पुनः लोड प्रदर्शन करने के लिए उपयोगी हो सकता है।

आप refreshAbstractRefreshableApplicationContext कक्षा में से किसी एक की विधि का प्रयास कर सकते हैं: यह आपके पहले प्रत्याशित बीन्स को रीफ्रेश नहीं करेगा, लेकिन संदर्भ पर अगली कॉल रीफ्रेश किए गए सेम लौटाएगी।

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 
import org.springframework.context.support.FileSystemXmlApplicationContext; 

public class ReloadSpringContext { 

    final static String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
     "<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\"\n" + 
     " \t\"http://www.springframework.org/dtd/spring-beans.dtd\">\n"; 

    final static String contextA = 
     "<beans><bean id=\"test\" class=\"java.lang.String\">\n" + 
      "\t\t<constructor-arg value=\"fromContextA\"/>\n" + 
     "</bean></beans>"; 

    final static String contextB = 
     "<beans><bean id=\"test\" class=\"java.lang.String\">\n" + 
      "\t\t<constructor-arg value=\"fromContextB\"/>\n" + 
     "</bean></beans>"; 

    public static void main(String[] args) throws IOException { 
     //create a single context file 
     final File contextFile = File.createTempFile("testSpringContext", ".xml"); 

     //write the first context into it 
     FileUtils.writeStringToFile(contextFile, header + contextA); 

     //create a spring context 
     FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(
      new String[]{contextFile.getPath()} 
     ); 

     //echo the bean 'test' on stdout 
     System.out.println(context.getBean("test")); 

     //write the second context into it 
     FileUtils.writeStringToFile(contextFile, header + contextB); 

     //refresh the context 
     context.refresh(); 

     //echo the bean 'test' on stdout 
     System.out.println(context.getBean("test")); 
    } 

} 

और आप इस परिणाम

fromContextA 
fromContextB 

एक और तरीका यह (और शायद एक और अधिक सरल एक) को प्राप्त करने (स्प्रिंग 2.5+ गतिशील भाषा के साथ की रीफ्रेश बीन सुविधा ग्रूवी उपयोग करने के लिए है मिलता है, आदि) और वसंत आप अपने बीन व्यवहार भी बदल सकते हैं। spring reference for dynamic language पर एक नज़र डालें:

24.3.1.2। रीफ्रेश सेम

में से एक (यदि नहीं) सबसे सम्मोहक मूल्य वसंत में गतिशील भाषा समर्थन की कहते हैं 'रीफ्रेश सेम' सुविधा है।

रीफ्रेश सेम एक गतिशील भाषा समर्थित सेम है कि विन्यास की एक छोटी राशि, एक गतिशील भाषा समर्थित सेम उसके अंतर्निहित स्रोत फ़ाइल संसाधन में देखरेख बदलाव, और फिर खुद को फिर से लोड कर सकते हैं साथ जब गतिशील भाषा स्रोत फ़ाइल (उदाहरण के के लिए जब एक डेवलपर संपादन और फाइल सिस्टम पर फाइल करने के लिए परिवर्तनों को सहेजता है) बदल गया है।

2

आप इस http://www.wuenschenswert.net/wunschdenken/archives/138 पर एक नज़र डाल सकते हैं, जहां एक बार जब आप गुण फ़ाइल में कोई चीज़ बदलते हैं और इसे सहेजते हैं तो बीन्स को नए मानों के साथ पुनः लोड किया जाएगा।

+0

यह https://github.com/Unicon/springframework-addons/wiki/Auto-reloading-properties-files – Vadzim

+0

अपडेट किए गए लिंक पर अनुकूलित किया गया था: http://maven-repository.com/artifact/net.unicon। springframework/springframework-addons/0.1, https://github.com/UniconLabs/springframework-addons/blob/master/src/main/java/net/unicon/springframework/addons/properties/ReloadingPropertyPlaceholderConfigurer.java, https: // github.com/knightliao/disconf/blob/master/disconf-client/src/main/java/com/baidu/disconf/client/addons/properties/ReloadingPropertyPlaceholderConfigurer.java – Vadzim

1

अधिक हाल ही में इस पर ठोकर उन लोगों के लिए - इस समस्या को हल करने के लिए वर्तमान और आधुनिक तरीका Spring Boot's Cloud Config उपयोग करने के लिए है।

बस अपने रीफ्रेशेबल बीन्स और @EnableConfigServer पर अपने मुख्य/कॉन्फ़िगरेशन पर @RefreshScope एनोटेशन जोड़ें।

तो, उदाहरण के लिए, इस नियंत्रक वर्ग:

@RefreshScope 
@RestController 
class MessageRestController { 

    @Value("${message}") 
    private String message; 

    @RequestMapping("/message") 
    String getMessage() { 
     return this.message; 
    } 
} 

अपने message स्ट्रिंग संपत्ति के नए मूल्य /message अंत बिंदु जब भी आपके विन्यास अद्यतन किया जाता है के लिए वापस आ जाएगी।

अधिक कार्यान्वयन विवरण के लिए आधिकारिक Spring Guide for Centralized Configuration उदाहरण देखें।