zoukankan      html  css  js  c++  java
  • Spring AOP的作用,动态代理模式

    AOP即面向切面编程。AOP是基于代理模式的。

    代理模式:

    当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性。可以使用代理模式,建立一个代理类。

    比如:修改需求,在调用UserController类的saveUser()方法之前要判断用户是否有权限,普通的办法我们可以直接修改类中的saveUser()方法。用代理模式就是,建立一个代理类,在调用saveUser()方法之前再加入鉴权的方法,以后调用时我们调用代理类,而不直接调用UserController类了。

    class UserControllerProxy {
    private UserController userController;

    public void saveUser() {
    checkAuth();
    userController.saveUser();
    }
    }
    不过这只是静态代理,AOP的一个重要应用是Spring AOP,它是基于动态代理的,道理和静态代理差不多。对于实现了接口的,Spring AOP会使用JDK Proxy,去创建代理对象,后面直接调用代理对象,而对于没有实现接口而是继承了类的对象,Spring AOP会使用Cglib,生成一个被代理对象的子类,后面直接调用子类。

     

    不过Spring AOP是在程序运行的过程中织入的,是动态织入。还有一种面向切面的是AspectJ,它是基于静态织入的。静态织入是指在编译时期就织入,即编译出来的class文件,字节码就已经被织入了。官方文档的一张图:

     

    AOP相关概念:

    将多个类共有的功能抽象出来,形成一个新的类,这个类就叫做切面,或者切片(Aspect),在我们需要用到这个功能的时候就调用这个切面类中的方法,依靠依赖注入DI将功能注入进去。

    例如上面的添加鉴权功能,就可以建立一个鉴权的切面类,在需要用到的地方切进去,这个切入的地方就叫做切入点(Joinpoint)。类似的功能就是拦截器(Intercepter)。拦截这个概念是AOP的一种实现策略,在某个方法被执行时,拦截器可以拦截下来,在方法执行之前执行别的方法,比如鉴权。也可以在方法执行之后再执行别的方法,拦截器就是一个动态拦截Action调用的对象。他提供了中机制是开发者可以在一个Action执行之前或执行之后插入需要的代码。 
    ————————————————
    版权声明:本文为CSDN博主「藤原豆腐店-」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wanderlustLee/article/details/80457698

  • 相关阅读:
    利用docker搭建rtmp服务器(1)
    ES6转换为ES5
    一些乱七八糟的东西
    xss攻击和sq注入
    python asyncio笔记
    图解密码技术一些笔记
    做网页前端遇到的一些问题
    错误处理的一些想法
    吐槽下国内的云笔记
    python的编码问题
  • 原文地址:https://www.cnblogs.com/renjiaqi/p/11641185.html
Copyright © 2011-2022 走看看