目录


AOP概念

  1. 浅理解 aop :面向切面编程,扩展功能不需要修改程序源代码 ;

  2. 深度理解 aop:采取了 横向抽取机制 ,取代了传统 纵向继承体系 复杂性代码 ;

    概念看完,不一定懂,aop 到底是怎么完成不修改源代码,,而进行功能扩展的 ;
    
    往下看 原理 ;

AOP原理

  1. 传统的 纵向继承体系

    想要对功能进行扩展,最原始的做法是:修改源代码,在源代码上直接添加功能代码;但是,这样做,会产生了一个 问题假如有几个方法,都要增加一个相同的功能,就务必会有重复性代码的产生

    后来有人想到了 纵向继承体系,就像图中的那样,要增强功能的时候,写一个基类,然后让要扩展的类,继承基类,达到扩展功能的目的 ;这样解决了重复代码的问题,但是还有问题,就是扩展类和基类绑定在一起了,耦合高,只要基类方法改名字,要扩展的类,就得相应的改名字 ;

  2. aop 的横向抽取一(有接口 JDK动态代理

    Springaop 底层是使用 动态代理 实现的 ;动态代理 分为2中,有接口、无接口 ;

  3. aop 的横向抽取二(没有接口 cglib

    动态代理 怎么操作的,这里不讲,这里主要表达 aop 底层是 动态代理


AOP术语

  1. Joinpoint(连接点)

    官方解释:就是那些被拦截到的点,在 Spring 中这些点就是 方法,因为 spring 只支持方法类型的连接点 ;

    大白话:就是类里面,可以 被增强的方法 ;

  2. Pointcut(切入点)

    官方解释:对连接点进行拦截的定义 ;

    大白话:类中 实际 被增强的方法 ;

  3. Advice(通知、增强)

    官方解释:拦截到连接点以后,要做的事;通知分为:前置通知、后置通知、异常通知、最终通知、环绕通 重点内容`(切面要完成的功能)

    大白话:实际要扩展的功能 ;

    前置通知:在原方法执行之前,进行功能的扩展 ;

    后置通知:在原方法执行之后,进行功能的扩展 ;

    异常通知:在方法出现异常的还是,进行功能的扩展 ;

    最终通知:在 后置通知 之后,进行功能的扩展 ;

    环绕通知:在方法之前和之后,都进行功能的扩展 ;

  4. Introduction(引介)

    是一种特殊的通知,在不修改类代码的前提下,Introduction 可以在运行期为类动态的添加一些方法或者字段 ;

  5. Target(目标对象)

    代理的目标对象,即要增强的类 ;

  6. Weaving(植入)

    把要增强应用到目标的过程 ;

  7. Proxy(代理)

    一个类被 AOP 植入增强以后,就会产生一个代理类 ;

  8. Aspect(切面)

    官方解释:切入点和通知(引介)的结合;

    大白话:把扩展的功能,应用到要增强的方法上的过程 ;


Spring 中的 aop 的操作

AspectJ 框架

  • Aspect 是一个面向切面的框架(不是 Spring 里面的,是一个独立的框架,可以和Spring搭配使用),它扩展了 java 语言。AspectJ 定义了AOP语法,所以它有一个专门的编译器用来生成遵守java字节编码规范的Class文件 ;
  • AspectJ 是一个基于java语言的AOP框架;
  • Spring2.0 以后新增了对 AspectJ 切点表达式支持;
  • @AspectJAspectJ 1.5 新增功能,通过 JDK 注解技术,允许直接在 Bean 类中定义切面 ;
  • 新版本 Spring 框架,建议使用 AspectJ 方式来开发 AOP
  • 使用 AspectJ 需要导入 Spring aopAspectJ 相关的 jar 包 ;

使用 AspectJ 实现 aop 的两种方式

  1. 基于 AspectJ 的配置方式

    1. 导包

      除了 Spring-aop 的包,还需要 AspectJaopalliance-1.0、aspectjweaver-1.8.11 两个包 ;

    2. 配置文件添加新的约束

      添加 aop 的相关约束

        xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation=
      "http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
    3. 使用表达式配置切入点

      常用表达式:execution(<访问修饰符>?<返回类型><方法名>(参数)<异常>

      例如:

      写法: execution* +空格 +方法名全路径


      // 匹配 包路径xin.ijava.aop 下面的 Book 类的 add()方法 // * 表示任意都匹配 写在这里匹配保护:public、private、abstract
      // add(..) 表示匹配由于参数都行
      execution(* xin.ijava.aop.Book.add(..)) -------------------------------------
      // 匹配 包路径xin.ijava.aop 下面的 Book 类的 所有方法
      execution(* xin.ijava.aop.Book.*(..)) -------------------------------------
      // 匹配 包路径xin.ijava.aop 下面的所有方法(不包含子包)
      execution(* xin.ijava.aop.*(..)) -------------------------------------
      // 匹配 包路径xin.ijava.aop 下面的所有方法(包含子包)
      execution(* xin.ijava.aop..*(..)) -------------------------------------
      // 匹配 任意包路径下面的任意类的任意方法
      execution(* *.*(..)) -------------------------------------
      // 匹配 所有以 add 开头的方法
      execution(* add*(..)) -------------------------------------
      // 匹配 实现特定接口(xin.ijava.aop.dao)的所有类方法
      execution(* xin.ijava.aop.dao+*(..))
    4. 在配置文件中配置切入点

      <aop:config>
      <!--配置切入点-->
      <aop:pointcut id="bookPointCut" expression="execution(* ijava.xin.aop.Book.*(..))"/> <!--配置切面-->
      <!--ref 中是 增强对象,不是要增强的对象-->
      <aop:aspect ref="bookAdvice">
      <!--前置通知-->
      <aop:before method="beforeAdd" pointcut-ref="bookPointCut"></aop:before>
      </aop:aspect> </aop:config>
    5. 环绕通知

      环绕通知和其他通知,有点不一样

      增强对象中,环绕通知方法 的代码:

      	  /**
      * 环绕通知
      * @param proceedingJoinPoint 参数
      */
      public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
      System.out.println("前置通知.."); // 调用增强的方法
      proceedingJoinPoint.proceed() ; System.out.println("后置通知.."); }

  2. 基于 AspectJ 的注解方式

    1. Spring 配置文件 中开启 AOP 自动代理

      <!--开启aop自动代理-->
      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    2. 然后在增强类上面写一个 @Aspect 注解 ;

    3. 在要增强类的增强方法上写注解,配置切入点

    @Component("bookAdvice")
    @Aspect
    public class BookAdvice { @Before(value = "execution(* ijava.xin.aop.Book.*(..))")
    public void beforeAdd(){
    System.out.println("前置通知..");
    }
    /**
    * 环绕通知
    * @param proceedingJoinPoint 参数
    */
    @Around(value = "execution(* *.*(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    System.out.println("前置通知1.."); // 调用增强的方法
    proceedingJoinPoint.proceed() ; System.out.println("后置通知1.."); }
    }

border="0" src="//music.163.com/outchain/player?type=2&id=1297001123&auto=1&height=66" width="1" height="0">

(五)Spring 中的 aop的更多相关文章

  1. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  2. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  3. 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...

  4. JavaWeb_(Spring框架)认识Spring中的aop

    1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...

  5. Spring 中基于 AOP 的 @AspectJ

    Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...

  6. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

  7. Spring中的AOP

    什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  8. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  9. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

随机推荐

  1. python+opencv 图像预处理

    一 python 生成随机字符串序列+ 写入到图片上 from PIL import Image,ImageDraw,ImageFont import numpy as np import rando ...

  2. Luogu [P3622] [APIO2007]动物园

    题目链接 比较费脑子的一道题 先说题目核心思想 : 状压dp 环的处理我们先不管. 我们设 dp[j][s] 表示 到达动物 j 且 [ j , j+5) 这五个动物状态为s时 最多能使多少小朋友开心 ...

  3. chrome出现“由贵单位管理”原因及解决方法

    谷歌Google在声明里表示: 由贵单位管理指的是由设备或者账户管理员例如企业管理器可以用来强制更改谷歌浏览器配置的企业级策略.例如可以直接通过远程方式向所有受控用户添加书签,当管理员有进行这类操作时 ...

  4. Win内核原理与实现学习笔记2-现代操作系统的基本结构

    1.操作系统本属于软件的范畴,但它需要紧密的跟硬件打交道,它为上层应用软件或应用系统提供了一层抽象,专门负责硬件资源的管理和分配.(应用程序不需要跟硬件打交道,它们利用操作系统提供的功能来实现各种任务 ...

  5. 1558:聚会 ybt

    1558:聚会 ybt 题解(看似很难,其实要是摸清了实质这就是个大水题) 上题目 1558:聚会 时间限制: 1000 ms         内存限制: 524288 KB提交数: 82     通 ...

  6. Django基础之ORM操作

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  7. UVA 11605 Lights inside a 3d Grid —— (概率和期望)

    题意:见大白书P181. 分析:一个一个点的进行分析,取其期望然后求和即可.假设当前点在第一次中被选到的概率为p,f[i]表示进行k次以后该点亮的概率(在这里也可以理解为期望),g[i]表示k次后该点 ...

  8. 为什么使用Spring Boot

    原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文将介绍各种 Spri ...

  9. mysql 优化知识点

    附录: https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0 本文概要 概述 为什么要优化 ...

  10. mysql CONCAT函数

    有时候我们需要使用coacat函数拼接一些字段的生成一个字符串,比如:select concat(field1,field2,field3)  from xxx: 这时候我们就会的到一个这些字段的值拼 ...