zoukankan      html  css  js  c++  java
  • spring学习三:Spring的Aop、代理

    ref:https://mp.weixin.qq.com/s/J77asUvw8FcnF-6YlX6AAw

    AOP相关术语:

         Joinpoint(连接点):类里面可以被增强的方法,这些方法称为连接点。

         Pointcut(切入点):类里面可以有很多方法可以被增强,我们选择哪个方法进行增强,称为 切入点;

         Advice(增强/通知):实际要增强的逻辑,称为增强;

               前置通知:在方法之前执行;  后置通知:在方法之后执行;

               异常通知:方法出现异常      最终通知:在后置之后执行

                  环绕通知:方法之前和之后都要执行。

          Aspect(切面):把增强应用到具体的方法上面

    Spring AOP两种方式:

      包括基于XML配置的AOP和基于@AspcetJ注解的AOP,这两种方法虽然在配置切面时的表现方式不同,但底层都是使用动态代理技术(JDK代理或CGLib代理)。

    动态代理两种方式:

    • JDK动态代理:只能为接口创建动态代理实例,而不能针对类 。

      • 通过需要代理的目标类的getClass().getInterfaces()方法获取到接口信息(这里实际上是使用了Java反射技术。getClass()和getInterfaces()函数都在Class类中,Class对象描述的是一个正在运行期间的Java对象的类和接口信息),通过读取这些代理接口信息生成一个实现了代理接口的动态代理Class(动态生成代理类的字节码),然后通过反射机制获得动态代理类的构造函数,并利用该构造函数生成该Class的实例对象(InvokeHandler作为构造函数的入参传递进去),在调用具体方法前调用InvokeHandler来处理。
    • CGLib(Code Generation Library)动态代理:可以为任何类创建织入横切逻辑代理对象,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final。

      • 利用asm开源包,把代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。采用非常底层的字节码技术,为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。

    Spring的AOP:

    • AspcetJ:Spring可以继承AspcetJ,但AspcetJ本身并不属于Spring AOP的范畴:在编译时“自动”编译得到了一个新类,这个新类增强了原有类的功能,因此 AspectJ 通常被称为编译时增强的 AOP 框架
    • spring aop:与 AspectJ 相同的是,Spring AOP 同样需要对目标类进行增强,也就是生成新的 AOP 代理类;与 AspectJ 不同的是,Spring AOP 无需使用任何特殊命令对 Java 源代码进行编译,它采用运行时动态地、在内存中临时生成“代理类”的方式来生成 AOP 代理。
    • 区别:Spring 依然采用运行时生成动态代理的方式来增强目标对象,所以它不需要增加额外的编译,也不需要 AspectJ 的织入器支持;而 AspectJ 在采用编译时增强,所以 AspectJ 需要使用自己的编译器来编译 Java 文件,还需要织入器。

    Spring的AOP自动代理的原理:

      Spring提供了自动代理机制,让容器为我们自动生成代理。在内部,Spring使用BeanPostProcessor自动地完成这项工作。

      这些基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理实例

    •  基于Bean配置名规则的自动代理创建器:允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator;

    • 基于Advisor匹配机制的自动代理创建器:它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(即为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator;

    • 基于Bean中AspjectJ注解标签的自动代理创建器:为包含AspectJ注解的Bean自动创建代理实例,它的实现类是AnnotationAwareAspectJAutoProxyCreator,该类是Spring 2.0的新增类。

    几种通知格式:

    前置:

    后置:

    环绕:

      

      

  • 相关阅读:
    创建、删除swap分区
    从show slave status 中1062错误提示信息找到binlog的SQL
    ORA-28040: No matching authentication protocol
    Python中序列解包与函数的参数收集之间的关系
    第8.24节 使用__subclasses__查看类的直接子类
    利用Python特殊变量__dict__快速实现__repr__的一种方法
    Python中使用f字符串进行字符串格式化的方法
    转:python提取浏览器Cookie
    CSDN-markdown编辑器使用方法
    转:解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
  • 原文地址:https://www.cnblogs.com/whtblog/p/9060927.html
Copyright © 2011-2022 走看看