循序渐进之Spring AOP(2) - 基本概念
学习AOP前要先了解几个重要术语:Joinpoint、Pointcut、Advice
仍然以改装车比喻,拿到心爱的汽车后想做改装,第一件事是什么?找到要改装的地方。车上可改装的地方很多,但每个人感兴趣的点并不一样,有人改装车灯,有人改装轮毂,也有人同时都改,确定位置后装上零件、装饰,就完成了一次"AOP"。
在上面的比喻中,可改装的地方可以看做是连接点(Joinpoint),如类的某个方法调用前、调用后、抛出异常等,spring仅支持方法的连接点。
改装车要告诉改装师傅感兴趣的改装点,同样,在众多的类和方法中,我们需要告诉Spring哪些是我们感兴趣的连接点。AOP通过切点(Pointcut)来描述,例如前一篇中的 "execution(* login(..))" 是告诉Spring我们要找一个名称为login的方法,返回值和参数格式不限。
最后,标记好Pointcut后,我们就要在目标连接点织入(Weaving)写好的代码,代码写在哪儿?写在增强(Advice,另一种直白的翻译是通知,但是增强更好理解一些,本身作用就是植入目标类添加额外的功能)里。当然,增强并不能是随便一段代码,还必须配合连接点的方位,例如MethodBeforeAdvice就只能织入方法调用前的位置,AfterReturningAdvice只能织入方法返回后的位置。
看了这么多后,先实战一下。现有一个汽车类,带有一个lock()方法,表示锁车。现在我们希望在锁车后能"哔哔"两声提示车已经锁好。来看过程代码
- public interface Car {
- void lock();
- }
- public class MyCar implements Car {
- @Override
- public void lock() {
- System.out.println("锁车");
- }
- }
后置增强,在方法正常完成后执行,这里要执行的是输出"哔哔"
- import java.lang.reflect.Method;
- import org.springframework.aop.AfterReturningAdvice;
- public class BibiAdvice implements AfterReturningAdvice {
- @Override
- public void afterReturning(Object returnObj, Method method, Object[] args,
- Object obj) throws Throwable {
- System.out.println("哔哔");
- }
- }
用代码方式创建代理
- import org.springframework.aop.AfterReturningAdvice;
- import org.springframework.aop.framework.ProxyFactory;
- public class Client {
- public static void main(String[] args) {
- Car car = new MyCar();
- AfterReturningAdvice advice = new BibiAdvice();
- ProxyFactory pf = new ProxyFactory();
- pf.setTarget(car);
- pf.setInterfaces(car.getClass().getInterfaces());
- pf.addAdvice(advice);
- Car proxy = (Car)pf.getProxy();
- proxy.lock();
- }
- }
执行结果
- 锁车
- 哔哔
当然,实际开发中不会使用这种代码的方式,Spring会帮我们完成自动创建代理工作,但从基础做起有助于了解底层实现的技术。
下面来看其他几种Spring可用的增强:
前置增强
- public class BeforeAdviceDemo implements MethodBeforeAdvice {
- @Override
- public void before(Method method, Object[] args, Object obj)
- throws Throwable {
- System.out.println("锁车前关好窗户");
- }
- }
环绕增强
- public class AroundAdviceDemo implements MethodInterceptor {
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Object[] args = invocation.getArguments();
- String name = (String)args[0];
- System.out.println("Hi, " + name);
- Object obj = invocation.proceed(); //调用目标方法
- System.out.println("Goodbye! " + name);
- return obj;
- }
- }
异常抛出
- public class ThrowsAdviceDemo implements ThrowsAdvice {
- public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {
- System.out.println("抛出异常:" + ex.getMessage());
- System.out.println("异常处理...");
- }
- }
另外还有一种特殊的类型Introduction,实现较为复杂暂不演示。
下一节来演示通过配置文件把这些增强织入的目标类中。
循序渐进之Spring AOP(2) - 基本概念的更多相关文章
- 我所理解的Spring AOP的基本概念
Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了非常多样例后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 如果一个OA系统中的一个 ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- 循序渐进之Spring AOP(3) - 配置代理
上一篇介绍了几种Advice(增强),并通过代码演示了生成代理的方式,下面来看通过配置文件配置方式把Advice织入目标类. 注意,配置文件方式仍然不是spring AOP的最好方式,学习配置方式也是 ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)(转)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- spring AOP的基本概念
AOP的概念和使用原因 现实中有一些内容并不是面向对象(OOP)可以解决的,比如数据库事务,它对于企业级的Java EE应用而言是十分重要的,又如在电商网站购物需要经过交易系统.财务系统,对于交易系统 ...
- Spring AOP(一)--基本概念
AOP(Aspect Oriented Programing),意为面向切面编程,其实看了很多书本的介绍和说明,我觉得这些解释都太过书面,也可能是翻译的原因,总觉得还是不太懂,也难以理解这种叫法,尤其 ...
- Spring学习十三----------Spring AOP的基本概念
© 版权声明:本文为博主原创文章,转载请注明出处 什么是AOP -面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 -主要的功能是:日志记录.性能统计.安全控制.事务处理. ...
- 循序渐进之Spring AOP(6) - 使用@Aspect注解
前面几节的示例看起来让人沮丧,要记忆如此多的接口.类和继承关系,做各种复杂的配置.好在这些只是一种相对过时的实现方式,现在只需要使用@Aspect注解及表达式就可以轻松的使用POJO来定义切面,设计精 ...
- 循序渐进之Spring AOP(5) - 创建切面
在掌握了可用的增强后,接下来要做的就是精确的描述切点.前面的示例都是指定一个目标类并把增强织入到所有方法中,实际开发显然会有更精细的筛选需求,比如对所有类中名称以test结尾的方法加入监控执行时间,或 ...
随机推荐
- .NET 实现DES加密解密处理
.NET 实现DES加密解密处理 using System; using System.Text; using System.Security.Cryptography; using System.I ...
- Android项目实战(三十七):Activity管理及BaseActivity的实现
Ps:7-10月 完成公司两个app项目上架.漏掉的总结 开始慢慢补上. 一.写一个Activity的管理类 1.单例模式,以栈(先进后出)的形式存储Activity对象 public class A ...
- 《高性能MySQL(第3版)》【PDF】下载
内容简介 <高性能mysql(第3版)>是mysql 领域的经典之作,拥有广泛的影响力.第3版更新了大量的内容,不但涵盖了最新mysql5.5版本的新特性,也讲述了关于固态盘.高可扩展性设 ...
- JDBC结果集rs.next()注意事项
写在前面: 用JDBC从数据库中查询数据要用到结果集ResultSet,其中我们在获取结果的时候经常用到rs.next()方法来判断是否查询到了数据. 但是要特别注意,next()方法用一次,游标就往 ...
- Javascript之模拟文字高亮
在我们平时浏览网页的时候,我们常常会用到Ctrl+F(搜索)功能,被搜索到的文字就是高亮显示.那么,如何在Javascript中模拟文字高亮显示这一功能呢? 以下为笔者写的样例代码: <!DOC ...
- SpringMVC底层数据传输校验的方案(修改版)
团队的项目正常运行了很久,但近期偶尔会出现BUG.目前观察到的有两种场景:一是大批量提交业务请求,二是生成批量导出文件.出错后,再执行一次就又正常了. 经过跟踪日志,发现是在Server之间进行jso ...
- lambda表达式不使用委托(delegate) 用FUNC
lLambda不使用delegate关键字,而使用 Lambda运算符 => goes to l 1.Func<int,string> getInput = (int age ...
- 操作Frame和IFrame中页面元素
HTML <iframe> 标签 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). frame标签有frameset.frame.iframe三种,frameset ...
- oracle12c_安装3——部署
数据库安装后需要根据实际情况修改相关参数. 1.生成pfile以防万一. SQL> create pfile from spfile; 2.修改内存参数 只要设置MEMORY_MAX_TARGE ...
- 笔记-NSArray 逆序reverseObjectEnumerator 及 NSEnumerator 遍历
//1.原始数组 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@&qu ...