循序渐进之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结尾的方法加入监控执行时间,或 ...
随机推荐
- 「mysql优化专题」单表查询优化的一些小总结,非索引设计(3)
单表查询优化:(关于索引,后面再开单章讲解) (0)可以先使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的.这可以帮我们分析是查询语句或是表结构的性能瓶颈. (1)写sql ...
- mybatis 整合spring之mapperLocations配置的问题
今天尝试spring整合mybatis时遇到这么一个问题,就是在配置sqlSessionFactory时是否要配置mapperLocations的问题. <bean id="sessi ...
- Idea在导入有maven项目时,不能自动识别pom.xml
当在idea中导入maven项目时,不能自动识别pom文件,显示为普通橙色xml文件. 解决方法:点击最右侧侧边栏,点击添加(蓝的的小加号),选择你导入项目的pom.xml文件
- JavaScript数字例子,二分法,冒泡排序
先看一下两个例子: 十个成绩,求总分,最高分,最低分 //输入10个成绩,求总分,最高,最低 var arr=new Array(67,45,56,12,90,98,23,43,56,99,97); ...
- windows 下共享内存使用方法示例
windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...
- vs2015企业版密钥
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- php生成雪花图像(不美观请见谅)
<?php /* //新建图像 //雪花 @header("Content-Type:image/png"); $w = 500; $h = 500; //create ...
- Ubuntu Nginx 开机自启动
#! /bin/sh # chkconfig: 2345 55 25 # Description: Startup script for nginx webserver on Debian. Plac ...
- HTML5 给图形绘制阴影(绘制五角星示例)
几个属性 shadowOffsetX:阴影的横向位移量. shadowOffsetY:阴影的纵向位移量. shadowColor:阴影的颜色. shadowBlur:阴影的模糊范围. 属性说明 sha ...