2015-09-30 7 views
17

मैं आम छोटे सेम परिभाषा कंटेनर (@Configuration) जो मैं तेजी से जैसे वसंत बूट के साथ अनुप्रयोगों को विकसित करने के लिए उपयोग का एक बहुत बनाया है:क्या स्प्रिंग @ आयात या @ कॉन्फ़िगरेशन पैरामीट्रिज्ड बनाना संभव है?

@Import({ 
    FreemarkerViewResolver.class, // registers freemarker that auto appends <#escape etc. 
    ConfigurationFromPropertiesFile.class, // loads conf/configuration.properties 
    UtfContentTypeResponse.class, // sets proper Content-language and Content-type 
    LocaleResolverWithLanguageSwitchController // Locale resolver + switch controller 
); 
class MySpringBootApp ... 

उदाहरण के लिए, इस तरह के @Configuration रों में से एक सत्र भंडारण सेट कर सकते हैं वेब नियंत्रक के साथ लोकेल कुकी चयनित भाषा आदि

पर स्विच करने के लिए वे बहुत से और पुन: उपयोग काम करने के लिए मज़ा कर रहे हैं, लेकिन यह वास्तव में यह है, जो बहुत अधिक reusege अनुमति दे सकता है parametrized बनाने के लिए बहुत अच्छा होगा।

छद्म कोड:

@Imports(imports = { 
    @FreemarkerViewResolver(escapeHtml = true, autoIncludeSpringMacros = true), 
    @ConfigurationFromProperties(path = "conf/configuration.properties"), 
    @ContentTypeResponse(encoding = "UTF-8"), 
    @LocaleResolver(switchLocaleUrl = "/locale/{loc}", defaultLocale = "en" 
}) 

तो, मैं मूल रूप से मतलब है "विन्यास @Configurations" मैं की तरह कुछ मतलब है। कॉन्फ़िगरेशन को इस तरह से बनाने का सबसे अच्छा तरीका क्या होगा?

शायद

अधिक कुछ इस तरह (फिर से, छद्म कोड):

@Configuration 
public class MyAppConfiguration { 

    @Configuration 
    public FreemarkerConfiguration freemarkerConfiguration() { 
     return FreemarkerConfigurationBuilder.withEscpeAutoAppend(); 
    } 

    @Configuration 
    public ConfigurationFromPropertiesFile conf() { 
     return ConfigurationFromPropertiesFile.fromPath("..."); 
    } 

    @Configuration 
    public LocaleResolverConfigurator loc() { 
     return LocaleResolverConfigurator.trackedInCookie().withDefaultLocale("en").withSwitchUrl("/switchlocale/{loc}"); 
    } 

उत्तर

10

मुझे Spring Boot Reference Guide - Externalized Configuration बोली करते हैं:

"स्प्रिंग बूट आप अपने विन्यास बाह्यरूप लिए ताकि आप एक ही साथ काम कर सकते की अनुमति देता है विभिन्न वातावरण में आवेदन कोड। "

मेरी राय में अनुकूलन समय पर आपके दूसरे छद्म कोड ब्लॉक जैसे एनोटेशन पैरामीटर के माध्यम से नहीं किया जाता है, इसके बजाय अनुकूलन रन टाइम पर होता है। विन्यास कक्षाओं में। मुझे अपने 3 कोड ब्लॉक अनुकूलन (केवल एक समारोह) करते हैं:

@Configuration 
public class MyAppConfiguration { 

    @Autowired 
    private Environment env; 

    // Provide a default implementation for FreeMarkerConfigurer only 
    // if the user of our config doesn't define her own configurer. 
    @Bean 
    @ConditionalOnMissingBean(FreeMarkerConfigurer.class) 
    public FreeMarkerConfigurer freemarkerConfig() { 
     FreeMarkerConfigurer result = new FreeMarkerConfigurer(); 
     result.setTemplateLoaderPath("/WEB-INF/views/"); 
     return result; 
    } 

    ... 

    @Bean 
    public LocaleResolverConfigurator loc() { 
     String defaultLocale = env.getProperty("my.app.config.defaultlocale", "en"); 
     String switchLocale = env.getProperty("my.app.config.switchlocale", "/switchlocale/{loc}"); 

     return LocaleResolverConfigurator.trackedInCookie().withDefaultLocale(defaultLocale).withSwitchUrl(switchLocale); 
    } 

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

आप कॉन्फ़िगरेशन पैरामीटर इंजेक्ट भी कर सकते हैं (यदि आप उन्हें आवृत्ति चर के रूप में रखना पसंद करते हैं) या कई अन्य स्थितियों का उपयोग करते हैं, उदा। @ConditionalOnMissingBean, @ConditionalOnClass, @ConditionalOnExpression और so on। उदाहरण के लिए @ConditionalOnClass के साथ आप यह जांच सकते हैं कि कोई वर्ग आपकी कक्षा पथ पर है या नहीं और इस वर्ग द्वारा पहचाने गए पुस्तकालय की सेटिंग प्रदान करता है। @ConditionalOnMissingClass के साथ आप एक वैकल्पिक कार्यान्वयन प्रदान कर सकते हैं। ऊपर दिए गए उदाहरण में मैंने ConditionalOnMissingBean का उपयोग FreeMarkerConfigurer के लिए डिफ़ॉल्ट कार्यान्वयन प्रदान करने के लिए किया था। यह कार्यान्वयन केवल तभी उपयोग किया जाता है जब कोई FreeMarkerConfigurer बीन उपलब्ध नहीं होता है, इस प्रकार आसानी से ओवरराइड किया जा सकता है।

स्प्रिंग बूट या समुदाय द्वारा प्रदान किए गए स्टार्टर्स पर नज़र डालें। एक अच्छा पठन भी यह blog entry है। मैंने spring-boot-starter-batch-web से बहुत कुछ सीखा, उनके पास जर्मन जावा पत्रिका में एक लेख श्रृंखला थी, लेकिन भागों भी ऑनलाइन हैं, Boot your own infrastructure – Extending Spring Boot in five steps देखें ( पढ़ना चाहिए) और विशेष रूप से अनुच्छेद "गुणों का उपयोग करके अपना स्टार्टर कॉन्फ़िगर करने योग्य बनाएं"।

+0

क्या आप सुनिश्चित हैं कि विधि एनोटेशन '@ कॉन्फ़िगरेशन' होना चाहिए? इसके अलावा, मैं गुण-संचालित कॉन्फ़िगरेशन से बहुत नापसंद करता हूं, क्योंकि मेरी अधिकांश कॉन्फ़िगरेशन पर्यावरण-निर्भर नहीं है और यह ड्राइव एक साथ मिश्रित सभी गुणों के विशाल बैग पर भी है। –

+0

@ PiotrMüller आपको शायद प्रश्न में गुणों के अपने नापसंद का जिक्र करना चाहिए क्योंकि यह बदलता है कि एक अच्छा जवाब काफी काफी है। कॉन्फ़िगरेशन फ़ाइल में अधिक संरचना प्राप्त करने का एक बहुत ही आसान तरीका वाईएएमएल का उपयोग करना है। यदि आपको वाईएएमएल भी पसंद नहीं है तो आपको इसका भी उल्लेख करना चाहिए। –

+0

1) '@ कॉन्फ़िगरेशन' एनोटेशन के लिए: मैंने अभी अपना कोड लिया और इसे "गुण-संचालित कॉन्फ़िगर" पर अपनाया। 2) आप कॉन्फ़िगरेशन डेटा के लिए भी गुणों का उपयोग कर सकते हैं जो पर्यावरण-निर्भर नहीं है। आपके दूसरे कोड ब्लॉक में सभी सेटिंग्स गुणों में कॉन्फ़िगर करने के लिए आदर्श हैं। 3) संपत्तियों के बगल में कई अन्य संभावनाएं हैं। मैंने अपना जवाब '@ ConditionalOnClass' और ब्लॉग एंट्री के लिंक के लिए एक परिदृश्य के साथ अपडेट किया। – ChrLipp

2

हालांकि मुझे आयात को पैरामीटरकृत करने का विचार पसंद है, मुझे लगता है कि अब यह @Import और @Configuration का उपयोग करने के लिए अच्छा फिट नहीं है।

मैं गतिशील विन्यास का उपयोग करने के दो तरीकों के बारे में सोच सकता हूं, जो PropertySource शैली विन्यास पर भरोसा नहीं करते हैं।

  1. एक कस्टम @ImportConfig एनोटेशन और एनोटेशन प्रोसेसर है कि विन्यास गुण है कि हार्ड-कोडेड उत्पन्न स्रोत फ़ाइलों में हैं स्वीकार करता है बनाएँ।
  2. क्रमशः अपने शामिल बीन्स को जोड़ने या कुशल बनाने के लिए BeanFactoryPostProcessor या BeanPostProcessor का उपयोग करें।

न तो विशेष रूप से सरल आईएमओ है, लेकिन ऐसा लगता है कि आपके पास काम करने का एक विशेष तरीका है। तो यह निवेश किए गए समय के लायक हो सकता है।

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