2009-08-27 17 views
5

वसंत का उपयोग करके मुझे एनोटेटेड पहलू वर्ग पर निर्भरता इंजेक्शन करने में कुछ समस्याएं आई हैं। कैश सेवा को वसंत संदर्भ के स्टार्टअप पर इंजेक्शन दिया जाता है, लेकिन जब बुनाई होती है, तो यह कहता है कि कैश सेवा शून्य है। तो मुझे वसंत संदर्भ को मैन्युअल रूप से ऊपर उठाने और वहां से बीन प्राप्त करने के लिए मजबूर होना पड़ता है। क्या इसके बारे में जाने का कोई और तरीका है?वसंत निर्भरता एक एनोटेटेड पहलू इंजेक्शन

import org.apache.log4j.Logger; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import com.mzgubin.application.cache.CacheService; 

@Aspect 
public class CachingAdvice { 

    private static Logger log = Logger.getLogger(CachingAdvice.class); 

    private CacheService cacheService; 

    @Around("execution(public *com.mzgubin.application.callMethod(..)) &&" 
      + "args(params)") 
    public Object addCachingToCreateXMLFromSite(ProceedingJoinPoint pjp, InterestingParams params) throws Throwable { 
    log.debug("Weaving a method call to see if we should return something from the cache or create it from scratch by letting control flow move on"); 

    Object result = null; 
    if (getCacheService().objectExists(params))}{ 
     result = getCacheService().getObject(params); 
    } else { 
     result = pjp.proceed(pjp.getArgs()); 
     getCacheService().storeObject(params, result); 
    } 
    return result; 
    } 

    public CacheService getCacheService(){ 
    return cacheService; 
    } 

    public void setCacheService(CacheService cacheService){ 
    this.cacheService = cacheService; 
    } 
} 

उत्तर

3

समस्या, के रूप में मैं इसे समझते हैं, कि वसंत आप के लिए इस प्रकार का एक सेम पैदा कर रही है, लेकिन AspectJ ढांचा भी की एक इन्स्टेन्शियशन पैदा कर रही है है:

यहाँ मेरी पहलू का एक उदाहरण है इस प्रकार क्योंकि यह नहीं जानता कि वसंत ने ऐसा किया है।

मेरा मानना ​​है कि आप सेम भी AspectJ पता पहलू बनाई गई है देता है कि दृष्टांत के लिए उपयोग करने के लिए स्प्रिंग एक कारखाने में विधि देना चाहता हूँ:

<!-- An @Aspect-annotated class --> 
<bean id="bar" class="com.foo.bar" factory-method="aspectOf"> 
    <property name="meaning" value="42" /> 
</bean> 

श्रेय देने के लिए, मैंने पहले आज इस सवाल में आए और फिर बाद में elsewhere उत्तर मिला, इसलिए मैं लूप को बंद करने के लिए वापस आ रहा हूं।

मैं यहाँ होने वाले जादू पर क्रिस्टल स्पष्ट नहीं हूं, लेकिन मुझे लगता है कि एक पहलू वर्ग है जो इस स्वाद के कुछ स्थिर रचनाकार प्रदान करता है। संभवतः AspectJ प्रत्येक पहलू पर उसी नाम के स्थैतिक तरीकों को बुनाई कर रहा है साथ ही इस तरह के निर्माण की सुविधा प्रदान करता है।

2

मुझे भी ऐसी समस्या का सामना करना पड़ा।

यह है कि यह कैसे तय किया गया था है:

@Aspect 
public class MyAspect { 
    @Resource // telling spring that at first look up bean by name; 
    Session session; // resource that won't of being setup; 

    private static class MyAspectHolder { 
    static final MyAspect instance = new MyAspect(); 
    } 

    ... 

    // special purpose method w/o it - stuff doesnt work; 
    public static MyAspect aspectOf() { 
    return MyAspectHolder.instance; 
    } 
} 

और निश्चित रूप से न पहलू सेम परिभाषा के साथ अपने config में <aop:aspectj-autoproxy /> भूल जाते हैं।

+0

तो बस मेरे पहलू वर्ग में पहलूऑफ विधि को सेट करने से यह ठीक लगता है। निश्चित नहीं है कि यह क्यों काम कर रहा है क्योंकि मैंने देखा है कि अधिकांश अन्य सुधारों में नहीं है। बीटीडब्ल्यू ने स्प्रिंग-पहलुओं और कुछ अन्य लोगों के माध्यम से @ कॉन्फिगर करने योग्य कोशिश की लेकिन कोई भी पहलू सिंगलटन को ठीक से बीन को तार नहीं लग रहा था। – PJH

+0

यदि आप क्लासिक पहलू पहलू लिखते हैं, तो एएसपीसीओएफ स्थिर एक्सेसर पहलू संकलक द्वारा उत्पन्न होता है: –

4

चूंकि वसंत कंटेनर से पहले पहलू बनाया गया है, इसलिए आपको पहलू के फैक्ट्री विधि पहलू (exampleClass.class) से पहलू को पुनर्प्राप्त करना होगा।

स्प्रिंग एक्सएमएल विन्यास से, आप इस तरह पहलू (वस्तु) को पुनः प्राप्त कर सकते हैं:

<bean id="traceAspect" class="aspects.trace.TraceAspect" 
    factory-method="aspectOf" /> 

फैक्टरी तरीकों एक Enum तरह स्प्रिंग कंटेनर के बाहर बनाए गए वस्तुओं को पुनः प्राप्त करने के लिए सामान्य तरीका है।