AOP是OOP的一种实现,将业务代码进行隔离,降低逻辑代码之间的耦合度,提高代码复用率,经常用在日志处理,权限控制,事务处理,Struts2的过滤器拦截器等。我们首先通过学习动态代理认识AOP原理,然后进行AOP概念的论述。
下面代码通过实现InvocationHandler接口实现代理控制接口:
public class LogProxy implements InvocationHandler {
private Logger logger=Logger.getLogger(this.getClass().getName());
private Object delegate; //要实现的代理对象
public Object bind(Object delegate){
this.delegate=delegate;
//返回代理类
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
try{
logger.log(Level.INFO,args[0]+"开始审核数据...");
result=method.invoke(delegate, args);
logger.log(Level.INFO,args[0]+"审核数据结束...");
}catch(Exception e){
logger.log(Level.INFO,e.toString());
}
return result;
}
}
方法调用时首先调用bind()方法,创建类的代理对象,这样通过使用代理对象调用原实例对象方法,就会执行重写的invoke方法,这样我们可以通过在调用真正执行的方法前后添加额外代码。
学习AOP我们必须要学会三个概念,pointcut,Advice和Advisor。pointcut是join point集合,定义了程序代码中要注入的advice位置的集合,指明Advice在什么条件下触发,它分为动态,静态和自定义三种类型,静态切入点不考虑参数,当代码第一次切入后被缓存起来,下次执行该切入点不用重新创建,动态切入点由于有参数影响,不能缓存;Advice是在当前业务逻辑代码中要切入的代码,分别为Interception Around(当前业务逻辑前后建立切入方法),Before(当前业务逻辑之前建立切入方法),atterreturning(当前业务逻辑之后建立切入方法),throw(代码报错时建立切入方法)。Advisor将Advice和pointcut连接到一起。