由于JBoss AOP暂时的一些限制,比如不能截取系统类,和Tomcat结合起来使用比较困难,先用AspectJ来实践了一下,确实比较方便,下列代码主要展示如何实践的大概框架,简陋至极。
1.PositionManager public abstract class PositionManager { protected static PositionManager self = null; public abstract void addPosition(Position p); public static PositionManager getInstance(){ if(self == null) self = new PositionManagerImpl(); return self; } }
2.PositionManagerImpl实际实现PositionManager的业务逻辑 public class PositionManagerImpl extends PositionManager { protected ArrayList positions = new ArrayList(); /* (non-Javadoc) * @see com.airinbox.jaidwapfactory.position.PositionManager#addPosition(com.airinbox.jaidwapfactory.position.Position) */ public void addPosition(Position p) { System.out.println("add position"); if(!positions.contains(p)) positions.add(p); } }
3.CategoryManager public abstract class CategoryManager { protected static CategoryManager self = null; public abstract void addCategory(Category c); public static CategoryManager getInstance() { if(self == null) self = new CategoryManagerImpl(); return self; } }
4.CategoryManagerImpl public class CategoryManagerImpl extends CategoryManager { protected ArrayList categories = new ArrayList(); /* (non-Javadoc) * @see com.airinbox.jaidwapfactory.Category.CategoryManager#addCategory(com.airinbox.jaidwapfactory.Category.Category) */ public void addCategory(Category c) { System.out.println("add category"); if(!categories.contains(c)) categories.add(c); } }
5.PositionAspect:最关键的aspect的声明,主要说明了如何截取子类的实例,如何获得方法调用的参数等等,由于方法可能会在Jsp中调用,减少麻烦,pointcut声明的时候一般不用call,而用execution。 public aspect PositionAspect { after(Position p) : execution(void PositionManager+.addPosition(Position+)) && args(p){ CategoryManager cm = CategoryManager.getInstance(); Category c = new CategoryImpl(p.getId(),p.getName()); cm.addCategory(c); } }
发布到tomcat的时候,只要把aspectjrt.jar copy到$tomcat_home/common/lib目录下就可以了 
|