2011-09-13 6 views
8

मैंने पहले कुछ असंबंधित मामलों के लिए private static final Logger logger = ... को परिभाषित करने के लिए आईटीडी का उपयोग करने के बारे में सोचा था, लेकिन यह एक प्रदर्शन उदाहरण के रूप में उपयोग करने के लिए एक स्पष्ट सुधार की तरह पर्याप्त नहीं दिखता है।AspectJ में अंतर-प्रकार की घोषणाओं का एक छोटा सा उदाहरण क्या है जो दृष्टिकोण की उपयोगिता को प्रदर्शित करता है?

वहाँ कुछ मानक है/आईटीडी उपयोग, जो लोगों को शिक्षण उद्देश्यों के लिए उपयोग करना चाहिए के उदाहरण का सुझाव दिया?

उत्तर

14

मैं एडम के उत्तर में एक और उदाहरण जोड़ना चाहता हूं।

पहलुओं का उपयोग करना आपके सॉफ़्टवेयर के मॉड्यूलरलाइज़ेशन को बेहतर बनाने का एक तरीका है, साथ ही ओओपी है, सिवाय इसके कि ओओपी "लंबवत" लागू होता है, जबकि एओपी "क्षैतिज" लागू होता है।

तो, सलाह के दौरान कुछ मानदंडों का जवाब देने वाले सभी तरीकों के व्यवहार को क्षैतिज रूप से संशोधित करने के लिए सलाह का उपयोग किया जा सकता है, सलाह में aften कोड को कुछ डेटा की आवश्यकता होगी, और आईटीडी उन क्षेत्रों को "क्षैतिज" जोड़ना संभव बनाता है एक ही समय में एक संकलन इकाई (पहलू) संबंधित डेटा और कोड में शामिल होता है।

आप आईटीडी क्षेत्रों के माध्यम से डेटा जोड़ रहे हैं के बाद से, आप शायद भी कुछ विधि की पेशकश करने के लिए एक सेटर/गेटर की तरह उन क्षेत्रों में हेरफेर करने, चाहता हूँ।

मैं इसे कई बार अलग तरीके से व्यक्त करने की कोशिश की, मुझे आशा है कि यह समझना आसान है।

आपको एक उदाहरण देने के लिए, मान लें कि आपके पास एक ग्राफिकल संपादन प्रोग्राम है, जहां उपयोगकर्ता कई आकारों को बना, हटा और प्रदर्शित कर सकता है (सुंदर कैननिकल एएच?: डी)।

आकारों में बहुत अधिक डेटा है, उदाहरण के लिए उनके पास एक रंग, निर्देशांक आदि है .. जो सही ढंग से कक्षा से संबंधित हैं। हालांकि, चूंकि यह एक वेब 3.0 एप्लिकेशन है, इसलिए आप चाहते हैं कि उपयोगकर्ता एक ही ड्राइंग पर सहयोग करने में सक्षम हों, जिसका अर्थ है कि प्रत्येक आकार को यह बदला जाना चाहिए कि यह कब बदला जाता है, अगर इसे अन्य उपयोगकर्ताओं को बताया गया है कि आकार बदल गया है, तो इसे गीला करें कुछ उपयोगकर्ता द्वारा लॉक किया गया है जो वास्तव में इसे खींच रहा है ..

आप इसे सरल ओओपी में कर सकते हैं, आकार में प्रासंगिक भागों को लागू कर सकते हैं या जो भी आपकी मूल कक्षा है, लेकिन आप अपने सभी सेटर्स को " .setDirty (सत्य) "या इसी तरह की चीजें।

इसके बजाय, आप एओपी जाने और इसे एक पहलू में लागू करने का निर्णय लेते हैं। इस मामले में, आप आसानी से सभी सेटर्स के बाद एक सलाह जोड़ सकते हैं, लेकिन आपको "गंदे" बुलियन, या यहां तक ​​कि गुणों की एक सूची भी स्टोर करने की आवश्यकता होगी, यदि आप अपने नेटवर्क प्रोटोकॉल को केवल परिवर्तनों के डेल्टा को अनुकूलित करना चाहते हैं।

आप की तरह

public aspect ShapesAreDirtyThings { 

    private boolean Shape.dirty; 

    after(Shape s) : execution(* Shape+.set*(..)) { 
     s.dirty = true; 
     // Set some other global field, start a thread to communicate 
     // to other users about the change, whatever .. 
    } 

    public boolean Shape.isDirty() { 
     return s.dirty; 
    } 

    public boolean Shape.findDirtyChildren() { // whatever 
} 

इसे लागू कर सकता है यह कुछ भी नहीं है आप आम AOP के साथ ऐसा नहीं कर सकते है, एक भी संकलन इकाई सलाह में encapsulating की बस एक बात है, कि सलाह की जरूरत डेटा, और विधियों कि अंततः होगा है उस डेटा पर काम करें।

8

जावा एकाधिक विरासत या मिश्रण का समर्थन नहीं करता है। लेकिन आईटीडी के साथ आप Scala like Traits या रूबी मिक्सिन्स की तरह बना सकते हैं।

यहाँ एक उदाहरण का लाभ लेने है जेपीए और स्प्रिंग के विन्यास:

इंटरफ़ेस:

package com.evocatus.aop; 

public interface DomainNotify { 

    public void postPersist(); 

    public void postUpdate(); 

    public void postRemove(); 

} 

AspectJ आईटीडी:

package com.evocatus.aop; 

import javax.persistence.PostPersist; 
import javax.persistence.PostRemove; 
import javax.persistence.PostUpdate; 
import javax.persistence.Transient; 

import org.codehaus.jackson.annotate.JsonIgnore; 
import org.springframework.beans.factory.annotation.Autowired; 

import com.evocatus.service.DomainNotifyService; 


    privileged aspect DomainNotifyAdvice { 

     @JsonIgnore 
     @Transient 
     @Autowired 
     transient DomainNotifyService DomainNotify.domainNotifyService; 

     @PostPersist 
     public void DomainNotify.postPersist() { 
      this.domainNotifyService.publishSave(this); 
     } 

     @PostUpdate 
     public void DomainNotify.postUpdate() { 
      this.domainNotifyService.publishUpdate(this); 
     } 

     @PostRemove 
     public void DomainNotify.postRemove() { 
      this.domainNotifyService.publishRemove(this); 
     } 

    } 

अब किसी भी वर्ग कि लागू करता DomainNotify होगा

में आईटीडी विधियों को बुनाई प्राप्त करें
@Entity 
@Configurable 
public class MyJPAObject implements DomainNotify { 
} 
3

स्प्रिंग आरओओ पर एक नज़र डालें। यह एक तेज़ देव है। वसंत का उपयोग कर env। मैं इसे रेल पर रूबी के रूप में देखता हूं लेकिन वसंत के साथ जावा में ;-)

यह आपकी कक्षा बनाने के दौरान परिभाषित विशेषताओं के आधार पर गेटटर, सेटर, टूस्ट्रिंग इत्यादि उत्पन्न करने के लिए आईटीडी का उपयोग करता है।

Spring Roo

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

  • कोई संबंधित समस्या नहीं^_^