2013-04-09 7 views
9

एक प्रोजेक्ट पर मैं वर्तमान में काम कर रहा हूं कि हमें कई प्रोफाइल की आवश्यकता है, यानी "डिफ़ॉल्ट" और "परीक्षण"। इसे हल करने के लिए, हमने एक मुख्य संदर्भ वर्ग, ApplicationContext.java को 2 सार्वजनिक स्थैतिक आंतरिक कक्षाओं के साथ कार्यान्वित किया है: उनमें से एक डिफ़ॉल्ट प्रोफ़ाइल को परिभाषित करता है, दूसरा परीक्षण प्रोफ़ाइल को परिभाषित करता है। हमारा web.xml ApplicationContext.java को लक्षित करने के लिए सेट है।जावा कॉन्फ़िगरेशन के साथ वसंत में एकाधिक प्रोफाइल को संभालने का सबसे अच्छा अभ्यास क्या है?

कोड इस प्रकार है:

@Configuration 
//import common beans 
public class ApplicationContext { 

    @Configuration 
    @Profile("default") 
    public static class DefaultContext { 
    //default beans 
    } 

    @Configuration 
    @Profile("test") 
    public static class TestContext { 
    //test beans 
    } 

} 

इस के साथ मेरी समस्या यह है कि मुख्य संदर्भ वर्ग, ApplicationContext.java, (यानी src/मुख्य/जावा) की परीक्षा में फ़ाइलों को संदर्भ के साथ उत्पादन वातावरण में है वातावरण। यदि उत्पादन कोड से परीक्षण कोड तक इस निर्भरता को पेश किए बिना इन प्रोफाइल को परिभाषित करने का एक बेहतर तरीका है, तो यह निश्चित रूप से बेहतर होगा।

हमने इन मामलों का परीक्षण एक टेस्ट क्लास में जेटी इंस्टेंस के साथ किया है, जो मुख्य विधि से शुरू हुआ है। इस उदाहरण निम्न आदेश के साथ चलाया जाता है:

System.setProperty("spring.profiles.active", "test"); 

उत्तर

1

समाधान हम का इस्तेमाल Spring`s @ComponentScan टिप्पणी के साथ समाप्त हो गया। विभिन्न अनुप्रयोग संदर्भों को कई मेवेन मॉड्यूल में परिभाषित किया गया है। हालांकि, एक ही पैकेज नामकरण (i.e. com.company.application.context) साझा करके इस एनोटेशन में परीक्षण और उत्पादन निर्देशिका दोनों में संदर्भ मिलते हैं।

जिसके परिणामस्वरूप कोड:

@ComponentScan("com.company.application.context") 
@Configuration 
public class ApplicationContext { } 

सभी उत्पादन संदर्भों और परीक्षण संदर्भों स्वचालित रूप से पाए जाते हैं, Maven निर्भरता संभालने और पैकेज नामकरण सही है।उत्पादन संदर्भ इस तरह दिखता है:

@Configuration 
@Profile("default") 
//Import contexts from other modules 
public class ProductionContext { } 

इसी प्रकार परीक्षण संदर्भ के लिए। निम्न पंक्ति के साथ एक मुख्य विधि से घाट चल रहा है सही ढंग से परीक्षण संदर्भ लोड करता है और "डिफ़ॉल्ट" सेम पर ध्यान नहीं देता:

System.setProperty("spring.active.profiles", "test"); 

यह समाधान, कोड का परीक्षण करने के उत्पादन से किसी भी प्रत्यक्ष संदर्भ से बचा जाता है, हालांकि Maven निर्भरता जरूरी हैं।

0

मुख्य और परीक्षण आवेदन संदर्भों अलग करने के Maven की सुविधाओं का उपयोग करें।

उदाहरण के लिए

अपने मुख्य आवेदन के संदर्भ में

src रहता है यदि/मुख्य/webapp/वेब-INF/MyApp-config.xml

आप

में एक परीक्षण आवेदन संदर्भ डाल सकते हैं

src/परीक्षण/webapp/वेब-INF/MyApp-config.xml

+0

बात यह है कि हम एक Maven आदेश –

+0

प्लस के साथ cmd से एक जावा मुख्य विधि से जेट्टी शुरू करने के लिए, नहीं चाहता, मुख्य अंतर यह है कि Maven प्रोफाइल हर प्रोफ़ाइल के लिए एक अलग निर्माण उत्पन्न है। इसलिए, स्थानीय विकास के लिए निर्माण रिलीज पर्यावरण से अलग है। मेरी राय में, यह एक गलत दृष्टिकोण है, निर्माण संगतता – ThanksForAllTheFish

14

सभी सेम अपने प्रोफाइल के बीच आम हैं (जो है, दोनों DefaultContext और TestContext ही सेम परिभाषाएँ शामिल हैं), निर्भरता के लिए एक इंटरफेस को परिभाषित, जैसे:

public interface SystemConfiguration { 

    public DataSource getDataSource(); 
    public SomeService getService(); 

} 

फिर इस इंटरफेस के साथ प्रत्येक प्रोफ़ाइल को लागू:

@Profile("production") 
@Configuration 
public class ProductionConfiguration implements SystemConfiguration { 
    public DataSource getDataSource() { 
     // create and return production datasource 
    } 

    public SomeService getService() { 
     // Create and return production service 
    } 
} 

और फिर परीक्षण के लिए ऐसा ही करें।

@Profile("test") 
@Configuration 
public class TestConfiguration implements SystemConfiguration { 
    public DataSource getDataSource() { 
     // create and return dummy datasource 
    } 

    public SomeService getService() { 
     // Create and return dummy service 
    } 
} 

तो फिर आप अपने मुख्य विन्यास में इस इंजेक्षन कर सकते हैं:

@Configuration 
public class ApplicationContext { 
    @Autowired 
    private SystemConfiguration systemConfiguration; 

} 
+0

की गारंटी के समान होना चाहिए हमारे आवेदन की जटिलता को देखते हुए, यह लागू करने के लिए व्यावहारिक नहीं था। आपके द्वारा प्रस्तुत किया गया समाधान वास्तव में बहुत ही सुरुचिपूर्ण था। इस समाधान के साथ हमारे पास एक समस्या यह थी कि एक महत्वपूर्ण बीन्स को एक मॉड्यूल में परिभाषित किया गया था, जिसमें मुख्य मॉड्यूल पर निर्भरता नहीं थी (जहां एप्लीकेशनकॉन्टेक्स्ट परिभाषित किया गया है)। –

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

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