2016-04-21 8 views
0

この状況があります。 これは私のVillage.javaAspectアノテーションを使用して.ajから.javaへのInter-Type宣言を変換してください。

public class Village{ 

    private Integer vid; 
    private String villageName; 
    private String district; 

    public Integer getVid() { 
     return vid; 
    } 
    public void setVid(Integer vid) { 
     this.vid = vid; 
    } 
    public String getVillageName() { 
     return villageName; 
    } 
    public void setVillageName(String villageName) { 
     this.villageName = villageName; 
    } 
    public String getDistrict() { 
     return district; 
    } 
    public void setDistrict(String district) { 
     this.district = district; 
    } 
} 

これは私のDao.javaインタフェースです:

public interface Dao<T> { 
    public void insert(); 
    public void update(); 
    public void delete(); 
} 

これは私の側面Village_Dao.aj(あなただけの静的メソッドのロジックを無視することができます)です。

import org.apache.ibatis.session.SqlSession; 
import com.madx.finance.data.utils.persistence.Dao; 
import com.madx.finance.data.utils.factory.ConnectionFactory; 

public aspect Village_Dao { 
    declare parents: Village implements Dao<Village>; 

    public void Village.insert() { 
     Village.insertVillage(this); 
    } 

    public void Village.update() { 
     Village.updateVillage(this); 
    } 

    public void Village.delete() { 
     Village.deleteVillage(this.getVid()); 
    } 

    public Village Village.getData() { 
     return Village.getDataVillage(this.getVid()); 
    } 

    public static void Village.insertVillage(Village village) { 
     SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession(); 
     VillageMapper mapper = session.getMapper(VillageMapper.class); 
     mapper.insertVillage(village); 
     session.commit(); 
     session.close(); 
    } 

    public static void Village.updateVillage(Village village) { 
     SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession(); 
     VillageMapper mapper = session.getMapper(VillageMapper.class); 
     mapper.updateVillage(village); 
     session.commit(); 
     session.close(); 
    } 

    public static void Village.deleteVillage(Integer id) { 
     SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession(); 
     VillageMapper mapper = session.getMapper(VillageMapper.class); 
     mapper.deleteVillage(id); 
     session.commit(); 
     session.close(); 
    } 

    public static Village Village.getDataVillage(Integer id) { 
     SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession(); 
     VillageMapper mapper = session.getMapper(VillageMapper.class); 
     Village village = mapper.selectVillage(id); 
     session.close(); 
     return village; 
    } 
} 

I Village_Dao.ajを注釈付きバージョンVillage_Dao_Java.javaに変換すると、成功していません。 私はクラスをDaoを実装するように管理しましたが、メソッドを書き込むことはできません(挿入、更新はこのファイルに個別に削除してくださいVillage_Dao_Java.java)。

これはVillage_Dao_Java.javaのバージョン(まだ完了していない)(私はこのlinkを読んで、私はそれがこのような場合のために働くことができませんでした)です:あなたが欲しい

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.DeclareParents; 

import com.madx.finance.data.utils.persistence.Dao; 

@Aspect 
public class Village_Dao_Java { 

    @DeclareParents("com.madx.demo.Village") 
    private Dao<Village> implementedInterface; 
} 

答えて

2

は@AspectJスタイルでは不可能ですより強力なネイティブ構文を使用する必要があります。

は、Villageという形式を、アスペクトで定義したインターフェイス実装のサブクラスである形式に変換することができます(例:この:

@Aspect 
public class Village_Dao_Java { 
    public static class VillageDao implements Dao<Village> { 
     @Override 
     public void insert() { 
      Village.insertVillage(this); 
     } 

     @Override 
     public void update() { 
      Village.updateVillage(this); 
     } 

     @Override 
     public void delete() { 
      Village.deleteVillage(this.getVid()); 
     } 

     public Village getData() { 
      return getDataVillage(this.getVid()); 
     } 

    } 

    @DeclareParents(
     value = "de.scrum_master.app.Village", 
     defaultImpl = VillageDao.class 
    ) 
    private Dao<Village> villageDao; 
} 

しかし、このアプローチにはいくつかの問題があります:あなたは

  • 方法は、将来のVillageDaoサブクラスVillageから静的メソッドにアクセスしようとするので、 VillageDaoに静的メソッドを宣言することはできませんが、Villageに直接宣言する必要があります。
  • 代わりにVillageDaoに直接宣言するとします。 VillageDao.insertVillage(this)を経由したが、thisVillageDaoであり、独自のサブクラスではないVillageであるため、署名public static void insertVillage(Village village)は適合しなくなる。 thisVillageDaoないVillageが、getterメソッドは、元のVillageクラスの固定の署名を持っているので、同様の理由で
  • あなたはthis.getVid()を呼び出すことはできません。

など。 Javaコンパイラは、AspectJコンパイラの機能を実行するのに十分強力ではありません。元のクラスファイルにコードを組み込みます。

Ergo:ネイティブ構文を守ってください。それはより強力ですが、IMOもより読みやすくなります。なぜ多くの人が強力なAspectJを貧しい代替@AspectJ構文に詰め込もうとしたのか、私は決して理解できませんでした。どういうわけか、彼らは純粋なJava構文から利益を得ると信じているようです。同意しません。彼らは技術的な手段の低下をもたらし、本格的なAOPのために使用されることを意図したものではない誤った構文が得られます。

+0

はい、私はこれがまさに私が最近結んだ結論であることに同意します。私はすべてのJavaを維持しようとしていましたが、あなたが私に言ったように、この選択の背後にある本当の理由はありません、それは2つの方法論の比較の演習に過ぎませんでした。しかし、Javaでこれを行う方法はなく、 "この"問題が主な理由です。ありがとうございました! – madx

関連する問題