2012-12-06 31 views
5

के लिए एक AspectJ सलाह मैं आदिम Pointcut के साथ सरल पहलू लिखा और विधि सलाह है:सेट स्थिर विधि

@Aspect 
public class MyAspect { 

    @Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))") 
    public void someMethodInvoke() { } 

    @AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult") 
    public void decrementProductCount(List<String> comparisonResult) { 
    //some actions 
    } 
} 

मैं निम्नलिखित है वसंत एनोटेशन आधारित अनुप्रयोग config:

@Configuration 
@EnableAspectJAutoProxy 
public class AppConfig { 
    //... 
} 

और उपयोगिता में वर्ग com.mtag.util पैकेज:

public class SomeUtil { 
    static List<String> someMethod(List<String> oldList, List<String> newList) { 
    //... 
    } 
} 

लेकिन

जब मैं फोन +०१२३५१६४१०
SomeUtil.someMethod(arg1, arg2); 

यूनिट परीक्षण में मैं देख सकता हूं कि विधि कॉल को अवरुद्ध नहीं किया गया है और मेरी @AfterReturning सलाह काम नहीं कर रही है।

लेकिन अगर मैं

@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))") 

करने के लिए बदल (गैर स्थिर) विधि, pointcut someMethod() उदाहरण के लिए टाइप करें और @Component एनोटेशन और कॉल लक्ष्य जोड़कर स्प्रिंग द्वारा SomeUtil सेम का प्रबंधन इस तरह metod:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class) 
public class SomeUtilTest { 

    @Autowired 
    private SomeUtil someUtil; 

    @Test 
    public void categoriesDiffCalc() { 
     List<String> result = someUtil.someMethod(...); 
    } 
} 

सबकुछ ठीक है।

किस तरह से मैं स्थिर विधि के लिए एक सलाह सेट कर सकता हूं?

+0

'@AfterReturning (value =" someMethodInvoke()) "' आप एक अतिरिक्त ब्रैकेट – tibtof

+0

@izhamoidsin है, बशर्ते जवाब है पढ़ें। या यह गलत है? –

उत्तर

4

वास्तव में वसंत ढांचे में ऑटो प्रॉक्सी का उपयोग करके स्थिर विधियों को रोकने के लिए कोई समाधान नहीं है। आपको एलडब्ल्यूटी एस्पेक्टजे समाधान का उपयोग करना चाहिए।

संक्षेप में आपको एक ही एनोटेशन का उपयोग करना चाहिए लेकिन कुछ अतिरिक्त कॉन्फ़िगरेशन के साथ।

1) वसंत संदर्भ फ़ाइल के आगे पंक्ति जोड़ें:

<context:load-time-weaver/> 

(अपनी स्थिति यह आवश्यक नहीं है)

2) दुर्भाग्य से आप भी META-INF/aop जोड़ना चाहिए में हो सकता है। एक्सएमएल। उदाहरण:

<weaver> 
    <include within="com.example.ClassA"/> <!-- путь к конкретному классу --> 
    <include within="com.log.* "/> <!—путь к пакету с аспектами> 
</weaver> 
<aspects> 
    <aspect name="com.log.AspectA"/> 
</aspects> 

3) जब JVM तर्क

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar 

शुरू कर जोड़ा जाना चाहिए।

तो यह समाधान बल्कि श्रमिक है।

अधिक जानकारी के लिए (मेरे द्वारा) को स्वीकार कर लिया 7.8.4 अध्याय यहाँ http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

+1

अच्छा जवाब, यूजीन। मुझे यह भी नहीं लगता कि यह समाधान श्रमिक है। एक बार यह स्थापित हो जाने के बाद यह हमेशा के लिए काम करेगा। :-) दूर, अगर आप अतिरिक्त रनटाइम कॉन्फ़िगरेशन से बचना चाहते हैं तो भी आप संकलन-समय बुनाई का उपयोग कर सकते हैं। – kriegaex

+0

हाँ, मेरा मतलब था कि यह समाधान श्रमिक गैर-स्थैतिक तरीकों को रोकने पर निर्भर करता है, लेकिन मेरे लिए यह जांच करने के लिए श्रमिक था। =) –

+0

क्या आप कोड में टिप्पणियों का अनुवाद कर सकते हैं? – Kwadz