概述
AOP(Aspect Oriented Programming),面向方面编程,解耦本不该彼此粘合的功能,比如业务逻辑和日志、权限、异常处理等。
AOP和OOP的比较
- OOP很好的实现了现实到软件的转换。
- OOP在日志、事务处理、权限管理方面会产生大量重复代码。
- AOP能将应用分为核心关注点和横切关注点
- AOP中,每个关注点不知道是否有其他关注点关注它
- AOP是OOP的补充
### AOP的Java实现
通用方法
public class TimeBook{
private Logger logger = Logger.getLogger(this.getClass().getName());
//审核数据
public void doAuditing(String name){
logger.log(Level.INFO, name + "开始审核数据");
//审核
......
logger.log(Level.INFO, name + "审核结束");
}
}
可以发现在代码中可能会出现很多logger.log。
使用Java代理改进
代理
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().getInterface(), this);
}
//针对接口编程
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object result = null;
try{
//在方法调用前后进行日志输出
logger.log(Level.INFO, name + "开始审核数据");
result = method.invoke(delegate, args);
logger.log(Level.INFO, name + "审核结束");
}catch (Exception e){
logger.log(e);
}
return result;
}
}
接口
public interface TimeBookInterface{
public void doAuditing(String name);
}
实现
public class TimeBook{
private Logger logger = Logger.getLogger(this.getClass().getName());
//审核数据
public void doAuditing(String name){
//审核
......
}
}
测试
public static void main(String[] args){
//实现对日志类的重用
LogProxy logProxy = new LogProxy();
TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("...");
}
AOP的关键概念
- 切入点:对连接点进行拦截的定义
- 静态切入点
- 动态接入点
- 自定义切入点
- 通知
- Interception Around
- Before
- After
- Throw
- Introduction
- Advisor