Spring中的Aop

122 阅读5分钟

什么是AOP?

AOP为Aspect Oriented Programming的缩写,意思是面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术

AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要的内容,是函数式编程的一种衍生泛型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑的各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率

AOP的作用及优势

  • 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
  • 优势:减少重复代码,提高开发效率,并且便于维护

AOP的底层实现

实际上,AOP的底层是通过Spring提供的动态代理技术实现的.在运行期间。spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行功能增强的介入,在去调用目标对象的方法,从而完成功能的增强.

AOP的动态代理技术

  • 常用的动态代理技术
    • JDK代理:基于接口的动态代理技术
    • cglib代理:基于父类的动态代理技术

AOP的相关概念

Spring的AOP实现底层就是对上面的动态代理的代码进行封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标方法的增强

理解AOP常见的相关术语

  • Target(目标对象):代理的目标对象
  • Proxy(代理):一个目标类被AOP织入增强后,就产生了一个结果代理类
  • JoinPoint(连接点):所谓连接点就是在那个目标对象中可以被增强的方法.spring只支持方法类型的连接点
  • Pointcut(切入点):所谓切入点就是在众多连接点中被真正增强的连接点,这些被增强的方法也就是切入点
  • Advice(通知/增强):在切面类中对某一个切入点所要做的增强封装在一个方法中,这个方法就是通知或增强
  • Aspect(切面):一个切入点和这个切点所对应的通知的一个结合就叫切面
  • Weaving(织入):切点和通知结合的过程可以叫织入

AOP开发明确的事项

1.需要编写的内容

  • 编写核心业务代码(目标类的目标方法)
  • 编写切面类,切面类中有通知(增强功能方法)
  • 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合

2.AOP技术实现的内容

Spring框架监控切入点方法的执行。一旦监控到切入点方法被执行,就使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行.

3.AOP底层使用哪种代理方式

在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理方式.

基于xml的AOP的开发

快速入门

  • 导入AOP相关坐标(虽然spring-context中导了自己的aop的包,但由于市场中aspectj比较好所以就用市场的aspectj开发)
  • 创建目标接口和目标类(内部有切点)
  • 创建切面类(内部有增强方法)
  • 将目标类和切面类的对象创建权交给Spring(在xml中将两个类注入ioc容器)
  • 在applicationContext.xml中配置织入关系
  • 测试代码

XML配置AOP详解

  • 1.切点表达式的写法
    • 表达式语法: execution([修饰符] 返回值类型 包名.类名.方法名(参数))
      • 访问修饰符可以省略
      • 返回值类型,包名,类名,方法名可使用*号代表任意
      • 包名和类名之间一个点,代表当前包下的类,两个点..表示当前包及其子包下的类
      • 参数列表可以使用两个点..表示任意个数,任意类型的参数列表
    • 练习以下例子

通知的类型

  • 通知的配置写法: <aop:通知类型 method=”切面类中方法名(不加括号) pointcut=”切点表达式”></aop:通知类型>
  • 补充环绕通知代码实现

切点表达式的抽取

当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref(写pointcut中的id属性)属性代替pointcut属性来引用抽取后的切点表达式

抽取切点表达式: <aop:pointcut id=”” expression=”切点表达式”></aop:pointcut>

基于注解的AOP开发

快速入门

  • 导入AOP相关坐标
  • 创建目标接口和目标类(内部有切点)
  • 创建切面类(内部有增强方法)
  • 将目标类和切面类的对象创建权交给Spring,并在切面类加上@Aspect注解说明这时切面类
  • 在切面类中使用注解配置织入关系
  • 在配置文件中开启组件扫描和AOP的自动代理
  • 测试代码

注解配置aop详解

  • 注解通知的类型:
  • 通知的配置语法: @通知注解(“切点表达式”)
  • 切点表达式的抽取
    • 同xml配置aop一样,我们可以将切点表达式进行抽取。抽取方式是在切面类定义空方法,在该方法上使用@Pointcut注解定义切点表达式,然后再在增强注解中进行引用(方法名称带括号)

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情