AOP

      AOP是OOP的延续,是Aspect   Oriented   Programming的缩写,意思是面向切面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

 

     还是用例子来说明一切,比如现在有一个DomainObjDAO接口以及其实现类DomainObjDAOImpl
DomainObjDAO.java:
public interface DomainObjDAO {
public void save();
}
DomainObjDAOImpl:
public class DomainObjDAOImpl implements DomainObjDAO {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void save() {
System.out.println("saving domain object......");
}

 

 

    

动态代理实现AOP

public class LockHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName()); 
private Object originalObject;

public Object bind(Object obj) {
logger.info("coming here...");
this.originalObject = obj;
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),this);}

public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
Object result=null;
if(arg1.getName().startsWith("save")){
lock();
result=arg1.invoke(this.originalObject,arg2);
unlock();
}
return result;
}
private void lock(){
logger.info("lock object...");
}
private void unlock(){
logger.info("unlock object...");
}
}
上述代码中并没有出现与具体应用层相关的接口以及类的引用,所以对所有的类都适用。这便解决了用普通Proxy类实现的弊端。但是动态代理要求所代理的类必须是某个接口的实现(这点可以通过obj.getClass().getInterfaces()看出),不过这也符合面向对象的设计思想,如果所代理的类没有实现任何接口,可以通过GCLIB来实现,这里就不再详述。

原文地址:https://www.cnblogs.com/a892647300/p/2655824.html