2016-04-21 61 views
0

我有這種情況。 這是我Village.java使用Aspect註釋將Inter-Type中的.aj轉換爲.java

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; 
    } 
} 

我努力沒有成功將Village_Dao.aj轉換爲註釋版本Village_Dao_Java.java。 我只是設法讓這個類實現Dao,但我無法設法寫入這些方法(在這個文件Village_Dao_Java.java中單獨插入,更新e刪除)。

這是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風格,你需要使用更強大的本地語法。 (你爲什麼要切換呢?)

這背後的原因是,Java編譯器只能轉換@DeclareParents的形式,其中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; 
} 

但這種方法有幾個問題:

  • 的方法試圖從未來VillageDaoVillage訪問靜態方法,所以你無法聲明VillageDao中的靜態方法,但必須直接在Village中聲明它們。
  • 如果您要直接在VillageDao中聲明它們,您可以打電話給他們,例如通過VillageDao.insertVillage(this),但然後簽名public static void insertVillage(Village village)將不再適合,因爲thisVillageDao,而不是它自己的子類Village
  • 出於類似的原因,你不能叫this.getVid()因爲thisVillageDao,而不是一個Village,但getter方法有原Village類固定的簽名。

等等。 Java編譯器的功能不足以完成AspectJ編譯器的功能:將代碼編織到原始類文件中。

Ergo:請堅持本地語法。它不僅更強大,而且IMO更具可讀性。我從來不明白爲什麼有那麼多人試圖將強大的AspectJ轉換爲糟糕的替代@AspectJ語法。不知何故,他們似乎相信從純Java語法中獲得收益。我不同意。他們只是技術手段的退化和語法錯誤從來不打算用於全面的AOP。

+0

是的,我同意這正是我在這些日子裏達成的結論。我試圖用java保留所有的東西,但正如你告訴我的那樣,這個選擇背後並沒有真正的原因,它只是兩種方法之間的比較練習。但是在java中沒有辦法做到這一點,「這個」問題是主要原因。謝謝! – madx