2016-04-21 25 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