文章目录
- 1、SpringAOP的专业概念:
- 2、SpringAOP的SchemaBase方式基本流程
- SchemaBase方式环绕通知方式实现AOP
- SchemaBase方式的异常通知
- SpringAOP的SchemaBase方法的参数
1、SpringAOP的专业概念:
真实对象: 要进行功能扩展的对象,相当于A对象
代理对象: 完成功能扩展的对象,相当于B对象.
切点: 要进行功能扩展的方法,相当于testA()方法
前置通知方法: 在切点之前执行的扩展方法
后置通知方法: 在切点之后执行的扩展方法
切面: 由前置通知+切点+后置通知形成的横向执行的面
织入: 由前置通知+切点+后置通知形成切面的过程
AOP的概念: 面向切面的编程(在不改变原有代码的基础上扩展功能)
SpringAOP的本质总结:
我们将要进行功能扩展相关的材料以及对应的组织规则告诉Spring容器,Spring容器帮我们动态创建一个代理对象。我们直接从Spring容器中获取代理对象完成功能开发。
2、SpringAOP的SchemaBase方式基本流程
①导入SpringAOP的jar包
②在src下创建包advice,并创建前置通知类和后置通知类
前置通知类
创建一个普通的java类,实现MethodBeforeAdvice接口,
重写before方法,在before方法中声明扩展前的逻辑代码。
后置通知类:
创建一个普通的Java类,实现AfterReturningAdvice接口,重写after方法,并在after方法中声明扩展后的逻辑代码。
③在applicationcontext.xml文件中配置资源的bean对象以及声明组装规则。
资源对象:
要进行功能扩展的bean对象
前置通知的bean对象
后置通知的bean对象
声明组装规则:(使用AOP标签完成)
声明切点
声明组装
④从Spring容器中直接获取代理对象完成功能开发
注意:如果让Spring容器对象某个bean对象按照AOP进行功能扩展,则从Spring容器中使用该对象的ID获取的对象已经不是其本身了,而是他的代理对象
SchemaBase方式环绕通知方式实现AOP
解释:
前面我们已经使用前置通知方式和后置通知方式完成了AOP的扩展代码的编写。而我们之前学过过滤器的概念,在过滤器中会先执行一部分代码,执行后如果放行了则继续执行Servlet,Servlet执行后再次回到过滤器中执行。那么,从AOP的角度过滤器就相当于Servlet的扩展对象了。过滤器中的拦截方法,就相当于扩展方法,而我们将扩展代码和调用原有切点方法的代码全部直接声明在一个方法中了,那么能不能采用此种方案来完成我们会自己的AOP扩展呢?
实现:
环绕通知
特点:
将扩展代码和调用原有切点方法的代码声明在一起,简化扩展流程。也就说环绕通知中包含了前置通知和后置通知。
使用:
①创建一个普通Java类,实现环绕通知的接口。
②在applicationcontext.xml文件中配置环绕通知的bean
③在组装规则中使用配置环绕通知的组装。
注意:前置通知和后置通知和环绕通知可以同时使用,执行顺序和配置顺序相关。
SchemaBase方式的异常通知
问题:
在我们封装一个功能方法时,一般方法处理数据所造成的异常信息需要抛出,或者代码编译没有问题,运行期间出现问题,该异常也应该有调用者来处理。那么在SpringAOP中,代理对象是动态生成的,在代理对象中会调用前置通知,后置通知,环绕通知,切点方法,那么如果这些方法出现异常信息,理论上来说应该在扩展对象中的扩展方法中完成异常的处理。但是尴尬的是,代理对象是动态生成的,不是由我们创建类然后根据类文件创建出来的,那么我们就无法直接的声明异常处理代码了,怎么办呢?
解决:
在外部声明异常处理的功能方法,让SpringAOP动态生成的代理对象,在生成的catch中调用我们声明的异常处理方法即可。
使用:
①创建一个普通Java类,实现异常接口。
②在applicationcontext.xml文件中配置异常通知bean对象
③在applicationcontext.xml文件中配置异常通知bean的组装
SpringAOP的SchemaBase方法的参数
[1]前置通知
使用:
①声明一个普通Java类,实现BeforeAdvice接口。
②在Spring配置文件中配置前置通知的bean对象
③配置组装
方法:
方法名:before
调用者:代理对象中的扩展方法调用
方法体:声明切点之前执行的扩展代码
参数:
( Method method, Object[] objects, Object o )
参数的作用:
[2]后置通知
使用:
①声明一个普通Java类,实现AfterReturningAdvice接口。
②在Spring配置文件中配置后置通知的bean对象
③配置组装
方法:
方法名:after
调用者:代理对象中的扩展方法调用
方法体:声明切点之后执行的扩展代码
参数:
( Object o, Method method, Object[] objects, Object o1 )
参数的作用:
[3]环绕通知
使用:
①声明一个普通Java类,实现MethodInterceptor接口。
②在Spring配置文件中配置环绕通知的bean对象
③配置组装
方法:
方法名:invoke
调用者:代理对象中的扩展方法调用
方法体:声明扩展代码同时根据需求是否放行。
参数:
( MethodInvocation methodInvocation )
参数的作用:
[4]异常通知
使用:
①声明一个普通Java类,实现ThrowAdvice接口。
②在Spring配置文件中配置异常通知的bean对象
③配置组装
方法:
方法名:afterThrowing
调用者:代理对象中的扩展方法的catch中调用
方法体:根据异常信息处理异常。
参数:
( Exception ex )
参数的作用:
获取异常信息