2015-04-24 8 views
22

मुझे वसंत एनोटेशन कॉन्फ़िगरेशन के बारे में एक प्रश्न है। मैं एक सेम है:सशर्त वसंत बीन निर्माण

@Bean 
public ObservationWebSocketClient observationWebSocketClient(){ 
    log.info("creating web socket connection..."); 
    return new ObservationWebSocketClient(); 
} 

और मैं एक संपत्ति फ़ाइल है:

@Autowired 
Environment env; 

संपत्ति फ़ाइल में मैं एक विशेष बूलियन संपत्ति

createWebsocket=true/false 

जो एक सेम है कि क्या संकेत करना चाहते हैं ObservationWebSocketClient बनाया जाना चाहिए। यदि संपत्ति मूल्य गलत है तो मैं इंस्टालिक वेब सॉकेट कनेक्शन बिल्कुल नहीं चाहता हूं।

क्या इसका एहसास करने के लिए कोई तकनीकी संभावना है?

+0

आपके प्रश्न का सीधा जवाब नहीं है, लेकिन शायद आपके लिए उपयुक्त वसंत प्रोफ़ाइल है? तो बीन केवल उस प्रोफ़ाइल में बनाया जाता है जहां इसकी आवश्यकता होती है (उदाहरण के लिए परीक्षण, विकास, उत्पादन ...) – DrunkenPope

उत्तर

31

हालांकि मैंने इस कार्यक्षमता का उपयोग नहीं किया है, ऐसा लगता है कि आप इसे वसंत 4 के @Conditional annotation के साथ कर सकते हैं।

सबसे पहले, एक Condition वर्ग, जिसमें ConditionContextEnvironment की पहुंच है बनाने के लिए:

public class MyCondition implements Condition { 
    @Override 
    public boolean matches(ConditionContext context, 
          AnnotatedTypeMetadata metadata) { 
     Environment env = context.getEnvironment(); 
     return null != env 
       && "true".equals(env.getProperty("createWebSocket")); 
    } 
} 

फिर अपने सेम व्याख्या:

@Bean 
@Conditional(MyCondition.class) 
public ObservationWebSocketClient observationWebSocketClient(){ 
    log.info("creating web socket connection..."); 
    return new ObservationWebSocketClient(); 
} 

संपादितspring-boot एनोटेशन @ConditionalOnProperty इस लागू किया गया है सामान्य रूप से; Condition के लिए स्रोत कोड उन लोगों के लिए is available on github here का मूल्यांकन करने के लिए उपयोग किया जाता है। यदि आपको खुद को अक्सर इस funcitonality की आवश्यकता है, तो इसी तरह के कार्यान्वयन का उपयोग करके Condition कार्यान्वयन के बहुत सारे बनाने के बजाय सलाह दी जाएगी।

+0

@chrylis बेहतर समाधान क्या है? 'अवलोकन WebSocketClient' विधि से' null' लौट रहा है? – beerbajay

+0

पोस्ट किया गया (मोबाइल पर टाइप करने में कुछ समय लगा)। – chrylis

+0

कृपया ConditionalOnProperty का उपयोग करने के नीचे दिए गए सुझाव पर एक नज़र डालें। ऐसा लगता है कि यह अधिक प्रभावी है। –

24

@ConditionalOnProperty("createWebSocket") के साथ अपनी बीन विधि एनोटेट करें।

ध्यान दें कि स्प्रिंग बूट कई उपयोगी स्थितियों को प्रीपेक किए गए हैं।

+4

क्या यह 'वसंत-बूट' विशिष्ट है? – beerbajay

+0

@bebbayay मुझे विश्वास नहीं है, और यदि ऐसा है, तो एनोटेशन को स्वत: कॉन्फ़िगरेशन सक्षम किए बिना शामिल किया जा सकता है। यह सामान्य रूप से सामान्य और पूर्व-कार्यान्वित को छोड़कर, आपके सुझाव के समान ही है। – chrylis

+1

हरम, केवल 'वसंत-बूट' प्रतीत होता है: [javadocs] (http://docs.spring.io/autorepo/docs/spring-boot/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty .html) – beerbajay

0

मेरे लिए, इस समस्या आधारित जब @Profiles कर सकते हैं तर्क केवल पर, स्प्रिंग 3.1 @Profiles का उपयोग करके हल किया जा सकता है, क्योंकि @Conditional एनोटेशन आप अवसर के लिए सशर्त सेम पंजीकरण (सशर्त जांच के लिए उपयोगकर्ता परिभाषित रणनीतियों) के लिए कुछ रणनीति को परिभाषित देना Environment केवल चर।

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