概念: AOP(Aspect Orlent Programming),面向切面编程,是OOP面向对象编程的一种补充。在运行时,将代码动态地切入到类的指定方法、指定位置上,使业务代码和非业务代码分离的编程思想就是面向切面的编程思想。
aop各个组成部分:
- AOP中的重要组成::通常是一个类,里面可以定义切入点和通知
- 切面(Aspect)
- 连接点(Joinpoint): 可以被切入的点,通常是方法。连接点对象描述了当前连接点的信息,比如,目标对象、方法信息、参数等等
- 通知(Advice): 需要向切面加入的功能,加入位置有:before,after,afterReturning,afterThrowing,around
- 切入点(Pointcut): 需要织入通知的连接点,通常用SPEL描述
- 引入(Introduction):对目标对象添加方法和属性
- 目标对象(Target Object):织入
Advice
的目标对象.,切面通知的对象 - AOP 代理(AOP Proxy): AOP的一种实现方式
- 织入(Weaving):需要织入通知的连接点,通常用SPEL描述
AOP实现原理:
AOP实现是用动态代理实现的
我们来看看动态代理和静态代理的简单写法:
静态代理: 代理类的相关方法直接在代码中写死。
**例子:**一个接口有两个实现类,一个实现类实现了接口中具体的方法,另一个代理类持有实现类的对象,然后通过代理类可以为实现类新增功能或调用方法,比如spring中的AOP就是代理模式实现的。
接口:
//接口
public interface KillService{
public String killOne(int money);
}
实现类:
public class KillServiceImpl implements KillService{
public String KillOne(int money){
return money+"元买东西";
}
}
代理类
public class KillServiceProxy implements KillService{
private KillServiceImpl ksi=new KillServiceImpl(); //持有被代理者的对象
public String KillOne(int money){
String result=ksi.KillOne(50000);
return result;
}
}
测试类:
public class ProxyApp {
public static void main(String[] args) {
//静态代理
KillService kps=new KillServiceProxy();
ksp.killOne(50000);
}
**动态代理:**动态代理原理和静态代理一样,但是他没有具体的代理类,通过你指定一个类他给你变成某类的代理类。
public class DynamicProxy implements InvocationHandler {
private Object target; //要被代理的实例
public Object getProxy(Object target) {
this.target=target;
//创建Proxy类动态代理实例
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//方法拦截加入代理功能
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "执行,参数为"+ Arrays.toString(args));
long before = System.currentTimeMillis();
Object result = method.invoke(target, args);
long after = System.currentTimeMillis();
System.out.println(method.getName() + "执行,耗时"+(after-before)+"毫秒");
return result;
}
}
AOP使用场景:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务