SpringAOP

SpringAOP

一.AOP原理

​ AOP (Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理。 而 Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。使用 AOP 可以扩充多个对象的某个能力

​ 原理:使用 AOP 可以扩充多个对象的某个能力, 我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

二.AOP 的作用及优势

1.作用:在程序运行期间,不修改源码对已有方法进行增强
2.优势:减少重复代码,提高开发效率,维护方便

3.实现

  • 统⼀⽇志记录
  • 统⼀⽅法执⾏时间统计
  • 统⼀的返回格式设置
  • 统⼀的异常处理
  • 事务的开启和提交等

4.实现方式:使用动态代理技术

  **4.1主要基于两种方式:**JDK 及 CGLIB**的方式**
   这两种方式的代理目标都是被代理类中的方法,在运行期,动态的织入字节码生成代理类。
  • CGLIB 是 Java中的动态代理框架,主要作用就是根据目标类和方法,动态生成代理类。

  • Java中的动态代理框架,几乎都是依赖字节码框架(如 ASM,Javassist 等)实现的。

  • 字节码框架是直接操作 class 字节码的框架。可以加载已有的class字节码文件信息,修改部分信息,或动态生成一个 class。
    4.2 JDK 和 CGLIB 的区别

  • JDK 实现,要求被代理类必须实现接口,之后是通过 InvocationHandler 及Proxy,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式),只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成。

  • CGLIB 实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的生成代理类对象。

在这里插入图片描述

三. AOP 术语

1.主要术语:

a.横切关注点:跨越程序多个模块的方法或功能。即与业务逻辑无关,但我们也要关注的部分,就是横切关注点。如日志、安全、缓存等。
b.切面( Aspect ):横切关注点被模块化的特殊对象;即切面应是一个类。
c.通知( Advice):切面要完成的增强处理,通知描述了切面何时执行以及如何执行增强处理;即通知应是切面中的方法。
e.目标( Target ):被通知对象。
f.代理( Proxy ):向目标对象应用通知之后创建的对象。
g.切入点( PointCut ):切面通知执行的地点,即可以插入增强处理的连接点。
h.连接点( JoinPoint ):应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。
i.织入( Weaving ):将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

2.切入点表达式说明

  2.1表达式语法: **execution([修饰符] 返回值类型 包名.类名.方法名(参数))**

全匹配方式:
public void com.service.impl.AccountServiceImpl.saveAccount(

com.itheima.domain.Account)

 2.2**访问修饰符**可以省略
  a.包名可以使用*号,表示任意包,但是有几级包,需要写几个*,使用..来表示当前包,及其子包
  b.类名可以使用*号,表示任意类
  c.方法名可以使用*号,表示任意方法
  d.参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数,也可以使用..表示有无参数均可,有参数可以是任意类型
 e. 全通配方式:* *..*.*(..)

通常情况下,我们都是对业务层的方法进行增强,所以切入点表达式都是切到业务层实现类。execution(* com.service.impl..(…))

四.Spring Aop 通知-通过Advice定义横切逻辑

1.通知语法:

​ 1.1配置文件方式

<aop:通知类型 method=“切面类中方法名” pointcut=“切点表达式”></aop:通知类型>
1.1配置的参数:
method:指定通知类中的增强方法名称
poinitcut:指定切入点表达式
ponitcut-ref:指定切入点的表达式的引用

1.2注解方式

​ @通知注解(“切点表达式”)

2.通知类型
在这里插入图片描述

五.使用 Spring 实现AOP

1.执行步骤

​ 1.1编写核心业务代码(目标类的目标方法)

​ 1.2编写切面类,切面类中有通知(增强功能方法)

​ 1.3在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合

2.实现方法

2.1配置类方法

a.导入依赖
在这里插入图片描述

b.创建目标接口和目标类(内部有切点)
在这里插入图片描述

c.创建切面类(内部有增强方法)
在这里插入图片描述

d.在applicationContext.xml中配置织入关系
在这里插入图片描述

e.将目标类和切面类的对象创建权交给spring
在这里插入图片描述

d.测试类(加上自定义注解的目标对象)

在这里插入图片描述

2.2xml方法

a.创建目标接口和目标类

b.创建Spring的配置文件
在这里插入图片描述

c.测试执行
*

3. 环绕通知

  • 3.1.创建环绕通知类

public class BookProxy {
public Object around(ProceedingJoinPoint pjp) {
// 定义返回值,被增强的方法的返回值
Object rtVal = null;

    try {
        // 获取被增强方法的参数列表
        Object[] args = pjp.getArgs();

        System.out.println("环绕通知的前置通知....");

        // 执行被增强的方法,并传入参数,如果确定没有返回值或者没有参数可以不写
        rtVal = pjp.proceed(args);

        System.out.println("环绕通知的后置通知....");
    } catch (Throwable e) {
        System.out.println("环绕通知的异常通知....");
        e.printStackTrace();
    } finally {
        System.out.println("环绕通知的最终通知....");
    }
    // 将被增强方法的返回值返回
    return rtVal;
}

}
3.2.编写XML文件

<?xml version="1.0" encoding="UTF-8"?>

<!-- 创建Book对象 -->
<bean id="book" class="run.arbor.spring5.aop_xml.Book"/>
<bean id="bookProxy" class="run.arbor.spring5.aop_xml.BookProxy"/>

<!-- 配置AOP的增强 -->
<aop:config>

    <!-- 配置切入点 -->
    <aop:pointcut expression="execution(* run.arbor.spring5.aop_xml.Book.buy(..))" id="pt1"/>

    <!-- 配置切面 -->
    <aop:aspect ref="bookProxy">
        <!--配置通知的类型要写在此处-->
        <aop:around method="around" pointcut-ref="pt1"/>
    </aop:aspect>

</aop:config>
3.3.测试

六、总结

     AOP 是对某⽅⾯能⼒的统⼀实现,它是⼀种实现思想,Spring AOP 是对 AOP 的具体实现,是只做增强,不做改变。当目标方法需要一些功能时,可以在不修改,不能修改源代码的情况下, 使用AOP技术在程序执行期间,生成代理对象, 通过代理执行业务方法,同时增加功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值