2013-02-08 34 views
5

मुझे किसी विशेष समस्या को हल करने के लिए एओपी का उपयोग करने की आवश्यकता है, लेकिन यह एक छोटा सा स्टैंडअलोन जावा प्रोग्राम (कोई जावा ईई कंटेनर नहीं है)।क्या जावा एसई पर्यावरण में javax.interceptor का उपयोग करना संभव है?

क्या मैं javax.interceptor कार्यक्षमता का उपयोग कर सकता हूं, या मुझे कुछ तृतीय-पक्ष एओपी कार्यान्वयन डाउनलोड करना है? यदि संभव हो तो मैं जावा एसई एसडीके के साथ क्या आता हूं इसका उपयोग करता हूं।

उत्तर

2

यदि आप किसी भी प्रकार के कंटेनर का उपयोग नहीं कर रहे हैं तो आपके आवेदन के लिए उपलब्ध जावा ईई इंटरसेप्टर एपीआई का कार्यान्वयन नहीं होगा।

आपको इसके बजाय AspectJ जैसे एओपी समाधान का उपयोग करना चाहिए, जिसके लिए बड़ी संख्या में ट्यूटोरियल और उदाहरण ऑनलाइन हैं। हालांकि, मैं उन उदाहरणों से चिपकने का प्रयास करने के लिए सावधान रहूंगा जो नवीनतम संस्करणों और सर्वोत्तम प्रथाओं का पालन करते हैं क्योंकि वहां बहुत पुरानी चीजें हैं।

यदि आप पहले से ही स्प्रिंग फ्रेमवर्क का उपयोग कर रहे हैं तो स्प्रिंग एओपी आपकी आवश्यकताओं को पूरा कर सकता है। यह आपके आवेदन में एकीकृत करने के लिए काफी आसान होगा, हालांकि यह आपको AspectJ की सभी विशेषताओं को नहीं देता है।

5

आप जावा एसई में सीडीआई का उपयोग कर सकते हैं लेकिन आपको अपना कार्यान्वयन प्रदान करना होगा। यहाँ संदर्भ कार्यान्वयन का उपयोग कर एक उदाहरण है - वेल्ड:

package foo; 
import org.jboss.weld.environment.se.Weld; 

public class Demo { 
    public static class Foo { 
    @Guarded public String invoke() { 
     return "Hello, World!"; 
    } 
    } 

    public static void main(String[] args) { 
    Weld weld = new Weld(); 
    Foo foo = weld.initialize() 
     .instance() 
     .select(Foo.class) 
     .get(); 
    System.out.println(foo.invoke()); 
    weld.shutdown(); 
    } 
} 

classpath के लिए एक ही है:

<dependency> 
    <groupId>org.jboss.weld.se</groupId> 
    <artifactId>weld-se</artifactId> 
    <version>1.1.10.Final</version> 
</dependency> 

एनोटेशन:

package foo; 
import java.lang.annotation.*; 
import javax.interceptor.InterceptorBinding; 

@Inherited @InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.TYPE }) 
public @interface Guarded {} 

इंटरसेप्टर कार्यान्वयन:

package foo; 
import javax.interceptor.*; 

@Guarded @Interceptor 
public class Guard { 
    @AroundInvoke 
    public Object intercept(InvocationContext invocationContext) throws Exception { 
    return "intercepted"; 
    } 
} 

वर्णनकर्ता:

<!-- META-INF/beans.xml --> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
           http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
    <interceptors> 
     <class>foo.Guard</class> 
    </interceptors> 
</beans>