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方式扩展涉及参数的流程:
① 切点方法中声明形参完成数据处理
② 修改通知方法声明形参接收对应的实参
③ 修改配置文件中的切点声明,切点中的方法上声明对应的参数类型。同时还要
声明参数的形参名
④ 在通知的配置上声明参数名
(4) 在SchemaBased方式涉及形参的流程:
① 在切点方法上声明形参完成功能处理
② 在配置文件中修改切点的路径为带有参数的切点
③ 直接在通知方法中的形参中的Object[]中获取参数使 用即可
总结:不涉及到参数问题使用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..(…))