Spring基础——AOP通知
spring(AOP通知)
切面
切面是封装通用业务逻辑的组件,可以作用到其他组件上。是spring组件中的某个方法、无返回类型、参数类型与通知类型有关。
一个切面 开启数据库 关闭数据库 开启事务 检查登录账号状态 监测账号权限
切点
用于指定哪些组件哪方法使用切面组件,Spring提供表达式来实现该制定。
通知
用于指定组件作用到目标组件的具体位置。
连接点(Joinpoint)
增强程序执行的某个特定位置(要在哪个地方做增强操作)。Spring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。
切点(Pointcut)
切点是一组连接点的集合。AOP通过“切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。
增强(Advice)
增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。
切面(Aspect)
切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。
注解使用
@aspect 定义切面
@pointcut 定义切点
@before 标注Before Advice定义所在的方法
@afterreturning 标注After Returning Advice定义所在的方法
@afterthrowing 标注After Throwing Advice定义所在的方法
@after 标注 After(Finally) Advice定义所在的方法
@around 标注Around Advice定义所在的方法
1.AOP通知(配置xml文件)
QieMian1.java
public class QieMian1 {
public void qianzhi(JoinPoint jp) {
System.out.println("前置通知");
Object [] os = jp.getArgs();
for (Object object : os) {
System.out.println("参数列表为:"+object);
}
} public void houzhi(Object a) {
System.out.println("后置通知"+a);
} public void yichang(JoinPoint jp,Throwable ta) {
System.out.println("异常通知");
ta.printStackTrace();
} public void zuizhong() {
System.out.println("最终通知");
} public void huanrao(ProceedingJoinPoint pjp) {
try {
System.out.println("环绕前");
pjp.proceed();
System.out.println("环绕后");
} catch (Throwable e) {
// TODO Auto-generated catch block
System.out.println("环绕异常");
e.printStackTrace();
}finally {
System.out.println("环绕最终");
}
}
}
ApplicationContext.xml
<!-- 切面1 -->
<bean id="qieMian1" class="com.zy.spring.tools.aop.QieMian1"></bean> <!-- 创建一个切面的bean -->
<aop:config> <!-- aop配置标签 -->
<aop:pointcut expression="execution(* com.zy.spring.service.*.*(..))" id="pc1"/> <!-- 创建一个切点 -->
<aop:aspect order="1" ref="qieMian1"><!-- 创建一个切面 order是切面创建的顺序 ref链接上面创建的切面bean -->
<aop:before method="qianzhi" pointcut-ref="pc1"/><!-- 前置通知 -->
<aop:after-returning method="houzhi" pointcut-ref="pc1" returning="a"/> <!-- 后置通知 returning返回参数-->
<aop:after-throwing method="yichang" pointcut-ref="pc1" throwing="ta"/> <!-- 异常通知 throwing返回参数-->
<aop:after method="zuizhong" pointcut-ref="pc1"/> <!-- 最终通知 -->
<aop:around method="huanrao" pointcut-ref="pc1"/> <!-- 环绕通知 -->
</aop:aspect>
</aop:config>
常用的@AspectJ形式Pointcut表达式的标志符:
1、execution:
Spring AOP仅支持方法执行类型的Joinpoint 所以execution将会是我们用的最多的标志符,用它来帮我们匹配拥有指定方法前面的Joinpoint。
匹配方法execution
execution(返回类型 类的路径.类名.函数名(参数类型1,参数类型2))
execution(String com.chinasofti.Target.save(String))
execution(* com.chinasofti.Target.save(String))
execution(* com.chinasofti.*.save(String))
execution(* com.chinasofti.*.*(String))
execution(* com..*.*(..))
2、Within:
Within标志符只接受类型声明,它将匹配指定类型下所有的Joinpoint。
匹配类within
匹配到类
<aop:pointcut id="targetPintcut" expression="within(com.chinasofti.Target)"/>
调用这个类中的任何一个方法,都会走通知
匹配到包下的类
<aop:pointcut id="targetPintcut" expression="within(com.chinasofti.*)"/>
调用这个包下的任何一个类中的方法,都会走通知
匹配到包下及子包下的类
<aop:pointcut id="targetPintcut" expression="within(com..*)"/>
调用com这个包下的,所有子包及其一个类中的方法,都会走通知
2.AOP通知(注解配置)
QieMian2.java
@Aspect//定义切面
@Component//注册bean
public class QieMian2 {
@Pointcut("execution(* com.zy.spring.service.*.*(..))") //标记切点规则
public void pointcut() {};//创建一个空的方法,相当于切入方法 @Before("pointcut()") //前置通知 切点就是上面创建的pointcut()方法
public void qianzhi(JoinPoint jp) {
System.out.println("注解前置通知");
Object [] os = jp.getArgs();
for (Object object : os) {
System.out.println("参数列表为:"+object);
}
}
@AfterReturning(pointcut="pointcut()",returning="a")//后置通知 returning是方法中定义的参数
public void houzhi(Object a) {
System.out.println("注解后置通知"+a);
}
@AfterThrowing(pointcut="pointcut()",throwing="ta")//异常通知 throwing是方法中定义的参数
public void yichang(JoinPoint jp,Throwable ta) {
System.out.println("注解异常通知");
ta.printStackTrace();
}
@After("pointcut()")//最终通知
public void zuizhong() {
System.out.println("注解最终通知");
}
@Around("pointcut()")//环绕通知
public void huanrao(ProceedingJoinPoint pjp) {
try {
System.out.println("注解环绕前");
pjp.proceed();//放行
System.out.println("注解环绕后");
} catch (Throwable e) {
// TODO Auto-generated catch block
System.out.println("注解环绕异常");
e.printStackTrace();
}finally {
System.out.println("注解环绕最终");
}
}
}
ApplicationContext.xml
<!-- 注解扫描AOP -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
使用注解aop功能,加入aop1的注解扫描即可。
Spring基础——AOP通知的更多相关文章
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
- spring.net AOP通知类型
上篇介绍了spring.net AOP的基本实现,其中有说到通知类型,首先在这里补充解释一下.最后出一个异常通知的实例,因为他的实现和别的通知有些不一样. 1.拦截环绕通知:在Spring中最基础的通 ...
- Java : Spring基础 AOP
简单的JDK动态代理例子(JDK动态代理是用了接口实现的方式)(ICar是接口, GoogleCar是被代理对象, MyCC是处理方法的类): public class TestCar { publi ...
- Spring基础知识之基于注解的AOP
背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法 ...
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- Spring基础篇——Spring的AOP切面编程
一 基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...
- Spring基础系列-AOP源码分析
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html 一.概述 Spring的两大特性:IOC和AOP. AOP是面向切 ...
- Java基础-SSM之Spring的AOP编程
Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...
- Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
Spring AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
随机推荐
- 一文了解Nuget的使用
Nuget介绍 官网定义:NuGet是.NET的软件包管理器(免费).NuGet客户端工具提供了生成和使用软件包的能力.NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库. ...
- elk的搭建
一:准备工作 1.准备一台虚拟机 192.168.175.222 elk-node2 2.关闭防火墙以及selinux 命令:systemctl stop firewalld # ...
- git 使用详解(10)-- 远程分支
远程分支 远程分支(remote branch)是对远程仓库中的分支的索引.它们是一些无法移动的本地分支:只有在Git 进行网络交互时才会更新.远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支 ...
- jQuery中的基本的选择器学习(补充版)
先看整体代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- [TimLinux] JavaScript 模态框可拖动功能实现——节流版
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- csuoj-1900 锋芒毕露
Description 小闪最近迷上了二刀流——不过他耍的其实是剑——新买了一个宝库用来专门存放自己收集的双剑.一对剑有两把,分只能左手用的和只能右手用的,各自有一个攻击力数值.虽然一对剑在小闪刚拿到 ...
- 【Vuejs】269- 提升90%加载速度——vuecli下的首屏性能优化
前言 之前用 ,所以接下来还会介绍一些它们在优化上的异同 分析 vuecli 2.x自带了分析工具只要运行 npm run build --report 如果是 vuecli 3的话,先安装插件 cn ...
- Robotframework常见问题收集
一.Robotframework1.7.3控制台乱码处理 1.找到文件C:\Python37\Lib\site-packages\robotide\contrib\testrunner\testrun ...
- Orleans 文档记录
Orleans 官方文档:官方文档 http://dotnet.github.io/orleans/index.html Orleans 中文文档:中文文档 https://orleanscn.git ...
- vue 点击修改样式
1.页面加载默认一个初始的isact,让第二个div.f具有一个on的类:在点击的时候,传入一个值给data.isact <template> <nav class="cl ...