SpringAOP原理、环绕通知、SchemaBase方法、Aspectj方法

30 篇文章 0 订阅
17 篇文章 0 订阅

1.springAOP原理图

在这里插入图片描述

2.springAOP的SchemaBase方式实现

①SpringAOP的本质:

我们将要进行功能扩展相关的材料以及对应的组织规则告诉Spring容器,Spring容器帮

我们动态创建一个代理对象。我们直接从Spring容器中获取代理对象完成功能开发。

②导入SpringAOP的jar包,并创建前置通知类和后置通知类

前置通知类:实现MethodBeforeAdvice接口,重写before方法,在before方法中声明扩

展前的逻辑代码

后置通知类:实现AfterReturningAdvice接口,重写after方法,在after方法中声明扩展

后的逻辑代码

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

资源对象

要进行功能扩展的bean对象

前置通知的bean对象

后置通知的bean对象

声明组装规则:(使用AOP标签完成)

声明切点

声明组装

3.SpringAOP的专业概念

真实对象:

要进行功能扩展的对象,相当于A对象

代理对象:

完成功能扩展的对象,相当于B对象.

切点:

要进行功能扩展的方法,相当于testA()方法

前置通知方法:

在切点之前执行的扩展方法

后置通知方法:

在切点之后执行的扩展方法

切面:

由前置通知+切点+后置通知形成的横向执行的面

织入:

由前置通知+切点+后置通知形成切面的过程

AOP的概念:面向切面的编程

在这里插入图片描述

4.SchemaBase方式环绕通知方法实现AOP

特点:

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

包含了前置通知和后置通知。

使用:

① 创建一个普通Java类,实现环绕通知的接口。

② 在applicationcontext.xml文件中配置环绕通知的bean

③ 在组装规则中使用配置环绕通知的组装。

注意:前置通知和后置通知和环绕通知可以同时使用,执行顺序和配置顺序相关。

5.SchemaBase方式的异常通知

使用:

① 创建一个普通Java类,实现异常接口。

② 在applicationcontext.xml文件中配置异常通知bean对象

③ 在applicationcontext.xml文件中配置异常通知bean的组装

注意:建议将异常通知的配置配置在组装规则的最上面。

6.SpringAOP的SchemaBase方法的参数

①前置通知

使用:

(1)声明一个普通Java类,实现BeforeAdvice接口。

(2)在Spring配置文件中配置前置通知的bean对象

(3)配置组装

方法:

方法名:before

调用者:代理对象中的扩展方法调用

方法体:声明切点之前执行的扩展代码

参数:

Method method:切点的方法对象

Object[] objects:代理方法接收的实参的数组

Object o:真实对象

②后置通知

使用:

(1)声明一个普通Java类,实现AfterReturningAdvice接口。

(2)在Spring配置文件中配置后置通知的bean对象

(3)配置组装

方法:

方法名:after

调用者:代理对象中的扩展方法调用

方法体:声明切点之后执行的扩展代码

参数:

Object o:真实方法的返回值

Method method:切点的方法对象

Object[] objects:代理方法接收的实参的数组

Object o:真实对象

③环绕通知

使用:

(1)声明一个普通Java类,实现MethodInterceptor接口。

(2)在Spring配置文件中配置环绕通知的bean对象

(3)配置组装

方法:

方法名:invoke

调用者:代理对象中的扩展方法调用

方法体:声明扩展代码同时根据需求是否放行。

参数:

MethodInvocation

④异常通知:

使用:

(1)明一个普通Java类,实现ThrowAdvice接口。

(2)在Spring配置文件中配置异常通知的bean对象

(3)配置组装

方法:

方法名:afterThrowing

调用者:代理对象中的扩展方法的catch中调用

方法体:根据异常信息处理异常。

参数:Exception ex

参数的作用:获取异常信息

7.SpringAOP的Aspectj方式实现

使用:

① 创建一个web项目并导入AOP的相关jar包

② 在src下声明mvc的包结构

③ 在src下创建并配置applicationcontext.xml

a. 切点的bean

b. 扩展类的bean

c. 配置切面

声明切点

声明前置通知

声明后置通知

声明环绕通知

声明异常通知

④ 获取Spring容器中的扩展对象完成功能操作

8.Acspectj和SchemaBase的异同

相同点:

在不修改源码的情况下都能实现功能的扩展

不通点:

(1) SchemaBased方式基于接口来区别前置和后置和环绕和异常通知的,而AspectJ方

​ 式是在配置文件中使用标签来区分。

(2) AspectJ方式在配置中的配置方式发现其切点的声明以及对应的通知组装中,切点

只在Aop:aspect标签下有效。而SchemaBased方式声明的切点在全局效.SchemaBased

的切点的通用性比AspectJ方式要好。

(3) AspectJ方式扩展涉及参数的流程:

① 切点方法中声明形参完成数据处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqVxdRhh-1600604328076)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\e8836d4c6d8c4b4c8fb491c1fc53dc60\ip_image002.jpeg)]

② 修改通知方法声明形参接收对应的实参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BG9MCYht-1600604328079)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\f38ea776782247ad95e0a841b52d7ff2\ip_image004.jpeg)]

③ 修改配置文件中的切点声明,切点中的方法上声明对应的参数类型。同时还要

声明参数的形参名

④ 在通知的配置上声明参数名

(4) 在SchemaBased方式涉及形参的流程:

① 在切点方法上声明形参完成功能处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKi3GwAC-1600604328090)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\19260d3d9cdf48aaa4f8522f1939c62d\ip_image008.jpeg)]

② 在配置文件中修改切点的路径为带有参数的切点

③ 直接在通知方法中的形参中的Object[]中获取参数使 用即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEVuRM3y-1600604328094)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\23bc4f14fff0411abd35746ee32800e8\ip_image012.jpeg)]

总结:不涉及到参数问题使用AspectJ方式完成功能扩展比较方便,但是涉及到参数后使用

SchemaBased方式比较方便。

9.SpringAOP的切点的声明格式

① 切点是某包某类的无参数的方法:

示例:

execution(* com.bjsxt.service.impl.Student.test())

② 切点是某包某类带有参数的方法

示例:

execution(* com.bjsxt.service.impl.Student.test(String,int))

③ 切点是某包某类的某个同名的所有方法

示例:… 表示任意个数任意类型的参数

execution(* com.bjsxt.service.impl.Student.test(…))

④ 切点是某包下的某类的所有方法

示例:*表示任意的类名,方法名,包名

execution(* com.bjsxt.service.impl.Student.*(…))

⑤ 切点是某包下的所有类的所有方法

示例:* 表示任意的类名,方法名,包名

execution(* com.bjsxt.service.impl..(…))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值