博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP 笔记
阅读量:5821 次
发布时间:2019-06-18

本文共 4425 字,大约阅读时间需要 14 分钟。

AOP 面向切面思想。用来分离程序功能,比如讲日志、异常等与功能程序分开,减少代码程序的耦合度。  AOP有3个关键概念、Pointcut切入点、Advice通知、Advisor配置器。

Join Point(连接点)指的是程序运行中的某个阶段点,如某个方法调用、异常抛出。Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发。

Advice是某个连接点所采用的处理逻辑,

Advisor是Pointcut和Advice的配置器,

切入点Pointcut有三种状况:

1、静态切入点:只限于给定的方法和目标类,而不考虑方法的参数。Spring在调用静态切入点时只在第一次的时候计算静态切入点的位置,然后把它缓存起来,以后就不需要再次进行计算。

.*save.*
.*do.*

 

2、动态切入点与静态切入点的区别就是不仅限定给予点的方法和类,动态切入点还可以指定方法的参数,因为参数的变化性,所以动态切入点不能缓存,需要每次调用的时候都进行计算,因此使用动态切入点有很大的性能消耗。(很少用)

 

3、自定义切入点

 

Spring的通知Advice有五种类型:

1、Interception Around 在JointPoint(连接点)前后调用

实现Interception Around 通知的类需要实现接口

org.aopalliance.intercept.MethodInterceptor
package spring.init.aop.daoimpl;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * @author fanbo * ADvice。。Spring的通知 * 实现Interception Around通知的类需要实现MethodInterceptor接口 * */public class LogMethodInterceptor implements MethodInterceptor{    public Object invoke(MethodInvocation mi) throws Throwable {        System.out.println("开始记录日志");        Object val = mi.proceed();        System.out.println("结束日志的记录");        return val;    }}

 

2、Before 在JointPoint前调用

package spring.init.aop.daoimpl;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;/** * @author fanbo * Spring 的通知Advice的第二中类型  Befor 在JointPoint调用之前使用 *实现 org.springframework.aop.MethodBeforeAdvice;接口 */public class LogMethodBeforeAdvice implements MethodBeforeAdvice{    public void before(Method method, Object[] obj1, Object obj2)            throws Throwable {        System.out.println("开始记录日志");    }}

 

3、After Returning 在JointPoint后调用

package spring.init.aop.daoimpl;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;/** * @author fanbo *Spring 的通知Advice的第三种类型  Befor 在JointPoint调用之前使用 *实现 org.springframework.aop.AfterReturningAdvice接口 */public class LogAfterReturningAdvice implements AfterReturningAdvice{    public void afterReturning(Object arg0, Method arg1, Object[] arg2,            Object arg3) throws Throwable {        System.out.println("记录日志结束");    }}

 

4、Throw 在JointPoint抛出异常时调用

package spring.init.aop.daoimpl;import java.rmi.RemoteException;import org.springframework.aop.ThrowsAdvice;/** ** @author fanbo * ADvice。。Spring的通知 * Throw类型是Advice的第四种类型。是在JointPoint连接点抛出异常时调用 * 实现Throw通知的类需要实现org.springframework.aop.ThrowsAdvice接口 * */public class LogThrowAdvice implements ThrowsAdvice{    public void afterThrowing(RemoteException exception) throws Throwable{        System.out.println("记录日志异常,请检查"+exception.toString());    }}

 

5、Introduction 在JointPoint调用完毕之后调用

package spring.init.aop.daoimpl;import org.aopalliance.aop.Advice;import org.aopalliance.intercept.MethodInvocation;import org.springframework.aop.ClassFilter;import org.springframework.aop.IntroductionAdvisor;import org.springframework.aop.IntroductionInterceptor;/** ** @author fanbo * ADvice。。Spring的通知 * Introduction类型是Advice的第五种类型。是在JointPoint调用之后使用 * 实现Introduction通知的类需要实现org.springframework.aop.IntroductionInterceptor;接口和 * org.springframework.aop.IntroductionAdvisor接口 * */public class LogIntroductionAdvice implements IntroductionAdvisor,IntroductionInterceptor{    public Object invoke(MethodInvocation arg0) throws Throwable {        // TODO Auto-generated method stub        return null;    }    public boolean implementsInterface(Class arg0) {        // TODO Auto-generated method stub        return false;    }    public ClassFilter getClassFilter() {        // TODO Auto-generated method stub        return null;    }    public void validateInterfaces() throws IllegalArgumentException {        // TODO Auto-generated method stub            }    public Advice getAdvice() {        // TODO Auto-generated method stub        return null;    }    public boolean isPerInstance() {        // TODO Auto-generated method stub        return false;    }    public Class[] getInterfaces() {        // TODO Auto-generated method stub        return null;    }    }

Spring 的Advisor是Pointcut和Advice的配置器。它是将Advice注入程序中Pointcut位置的代码,在Spring中主要通过XML来配置Pointcut和Advice

 

 

用ProxyFactoryBean创建AOP代理

 

 

。。。。。。笔记待续

转载于:https://www.cnblogs.com/willbesuccess/p/3460058.html

你可能感兴趣的文章
Java内存 -JVM 内存管理
查看>>
我在51testing客串专家时候的互动问题
查看>>
docker环境elasticSearch5.5 head 插件安装步骤
查看>>
Report viewer 水平滚动条
查看>>
关于AbstractCollection
查看>>
Centos 6.5 mkisofs kickstart 制作自动安装iso镜像 光盘
查看>>
Nginx完整配置说明
查看>>
Java核心技术卷1: Java基础知识汇总
查看>>
web服务器的ddos***
查看>>
WebView使用中存在的问题
查看>>
Tomcat服务器SSL报错问题
查看>>
Python实例:毛玻璃效果
查看>>
Android开发中出现的问题及解决(一)
查看>>
6 个重构方法可帮你提升 80% 的代码质量
查看>>
陆上行舟,现在还是理想
查看>>
SaltStack安装与配置
查看>>
惰性载入函数
查看>>
一张图学会数据库迁云最佳路径
查看>>
阿里云MaxCompute被Forrester评为全球云端数据仓库领导者
查看>>
生产场景NFS共享存储优化及实战
查看>>