探秘SpringAop(一)_介绍以及使用详解
常用的编程范式
AOP 是什么
- 是一种编程方式,不是编程语言
- 解决特定问题,不能解决所有的问题
- OOP的补充,不是代替
AOP 初衷
- DRY: Don't repeat yourself(代码重复)
- SoC:Separation of Concerns(关注点分离)
- 水平分离:展示层-> 服务层 -> 持久层
- 垂直分离:模块划分(订单、库存等)
- 切面分离:分离功能性需求与非功能性需求
AOP的优点
- 集中处理某一关注点/横切逻辑
- 可以很方便地添加/删除关注点
- 侵入性少,增强代码可读性及可维护性
AOP的应用场景
- 权限控制
- 缓存控制
- 性能监控
- ...
支持AOP的语言
- Java、Python、PHP...
SpringAOP使用详解
首先,我整理了一张图,让大家更好的梳理SpringAOP的使用

@Poincut 详解
匹配包/类型_ within()
匹配ProductService类里头的所有方法
@Pointcut("within(com.zhb.service.ProductService)")
匹配com.zhb包及子包下所有类的方法
@Pointcut("within(com.zhb..*)")
匹配对象
匹配AOP对象的目标对象为指定类型的方法,即LogService的aop代理对象的方法
@Pointcut("this(com.zhb.log.Loggable)")
匹配实现Loggable接口的目标对象(而不是aop代理后的对象)的方法
@Pointcut("target(com.zhb.log.Loggable)")
this 可以拦截 DeclareParents(Introduction)
target 不拦截 DeclareParents(Introduction)
匹配所有以Service结尾的bean里头的方法
@Pointcut("bean(*Service)")
匹配参数 args()
匹配任何以find开头而且只有一个Long参数的方法
@Pointcut("execution(* ..find(Long))")
匹配任何以find开头的而且第一个参数为Long型的方法
@Pointcut("execution(* ..find(Long,..))")
匹配任何只有一个Long参数的方法
@Pointcut("within(com.zhb..*) && args(Long)")
匹配第一个参数为Long型的方法
@Pointcut("within(com.zhb..*) && args(Long,..)")
匹配注解
- 匹配方法标注有AdminOnly的注解的方法
- @Pointcut("@annotation(com.zhb.anno.AdminOnly) && within(com.zhb..*)")
- 匹配标注有NeedSecured的类底下的方法 //class级别
- @Pointcut("@within(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
- 匹配标注有NeedSecured的类及其子类的方法 //runtime级别
- 在spring context的环境下,二者没有区别
- @Pointcut("@target(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
- 匹配传入的参数类标注有Repository注解的方法
- @Pointcut("@args(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配方法
匹配任何公共方法
@Pointcut("execution(public * com.zhb.service..(..))")
匹配com.zhb包及子包下Service类中无参方法
@Pointcut("execution(* com.zhb..Service.())")
匹配com.zhb包及子包下Service类中的任何只有一个参数的方法
@Pointcut("execution(* com.zhb..Service.(*))")
匹配com.zhb包及子包下任何类的任何方法
@Pointcut("execution(* com.zhb...(..))")
匹配com.zhb包及子包下返回值为String的任何方法
@Pointcut("execution(String com.zhb...(..))")
匹配异常
execution(public * com.zhb.service..(..) throws java.lang.IllegalAccessException)
其实,这么多实际工作中用到的比较少,我平时就用过execution 这一个。
Advice 详解
- @Before(value = "matchLongArg() && args(productId)")
- public void beforeWithArgs(Long productId)
- @AfterReturning(value = "matchReturn()",returning = "returnValue")
- public void getReulst(Object returnValue)
给出一段常用代码
@Pointcut("within(com.zhb.controller.GirlController)")
public void mathType(){}
@Before(value = "mathType() && args(obj)")
public void before(Object obj){
System.out.println("这里是目标方法执行前先执行");
//获取参数
System.out.println("这里是目标方法的参数"+obj.toString());
}
@AfterReturning(returning = "entity",value = "mathType()")
public void after(JoinPoint joinPoint,Object entity){
System.out.println("这里是目标方法执行完并成功返回结果 正常结束后才执行");
System.out.println("方法的返回结果为"+entity);
System.out.println("目标方法内的参数为"+ Arrays.asList(joinPoint.getArgs()));
}
@AfterThrowing(throwing = "e",value = "mathType()")
public void mathThrow(Throwable e){
System.out.println("这里是目标方法抛出异常后才执行");
System.out.println("异常信息为"+e);
}
大家再用到的时候可以自行搜索
探秘SpringAop(一)_介绍以及使用详解的更多相关文章
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- SQL Server 表的管理_关于完整性约束的详解(案例代码)
SQL Server 表的管理之_关于完整性约束的详解 一.概述: ●约束是SQL Server提供的自动保持数据库完整性的一种方法, 它通过限制字段中数据.记录中数据和表之间的数据来保证数据的完整性 ...
- Nginx的介绍和安装详解
[介绍+安装]Nginx的介绍和安装详解 == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx ...
- rsync的介绍及参数详解,配置步骤,工作模式介绍
rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- UML简单介绍—类图详解
类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...
- Underscore _.template 方法使用详解
为什么用「void 0」代替「undefined」 undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写. 事实上,undefined ...
- Python基本语法_输入/输出语句详解
目录 目录 前言 输入 raw_input input raw_input 和 input 的区别 输出 print print 基本格式化输出 print复杂格式化输出 flags标志位 width ...
- 黑马程序员_ Objective-c 面向对象笔记详解
1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...
随机推荐
- java 继承类之后,访问不到超类的属性的原因及解决方法
是因为超类里的属性没有加上public关键字 解决方法: 超类和超类里的属性或者方法如果想被其他包下的方法调用,就必须全部加上public权限,即设置为公开访问 例: @Controller publ ...
- dpkg使用记录
dpkg -l 查看所有已安装的包 grep即可过滤想要的内容 dpkg -r 包名 // 卸载包 -P 完全卸载 可能会有配置文件不能删除 不能删除的重启再卸载即可 dpkg -i 包 ...
- SSISDB3:Package的执行实例
SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...
- sqlmap简单中文说明
首先下载需要的文件,如果是windows环境直接到http://sqlmap.org/下载安装所需要的文件即可. 更新 svn checkout https://svn.sqlmap.org/sqlm ...
- 【LeetCode算法题库】Day5:Roman to Integer & Longest Common Prefix & 3Sum
[Q13] Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Valu ...
- springmvc使用ajax进行数据交互时,session失效问题(@ResponseBody与session能否同时使用?)
今天做博客demo的时候遇到了这样的问题:当我用ajax进行资源请求时,需要顺便将账户信息存入session.但是后来发现有@Responsebody标签时,直接用HttpSession存数据时,根本 ...
- C++可继承的单例基类模板
目录 一.介绍 二.代码 三.关键处 五.参考资料 一.介绍 最近在写一个项目,其中用到好几个单例,类本身的设计不是很复杂,但是如果每个都写一遍单例又觉得有点冗余:所以查资料写了一个单例基类模板,只要 ...
- 学习python,第五篇
Python中%r和%s的详解及区别 %r用rper()方法处理对象%s用str()方法处理对象 有些情况下,两者处理的结果是一样的,比如说处理int型对象. 例一: print "I am ...
- Linear Regression and Maximum Likelihood Estimation
Imagination is an outcome of what you learned. If you can imagine the world, that means you have lea ...
- 机器学习算法 --- Decision Trees Algorithms
一.Decision Trees Agorithms的简介 决策树算法(Decision Trees Agorithms),是如今最流行的机器学习算法之一,它即能做分类又做回归(不像之前介绍的其他学习 ...