java - @ आस्पेक्ट पहलू के लिए स्प्रिंग ऑटोवायर बीन शून्य है




spring aop (6)

मेरे पास निम्न वसंत विन्यास है:

<context:component-scan base-package="uk.co.mysite.googlecontactsync.aop"/>

<bean name="simpleEmailSender" class="uk.co.mysite.util.email.simple.SimpleEmailSenderImplementation"/>

<aop:aspectj-autoproxy/>

तब मेरे पास एक पहलू है:

@Aspect
public class SyncLoggingAspect {
    @Autowired
    private SimpleEmailSender simpleEmailSender

    @AfterReturning(value="execution(* uk.co.mysite.datasync.polling.Poller+.doPoll())", returning="pusher")
    public void afterPoll(Pusher pusher) {      
        simpleEmailSender.send(new PusherEmail(pusher));
    }
}

यह पहलू काम करता है (मैं बाद में रोल पर ब्रेकपॉइंट हिट कर सकता हूं) लेकिन सरलइमेलसेडर शून्य है। दुर्भाग्य से मुझे स्पष्ट दस्तावेज नहीं मिल रहा है कि यह क्यों है। (रिकॉर्ड के लिए, मेरा सरल ईमेल मेलर बीन मौजूद है और अन्य वर्गों में सही तरीके से वायर्ड है) निम्नलिखित चीजें मुझे भ्रमित करती हैं:

  1. संदर्भ है: घटक-स्कैन @ एस्पेक्ट उठा रहा है? यदि यह निश्चित रूप से एक वसंत प्रबंधित बीन होगा, तो इस प्रकार स्वायत्त काम करना चाहिए?
  2. यदि संदर्भ: घटक-स्कैन पहलुओं को बनाने के लिए नहीं है, तो मेरा पहलू कैसे बनाया जा रहा है? मैंने सोचा था कि एओपी: पहलू-ऑटोप्रोक्सी सिर्फ मेरी @ एस्पेक्ट क्लास प्रॉक्सी करने के लिए एक बीनपोस्टप्रोसेसर बनाता है? यह कैसे होगा यदि यह वसंत प्रबंधित बीन नहीं है?

जाहिर है आप बता सकते हैं कि मुझे समझ में नहीं आता कि चीजों को जमीन से कैसे काम करना चाहिए।


AspectJ के साथ @Autowired का उपयोग करने के लिए स्प्रिंग बूट के लिए मुझे निम्न विधि मिली है। कॉन्फ़िगरेशन क्लास में अपना पहलू जोड़ें:

@Configuration
@ComponentScan("com.kirillch.eqrul")
public class AspectConfig {

    @Bean
    public EmailAspect theAspect() {
        EmailAspect aspect = Aspects.aspectOf(EmailAspect.class);
        return aspect;
    }

}

फिर आप अपने पहलू वर्ग में अपनी सेवाओं को सफलतापूर्वक स्वत: कर सकते हैं:

@Aspect
public class EmailAspect {

    @Autowired
    EmailService emailService;

एक और विकल्प एक्सएमएल के साथ गड़बड़ करने की बजाय अपने पहलू वर्ग में @Configurable करने @Configurable है।


पहलू एक सिंगलटन वस्तु है और वसंत कंटेनर के बाहर बनाया गया है। एक्सएमएल कॉन्फ़िगरेशन के साथ एक समाधान पहलू को पुनः प्राप्त करने के लिए स्प्रिंग की फैक्ट्री विधि का उपयोग करना है।

<bean id="syncLoggingAspect" class="uk.co.demo.SyncLoggingAspect" 
     factory-method="aspectOf" />

इस कॉन्फ़िगरेशन के साथ पहलू को किसी अन्य स्प्रिंग बीन के रूप में माना जाएगा और ऑटोवायरिंग सामान्य के रूप में काम करेगी।

आपको वसंत कंटेनर के बाहर बनाए गए कन्स्ट्रक्टर या ऑब्जेक्ट्स के बिना एनम ऑब्जेक्ट्स और अन्य ऑब्जेक्ट्स पर फ़ैक्टरी-विधि का भी उपयोग करना होगा।


पहलू वर्ग में @ कॉम्पोनेंट जोड़ें और आपकी निर्भरताओं को स्वचालित रूप से इंजेक्शन दिया जाना चाहिए। और संदर्भ जोड़ें: पैकेज के लिए घटक-स्कैन जहां आपका पहलू वसंत संदर्भ फ़ाइल में है।

@Component
@Aspect
public class SomeAspect {
    /* following dependency should get injected */
    @Autowired
    SomeTask someTask;
    /* rest of code */  
}

यह ब्लॉग पोस्ट वास्तव में अच्छी तरह से बताता है। इस तथ्य के कारण कि वसंत कंटेनर के बाहर पहलू सिंगलटन बनाया गया है, आपको फैक्ट्री-विधि = "पहलूओएफ" का उपयोग करने की आवश्यकता होगी जो केवल AspectJ (स्प्रिंग एओपी नहीं) द्वारा बुने जाने के बाद उपलब्ध है:

नोटिस फैक्ट्री-विधि = "पहलूऑफ" जो स्प्रिंग को इस बीन को बनाने के लिए वास्तविक AspectJ (स्प्रिंग एओपी नहीं) पहलू का उपयोग करने के लिए कहता है। ताकि उसके बाद पहने जाने के पहलू के बाद "पहलू" विधि हो।

इसलिए कि :

कोई मिलान करने वाली फैक्ट्री विधि नहीं मिली: फैक्ट्री विधि 'पहलूऑफ ()' - इसका मतलब यह होगा कि पहलू AspectJ वीवर द्वारा बुना नहीं गया था।

वसंत 3.1 के साथ अपने अनुभव से, यदि मैं निर्भरता इंजेक्शन के लिए @Autowired लेकिन पारंपरिक सेटर का उपयोग नहीं करता हूं, तो यह इंजेक्शन हो जाता है और पहलू जे वीवर के बिना अपेक्षित काम करता है। हालांकि मुझे सिंगलटन होने के पहलू के साथ समस्याएं आ रही हैं ... इसका परिणाम 'पर्थिस' तत्काल मॉडल में होता है। ।


संकलन समय का उपयोग करें, प्लगइन उदाहरण के लिए देखें: https://github.com/avner-levy/minimal_spring_hibernate_maven_setup/blob/master/pom.xml

एनोटेशन और स्प्रिंग कॉन्फ़िगरेशन का निम्नलिखित संयोजन मेरे लिए काम करता है टोबीस / विली / एरिक द्वारा उपरोक्त नोट्स के लिए धन्यवाद:

वर्ग:

package com.abc
@Configurable
@Aspect
public class MyAspect {
   @Autowired
   protected SomeType someAutoWiredField;
}

एक्सएमएल:

<context:spring-configured />
<context:component-scan base-package="com.abc" />






spring-aop