簡體   English   中英

AspectJ中的類型間聲明的簡短示例是什么,它證明了該方法的有用性?

[英]What is a short example of inter-type declarations in AspectJ which demonstrates the usefulness of the approach?

我首先考慮使用ITD來定義private static final Logger logger = ...對於一些不相關的情況,但它看起來不像使用它作為演示示例的明顯改進。

是否有一些標准/建議的ITD使用示例,人們應該將其用於教學目的?

我想在Adam的回答中再添一個例子。

使用方面是一種改進軟件模塊化的方法,以及OOP,除了OOP“垂直”應用,而AOP“水平”應用。

因此,雖然可以使用建議來“水平”修改響應某些標准的所有方法的行為,但建議中的代碼也需要一些數據,而ITD可以在“水平”的同時添加這些字段,同時包含在單個編譯單元(方面)中的相關數據和代碼。

由於您是通過ITD字段添加數據,因此您可能還希望提供一些方法來操作這些字段,例如setter / getter。

我試着將它改寫幾次,我希望它很容易理解。

舉個例子,假設你有一個圖形編輯程序,用戶可以在其中創建,刪除和顯示多個形狀(非常規范的呃?:D)。

形狀有很多數據,例如它們有顏色,坐標等......它們正確地屬於類本身。 但是,由於這是一個Web 3.0應用程序,您希望用戶能夠在單個繪圖上進行協作,這意味着每個形狀必須知道它何時被更改,如果已經與其他用戶通知形狀已更改,那么它被一些實際拖動它的用戶鎖定等等。

你可以在簡單的OOP中實現它,在Shape中實現相關的部分或任何你的根類,但是你將使用像“this.setDirty(true)”之類的調用或類似的東西來污染所有的setter。

相反,你決定去AOP並在一個方面實現它。 在這種情況下,您可以在所有setter之后輕松添加建議,但是如果要優化網絡協議僅發送更改的增量,則還需要存儲“臟”布爾值,甚至是更改的屬性列表。

你可以實現它

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來說,這是你無法做到的,只需要封裝在單個編譯單元的建議,該建議所需的數據以及最終將對該數據進行操作的方法。

Java不支持多重繼承或mixin。 但是對於ITD,你可以像Scins 一樣使Scala像Traits或Ruby。

這是一個利用JPA和Spring的Configurable的例子:

接口:

package com.evocatus.aop;

public interface DomainNotify {

    public void postPersist();

    public void postUpdate();

    public void postRemove();

}

AspectJ ITD:

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的類都將獲得編織的ITD方法。

@Entity
@Configurable
public class MyJPAObject implements DomainNotify {
}

看看Spring ROO吧。 這是一個快速的開發。 使用Spring的env。 我把它看作Ruby on Rails但是在帶有Spring的java中;-)

它使用ITD來生成getter,setter,toString等...基於您在創建類時定義的屬性。

春天的路

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM