循序渐进之Spring AOP(2) - 基本概念
2016-04-08 23:38
411 查看
学习AOP前要先了解几个重要术语:Joinpoint、Pointcut、Advice
仍然以改装车比喻,拿到心爱的汽车后想做改装,第一件事是什么?找到要改装的地方。车上可改装的地方很多,但每个人感兴趣的点并不一样,有人改装车灯,有人改装轮毂,也有人同时都改,确定位置后装上零件、装饰,就完成了一次"AOP"。
在上面的比喻中,可改装的地方可以看做是连接点(Joinpoint),如类的某个方法调用前、调用后、抛出异常等,Spring仅支持方法的连接点。
改装车要告诉改装师傅感兴趣的改装点,同样,在众多的类和方法中,我们需要告诉Spring哪些是我们感兴趣的连接点。AOP通过切点(Pointcut)来描述,例如前一篇中的 "execution(* login(..))" 是告诉Spring我们要找一个名称为login的方法,返回值和参数格式不限。
最后,标记好Pointcut后,我们就要在目标连接点织入(Weaving)写好的代码,代码写在哪儿?写在增强(Advice,另一种直白的翻译是通知,但是增强更好理解一些,本身作用就是植入目标类添加额外的功能)里。当然,增强并不能是随便一段代码,还必须配合连接点的方位,例如MethodBeforeAdvice就只能织入方法调用前的位置,AfterReturningAdvice只能织入方法返回后的位置。
看了这么多后,先实战一下。现有一个汽车类,带有一个lock()方法,表示锁车。现在我们希望在锁车后能"哔哔"两声提示车已经锁好。来看过程代码
后置增强,在方法正常完成后执行,这里要执行的是输出"哔哔"
下面来看其他几种Spring可用的增强:
前置增强
下一节来演示通过配置文件把这些增强织入的目标类中。
仍然以改装车比喻,拿到心爱的汽车后想做改装,第一件事是什么?找到要改装的地方。车上可改装的地方很多,但每个人感兴趣的点并不一样,有人改装车灯,有人改装轮毂,也有人同时都改,确定位置后装上零件、装饰,就完成了一次"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,实现较为复杂暂不演示。
下一节来演示通过配置文件把这些增强织入的目标类中。
相关文章推荐
- java对象的强引用,软引用,弱引用和虚引用
- java web中servlet、jsp、html 互相访问的路径问题。
- 根据先序和中序遍历重建二叉树java实现
- java正则表达式简介
- JAVA 对象引用,以及对象赋值(转载)
- Java笔记
- 复原eclipse、myeclipse的Package Explorer
- 如何在安装好myecplise后添加新的jdk
- Myeclipse中指定.settings/target/.classpath/.project文件不提交到SVN
- java小知识点总结
- 12.JAVA编程思想——集合的类型
- 11.JAVA编程思想——枚举器
- JAVA开发环境配置
- java web开发中property文件java程序解析
- leetcode Remove Element(27)
- Android 学习笔记一 之 Eclipse篇
- activiti工作流与spring整合
- Struts 2 类型转换器
- leetcode Roman to Integer(13)
- Java技术_Java千百问(0023)_如何抛出异常