Spring AOP面向切面编程

·  阅读 889

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

AOP面向切面编程

1、AOP概述

AOP面向切面编程,就是在层与层之间加入代码,成为切面代码,主要目的是在某些情况下,让层与层之间的耦合度进一步降低。使用接口+IOC+DI已经能够很好的进行解耦合了。 AOP比较难理解的,需要准备一些场景代码讲解。

2、修改Service层的代码,增加功能性代码

public void addUser() {
		System.out.println("#记录日志");
		System.out.println("#权限控制");
		System.out.println("#开启事务");
		System.out.println("调用Dao层的方法,完成新增用户...");
		System.out.println("#提交事务");
	}
复制代码

业务代码和功能代码混淆在一块了,比较乱,混杂。相当于把日记的内容和上课记笔记的内容写一个一起。 企业开发要保证六字真言:高内聚,低耦合。 高内聚:每一个组件,每一个层只干自己的事情,绝不越界。 AOP 低耦合:每个组件,每一个层之间耦合度降到最低。接口+Spring IOC+DI

3、AOP的概念,解决功能代码和业务代码的分离

在这里插入图片描述

4、代理模式 --AOP底层的核心实现技术思想

代理模式的核心思想:在不改变一个类的情况下增强该类中的方法

  • (1)静态代理 可以解决代码混杂的问题,无法解决代码重复的问题
  • (2)动态代理 --java提供Proxy类 既可以解决代码混杂的问题,也可以解决代码重复的问题 缺陷:基于接口的方式实现的,不在接口中存在的方法是访问不了的
  • (3)第三方动态代理 -- cglib代理 既可以解决代码混杂的问题,也可以解决代码重复的问题 cglib代码是基于继承实现的,对于非接口的方法依然是可以访问的

5、使用代理模式对项目进行重构

静态代理 -- SpringN03_03_project_staticProxy Java动态代理 --- SpringN03_04_project_javaProxy Cglib动态代理 -- SpringN03_05_project_cglibProxy

6、SpringAOP基本概念

专属名词:连接点、切入点、切面/切面类、通知方法、目标对象、目标方法 连接点:层与层之间方法的调用过程 切入点:根据切入点决定对哪个连接点进行功能的增强 切入点=连接点+切入点表达式 切面:也叫切面类,用来写增强代码的功能 通知方法:简称通知,用来完成增强代码功能的方法 目标对象:增强代码执行完后回到的目标对象 目标方法:增强代码执行完后回到的目标方法 专属动词:织入。将切面类中的通知方法的结果返回到目标对象和目标方法的过程称之为织入

7、Spring的AOP入门案例

  • Step1:先准备开发jar包,一个12个jar包
  • Step2:在applicationContext文件中,导入aop约束
  • Step3:创建切面类
  • Step4:在切面类中定义通知方法
  • Step5:在applicationContext文件中配置切面类,通知方法以及切入点规则
  • Step6:执行

8、切入点表达式

(1)within()表达式

通过类名进行匹配目标对象,粗粒度的切入点表达式,只能控制到类这个级别。

  • A within()表达式可以使用*号匹配符,匹配指定包下所有的类。 注意:只匹配当前包,不包括当前包的子孙包
  • B 在within()表达式中也可以使用*号匹配包 注意:多个星号,最后一个星表示所有类,前面的星表示任意包
  • C 在within()表达式中使用..*,匹配指定包下及其子孙包下所有的类

(2)execution()表达式

细粒度的切入点表达式,可以以方法为单位定义切入点规则 语法:execution(返回值类型 包名.类名.方法名(参数类型))

9、五大通知

(1)前置通知

  • 1)基本使用:在目标方法之前执行的通知
  • 2)配置方法:<aop:before />
  • 3)前置通知执行的方法中可以定义一个参数JoinPoint参数 该参数代表当前连接点,通过该参数可以获取目标对象、目标方法的相关信息;

(2)环绕通知

  • 1)基本使用:在目标方法执行之前和之后都可以执行的通知
  • 2)配置方法:<aop:around />
  • 3)环绕通知必须写参数,必须写返回值

(3)后置通知

  • 1)基本使用:在目标方法成功执行之后执行的通知
  • 2)配置方法:<aop:after-returning />

(4)异常通知

  • 1)基本使用:在目标方法抛出异常时执行的通知
  • 2)配置方法:<aop:after-throwing />

(5)最终通知

  • 1)基本使用:是在目标方法执行之后执行的通知
  • 2)配置方法:<aop:after />
  • 3)最终通知和后置通知的区别:

后置通知是在目标方法正常执行后执行的通知,如果目标方法有异常,后置通知是不会执行的; 最终通知无论如何都会在目标方法执行完执行,即使目标方法有异常也会执行; 后置通知可以配置得到目标方法的返回结果,而最终通知无法获取。

注意JoinPoint可以在以上几个通知中都使用,如果有多个参数,要保证JoinPoint参数在第一个。

10、五大通知的顺序问题

当一个切面类中同时配置了多个通知时,执行顺序如下: 前置、环绕前 一定在目标方法执行之前; 后置、环绕后、最终 一定在目标方法执行之后执行。 在符合以上的前提下,而他们之间的执行顺序取决于配置的顺序,配置越往前,执行越优先。

11、多个切面的执行顺序问题

12、注解方式AOP的开发

(1)浅谈SpringAOP的原理

Spring在创建bean时,除了创建目标对象bean之外,会根据aop的配置,生成目标对象的代理对象(助理)。 SpringAOP使用的代理是JavaProxy的动态代理和cglib的动态代理。默认情况下,如果目标对象实现过接口,则采用的JavaProxy代理机制。 如果目标对象没有实现过接口,则采用的是cglib代理机制。 proxy-target-class=”” 设置动态代理的机制,true是cglib代理
Spring框架 IOC DI AOP 配置文件方式、注解方式

(2)AOP的注解方式的实现

Spring也支持注解方式实现AOP,相对于配置文件方式,注解配置更加轻量级,配置、修改更加方便,是目前最流行的方式。 AOP的注解方式的实现步骤

①在applicationContext.xml文件中开启注解方式AOP
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
②配置切面/切面类    @Aspect
③配置通知/通知方法  @Before  @Around…    五大通知
@Pointcut        配置切入点表达式的注解
@Aspect           配置切面的注解
@Before           前置通知的注解
@Around          环绕通知的注解
@AfterReturning    后置通知的注解
@AfterThrowing     异常通知的注解
@After             最终通知的注解
@Order            配置切面的执行顺序
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改