静态代理
接口
目标对象+代理对象=实现目标接口
代理对象持有真实对象的引用
类爆炸,每个增强都要写代理对象
动态代理
代理对象动态生成
JDK,Proxy,newProxyIntance()
必须有接口实现
CGLIB
代理对象必须不是final修饰的
实现
public class CglibInterceptor implements MethodInterceptor {
//目标对象
private Object target;
public CglibInterceptor(Object target) {
this.target = target;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//前置增强
System.out.println("========方法前增强");
//通过反射执行目标对象的方法
Object result = methodProxy.invoke(target, objects);
//后置增强
System.out.println("========方法后增强");
return result;
}
public Object getProxy(){
//如何产生代理对象的
Enhancer enhancer=new Enhancer();
//把目标对象作为父类
enhancer.setSuperclass(target.getClass());
// 设置拦截器 回调对象为本身对象
enhancer.setCallback(this);
//产生代理对象
return enhancer.create();
}
}
AOP
面向切面编程
底层代理模式--动态代理
场景
事务
日志
监控性能
xml配置开发
注解开发
1:引入坐标,开启注解开发
<!--开启AOP注解开发-->
<aop:aspectj-autoproxy/>
2:抽象切面,配置通知
3:测试一下,执行目标方法
概念:
切面
切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
切点
被拦截到的每个点,spring中指被拦截到的每一个方法,spring aop一个连接点即代表一个方法的执行。
增强|通知
拦截到每一个连接点即(每一个方法)后所要做的操作
1. 前置通知 (前置增强)— before() 执行方法前通知
2. 返回通知(返回增强)— afterReturn 方法正常结束返回后的通知
3. 异常抛出通知(异常抛出增强)— afetrThrow()
4. 最终通知 — after 无论方法是否发生异常,均会执行该通知。
5. 环绕通知 — around 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
织入
将切面应用到目标对象并生成代理对象的这个过程即为织入