Spring AOP

静态代理

接口

目标对象+代理对象=实现目标接口

代理对象持有真实对象的引用

类爆炸,每个增强都要写代理对象

动态代理

代理对象动态生成

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)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

        织入

将切面应用到目标对象并生成代理对象的这个过程即为织入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值