SSM框架学习12-AOP相关知识点

目录

1. 什么是AOP

2. AOP相关术语

 3. 使用jdk方案实现动态代理

 4. 使用cglib的方案实现动态代理


1. 什么是AOP

        相信第一次接触到这个内容的人会有点迷茫,什么是aop,一查就告诉你是面向切面编程,这一下又被整懵了,什么是切面,接下来举一个例子来说明aop:
        首先java编程中的抽取思想相信大家都能理解,也就是重复代码抽取为一个方法,然后再在不同的地方引用对吧,假设现在有a、b、c三个方法,他们之中都有一个共同的功能需要实现,我们将他抽取出来,把这个方法叫做d,然后等需要的时候我们在a,b,c代码中去引用d,也就是说这样的抽取,是产生了解耦的效果,但是并没有做到完全解耦对吧。

有人会觉得,引用的那点代码算啥,不用管,但当一个项目的某一方法需要被引用上百次时,然而后面通知你修改方案,不引用这个方法,或者换其他方法,部分保持,部分更换,部分不引用等等十分灵活的要求,那是不是又增加了工作量,因为有时候的引用关系到整个方法的编写,取消引用后,可能方法需要重写,会很麻烦,因此我们就会像有没有可能,让所有的方法之间没有丝毫联系,属于完全解耦状态,当我要用到什么功能时我在调用它。

这时,AOP就诞生了,他就可以准备一个容器,放入我们的目标方法,现在我们需要对我们目标的方法进行增强,也就是方法功能的扩展,那我们就把用来增强的方法放入容器中,由这个容器来产生一个代理的方法,这个方法就满足了我们的要求,而且这个代理的产生的底层我们不需要知道,需要知道的是,他的产生是在项目运行时才产生的,而且是通过一些简单的配置来使用的,因此这就叫做动态代理。

2. AOP相关术语

    这里就来解释一下为什么叫面向切面编程:

 这里用一些通俗的语言来解释一下

target就是我们需要被增强的方法

proxy就是加入增强的方法之后混合而成的代理方法

joinpoint就是一个类里有许许多多方法,可以被增强的方法都是连接点,只是他们不一定会被增强

pointcut就是从joinpoint中挑选出来的需要增强的方法,叫切入点

advice就是将目标方法和对应的可以增强它的方法以一定的逻辑联系在一起的这个过程,叫做通知

aspect就是我们pointcut和advice的结合,切入点和通知的结合,形成了这个叫切面的东西

weaving叫做织入,它就是一个把增强方法和目标对象结合创建一个新代理对象的整个过程

        完全理解了上述术语后,相信你已经知道了什么是面向切面编程

 3. 使用jdk方案实现动态代理

这里不需要记,可以了解,这里是底层的代理的过程:

//目标对象
        final Target target=new Target();

        //增强对象
        final advance ad=new advance();

        //返回值就是动态生成的代理对象,这里是jdk方案实现,用父接收子,这里用接口去接收
        TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),//目标对象类加载器
                target.getClass().getInterfaces(),//目标对象相同的接口字节码对象数组
                new InvocationHandler() {
                    //调用代理对象的任何方法时,实质执行的都是invoke方法,在invoke内来执行目标方法
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        ad.before();//前置增强
                        Object invoke =method.invoke(target,args);//这里执行目标方法
                        ad.after();//后置增强
                        return invoke;
                    }
                }
        );

        //现在原target的功能被代理对象吸收了,也叫代理对象把target这个实际的对象代理执行了,同时还加了不同的增强方法在里面
        //这意味着我们只需要修改代理对象的组合就可以完成不同类功能的组合实现,但同时各类各方法之间是解耦的
        proxy.save();
    }

 4. 使用cglib的方案实现动态代理

spring的核心已经集成了cglib的包,可以直接用 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值