• Spring-----AOP深度理解


    AOP定义了一些新的概念,要想深入的理解AOP的原理,就必须掌握这些概念的具体含义,本人菜鸡一枚,一下是自己对一些概念的理解,如果哪里不对,欢迎评论区指正

    AOP核心概念
    AOP即Aspect-Oriented Programming的缩写,中文意思是面向切面(或方面)编程。AOP实际上是一种编程思想,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种思想。
    1.切面(aspect)
    类是对物体特征的抽象,切面就是对横切关注点的抽象
    2.连接点(joinpoint)
    被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
    3.切入点(pointcut)
    对连接点进行拦截的定义
    4.通知(advice)
    所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
    5.目标对象
    代理的目标对象
    6、织入(weave)
    将切面应用到目标对象并导致代理对象创建的过程

    ==========================大部分教程上都会这么讲,但基本上什么都没听懂=================================(๑ŐдŐ)b

    不过没关系,我们可以结合图片和代码来理解

    为了能更直观的理解AOP,我们可以采用画图的方式:

    AOP:它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。所谓“切面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“切面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

    ============================还是没怎么听懂==============================(๑ŐдŐ)b

    为了能够更深入的了解AOP,我们可以从代码方面来进行分析
    1.首先我们定义一个People接口

    2.然后定义一个TuanZhang类实现People接口

    3.定义一个用于增强的ProxyHandler类并实现InvocationHandler接口

    JDK自带的动态代理主要是指,实现了InvocationHandler接口的代理类,实现了InvocationHandler接口的类,会继承一个invoke方法,通过在这个方法中添加某些代码,从而完成在方法前后添加一些动态的东西。JDK自带的动态代理依赖于接口,如果有些类没有接口,则不能实现动态代理。

    4.再定义一个main方法

    5.输出结果:

    在以上代码的基础上尝试自己实现一个AOP

    6.在上面的People接口和TuanZhang类的基础上定义一个MyInvocationHandler接口

    7.定义一个MyProxyHandler类并实现MyInvocationHandler接口

    8.定义一个MyClassLoader类并实现ClassLoader接口

    4.定义MyProxy类用于调用MyClassLoader,生成我们自己的代理类的字节码文件

    5.书写一个测试方法

    输出结果:

    这个demo的整体流程是先是用最土鳖的拼字符串方式生成一个代理类文件,再调用类加载器将这个代理类加载,当我们调用对象的方法时,实际上是调用的代理类中的同名方法,为这个方法的实现已经被增强了

    生成的$Proxy0动态代理对象

    类的内容通过简单的拼接字符传生成,如下:

    通过以上代码,我们可以对AOP便有了一个较为深入的理解:

    切点:基于微观角度,对连接点进行增强的位置
    连接点:在xml文件中,通过表达式匹配到的所要增强的方法
    通知:又叫做增强,即对方法的扩展
    切面:切点+通知
    织入:织入是一个动词,指的是将增强打入到原方法的过程,表现为方法的执行

  • 相关阅读:
    MongoDB的查询
    商品订购及货物采购信息系统(代码分析)
    Java连接数据库(mysql,sqlserver)
    开通博客第一天
    Ubuntu下java环境的搭建
    商品订购及货物采购信息系统(需求分析)
    GitHub客户端发布托管代码
    property中copy和strong修饰符的使用指北
    iOS界面间传值
    GPUImage的滤镜功能一览表
  • 原文地址:https://www.cnblogs.com/red-evil/p/10062524.html
Copyright © 2020-2023  润新知