2015-12-08 12 views
12

मैं स्प्रिंगबूट और स्प्रिंग-वेब के साथ जावा कॉन्फ़िगरेशन के साथ स्प्रिंग 4 का उपयोग कर रहा हूं।जावा कॉन्फ़िगरेशन द्वारा CommonAnnotationBeanPostProcessor के माध्यम से @PostConstruct को सक्रिय करने का उचित तरीका क्या है?

मेरी @PostConstruct एनोटेट लांच पर स्प्रिंग द्वारा निष्पादित तरीकों के लिए, यह संदर्भ के साथ CommonAnnotationBeanPostProcessor रजिस्टर करने के लिए आवश्यक है, अन्यथा @PostConstruct नजरअंदाज कर दिया है।

एक XML- आधारित स्प्रिंग विन्यास में, डॉक्स (सेम तत्व से कम) का उपयोग करने के

<context:annotation-config/> 

मैं भी एक उदाहरण है जहां पंजीकरण, एक व्यक्ति की फलियों के आधार पर किया जाता है ताकि तरह देखा है कहते हैं:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /> 

मैं यदि संभव हो तो इससे बचना चाहते हैं। मेरे प्रोजेक्ट में कोई भी XML फ़ाइल शामिल नहीं है, और मेरे निर्माण फ़ोल्डर में मेरे लिए कोई भी जेनरेट नहीं किया गया है।

वर्तमान में, मेरी समाधान @ComponentScan साथ मेरी कक्षा टिप्पणी करने के लिए, मैं कारणों का मानना ​​है कि जो पता लगाने और रजिस्टर @Component और @Bean रों को वसंत है। किसी भी तरह, यह CommonAnnotationBeanPostProcessor का आह्वान करने का कारण बनता है, हालांकि मुझे नहीं पता कि क्यों, लेकिन यह मेरी समस्या हल करता है!

(इस वर्ग के एक @Autowired संपत्ति है, जो स्टार्टअप पर अशक्त है - इसलिए @PostConstruct के माध्यम से प्रारंभ करने की ज़रूरत)

लेकिन फिर, मेरे सवाल, क्या उचित तरीका यह जावा का उपयोग कर प्राप्त करने के लिए है विन्यास? धन्यवाद!

+0

आपको इस संदर्भ को बताना होगा कि आप एनोटेशन का उपयोग करना चाहते हैं, या तो मैन्युअल रूप से सभी 'बीनपोस्टप्रोसेसर' (अनुशंसित नहीं) पंजीकरण करके या '' का उपयोग करके (जो पहले से ही ' <संदर्भ: घटक-स्कैन /> 'या 'एप्लिकेशन कॉन्टेक्स्ट' कार्यान्वयन का उपयोग करके डिफ़ॉल्ट रूप से 'एनोटेशन कॉन्फिग एप्प्लिकेशन कॉन्टेक्स्ट' जैसी टिप्पणियां का उपयोग करता है। ऐसा करने का कोई भी उचित तरीका नहीं है, उल्लिखित तरीके मान्य हैं। –

+0

तथ्य यह है कि आप एक '@ ऑटोवायर' संपत्ति है जो शून्य नहीं है, वसंत को ऑटोवायर करना चाहिए। आम तौर पर इसका तात्पर्य है कि आपने उस संदर्भ को नहीं बताया है जिसे आप एनोटेशन का उपयोग करना चाहते हैं। –

+0

@ एम। दीनम धन्यवाद। स्पष्टीकरण के लिए, '@ Autowired' प्रॉपर्टी इंजेक्शन दी गई है लेकिन स्थिर/इंस्टेंस कन्स्ट्रक्टर चल रहे समय पर मान अभी तक उपलब्ध नहीं है, इसलिए @PostConstruct का उपयोग संदर्भ *** कुछ *** एनोटेशन के बारे में पता है, (शायद '@ स्प्रिंगबूट एप्लिकेशन', '@ कॉन्फ़िगरेशन' और '@ घटक' के माध्यम से जो मैं उपयोग करता हूं), लेकिन दस्तावेज़ बताते हैं कि @PostConstruct उनमें से एक नहीं है और इसलिए 'CommonAnotationBeanPostProcessor' को सूचीबद्ध करने का कोई तरीका आवश्यक है। मैं जावा कॉन्फ़िगरेशन के साथ संगत होने के लिए इस तरह से चाहता हूं, (एक्सएमएल के बिना)। – zkn

उत्तर

8

आप वैकल्पिक समाधान के रूप में InitializingBean का उपयोग कर सकते हैं।

बस इस इंटरफ़ेस को बढ़ाएं और afterPropertiesSet विधि को ओवरराइड करें जिसे पोस्ट निर्माण की तरह बीन के सभी गुणों को सेट करने के बाद बुलाया जाएगा।

उदाहरण के लिए:

@Component 
public class MyBean implements InitializingBean 
{ 
    @Override 
    public void afterPropertiesSet() 
    { 
     // do whatever you want to do here 
    } 
} 
+2

धन्यवाद। यह काम करता हैं। यहाँ मैं क्या किया है: 'code' @Component सार्वजनिक वर्ग उदाहरण लागू करता InitializingBean { \t @Autowired \t निजी MyThing myThing; \t @Override \t सार्वजनिक शून्य afterPropertiesSet() अपवाद {बाद यह इंजेक्शन दिया गया है \t \t //, यहाँ myThing का इस्तेमाल करते हैं फेंकता है। \t} } 'कोड' @ ब्राज मैं इस ज्ञान के लिए अधिक ज्ञान इकट्ठा करने के लिए इस प्रश्न के लिए अनुत्तरित छोड़ दूंगा। इसे कुछ दिनों में बंद कर देगा। – zkn

+0

स्प्रिंग प्रलेखन इस इंटरफ़ेस का उपयोग करने के लिए हतोत्साहित करता है क्योंकि यह अनावश्यक रूप से स्प्रिंग को कोड जोड़ता है। [प्रारंभिक कॉलबैक] (https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-lifecycle-initializingbean) – rvheddeg

+0

@rvheddeg मैं आपसे सहमत हूं। एक और तरीके से हम '@ पोस्टकंट्रक्ट' एनोटेशन या 'इनिट-विधि' का उपयोग कर सकते हैं। [उदाहरण] (https://www.mkyong.com/spring/spring-postconstruct-and-predestroy-example/) – Braj

0

यह नहीं मेरे सवाल के जवाब के रूप उत्पन्न, लेकिन एक और वैकल्पिक समाधान है।

मैं Lifecycle इंटरफ़ेस को कार्यान्वित कर सकता था और start() विधि में अपना प्रारंभिक कार्य कर सकता था। उस समय मुझे isRunning() विधि के लिए वापस लौटने के लिए स्टंप किया गया था, हालांकि हिंडसाइट का कहना है कि return true काफी अच्छा रहा होगा क्योंकि इसका जीवनकाल आवेदन-लंबा है। उस बिंदु पर किसी भी सुझाव का स्वागत किया जाएगा।

public interface Lifecycle { 

    void start(); 

    void stop(); 

    boolean isRunning(); 

} 

अन्य विकल्प,, here से अनुमान लगाया जा सकता है अर्थात्

<beans default-init-method="init"> 

जो, मैं इकट्ठा हर इसकी वैकल्पिक init() विधि कहा जाता@Bean है की अनुमति देता है। (मैंने कोशिश नहीं की है)।

फिर भी, मैं जावा कॉन्फ़िगरेशन का उपयोग करने वाले मेरे प्रश्न का उत्तर देने की उम्मीद कर रहा हूं।

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

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