SpringAOP的介绍与SchemaBase方式实现的流程

SpringAOP的介绍

SpringIOC的目的在于将代码层与层之间的关系解耦,便于后期对Bean对象的维护。但其没有考虑对业务逻辑进行升级时存在的问题,换言之,在后期如果我们想在之前代码的基础上进行功能扩展可能出现以下的问题:

  1. 假如我们有当前功能方法的源码,就需要阅读当前方法的源码,然后再增加自己的新的逻辑代码.并且修改好后,需要将新的类文件替换旧的类文件,无论是阅读源码还是修改源代码效率和可维护性都极低。
  2. 假如我们没有源码文件,那么就无法直接修改源码增加新的功能逻辑,怎么办?

上述问题的直观解决思路

A对象中有一个testA的方法,A—>testA(),现在需要升级testA方法.创建一个B对象,在B对象中声明一个testB方法,然后在testB中调用testA方法,并且在testB中声明扩展代码.然后将代码中调用A对象的testA方法的代码替换为调用B对象的testB方法.完成了升级.为了方便代码的替换,可以让A和B都实现接口C,将要进行功能扩展的方法在C中声明,这样就只需要将A对象替换为B对象,就不需要修改调用方法了。
AAA
原理图:

传统方式:直接修改源码进行功能扩展:

在这里插入图片描述
进阶的方式:使用“代理”的方式进行:

在这里插入图片描述
进一步的,我们还可以将扩展的代码再次拆分为前扩展和后扩展,代表在原本方法调用前扩展的和调用后扩展的:

在这里插入图片描述
我们将前扩展和后扩展定义为两个接口并实现它们,这样就真正的实现了功能扩展与源代码的解耦,便于后期维护。这也是SpringAOP想要帮助我们实现的。

SchemaBase方式的实现

实现SpringAOP的方式有很多,这里先介绍一种基本的实现方式,被称为SchemaBase方式。

导入JAR包:

在这里插入图片描述
实现前置通知类(上文所述的前扩展代码)

public class MyAdvice implements MethodBeforeAdvice {

	@Override
	public void before(Method method, Object[] objects, Object o) throws Throwable{
		System.out.println("前扩展代码");
	}

}

实现后置通知类(上文所述后扩展代码)

public class MyAdvice implements AfterReturningAdvice{

	@Override
	public void afterReturning(Method method, Object[] objects, Object o) throws Throwable{
		System.out.println("后扩展代码");
	}

}

在applicationcontext.xml文件中配置资源的bean对象以及声明组装规则。

声明关键:

资源对象:
要进行功能扩展的bean对象
前置通知的bean对象
后置通知的bean对象
声明组装规则:(使用AOP标签完成)
声明切点
声明组装

在这里插入图片描述
从Spring容器中直接调用,即可完成扩展后的功能业务

在这里插入图片描述

SchemaBase环绕通知的方式实现

前面我们已经使用前置通知方式和后置通知方式完成了AOP的扩展代码的编写。这里借鉴一下过滤器的概念,在过滤器中会先执行一部分代码,执行后如果放行了则继续执行Servlet,Servlet执行后再次回到过滤器中执行。那么,从AOP的角度过滤器就相当于Servlet的扩展对象了。过滤器中的拦截方法,就相当于扩展方法,而我们将扩展代码和调用原有切点方法的代码全部直接声明在一个方法中了,那么能不能采用此种方案来完成我们会自己的AOP扩展呢?

将扩展代码和调用原有切点方法的代码声明在一起,简化扩展流程。也就说环绕通知中包含了前置通知和后置通知。

在这里插入图片描述
这个方式类似于JDK中动态代理的概念,proceed方法实际上是关于实际对象的对应方法。

在application中配置环绕通知bean

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值