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 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
随机推荐
- docker数据目录迁移
一.描述 docker默认的数据目录为/var/lib/docker,有的系统数据盘挂载在其他目录下,比如/home为数据盘,这时需要将docker数据目录更改,除了修改docker配置文件的方法,还 ...
- 转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2
先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ...
- 洛谷 P1920 成功密码 题解
这是蒟蒻的第一篇题解,(之前的都没过,估计这篇也过不了 回到正题 这题,本蒟蒻第一眼看到以后,就决定咦,这不是模拟吗? 看到世界范围,嗯,打扰了. 扯回正题 首先,暴力肯定是A不了的(至少我A不了 但 ...
- Python超简单的爬取网站中图片
1.首先导入相关库 import requests import bs4 import threading #用于多线程爬虫,爬取速度快,可以完成多页爬取 import os 2.使用bs4获取htm ...
- Mysql基础02-约束
约束与索引 概念 1.数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability). 实体完整性(Entity Integrity):例如,同一个表 ...
- 关于《iBoard 电子学堂》的学习及进阶方式(精 转)
关于<iBoard 电子学堂>的学习及进阶方式 <iBoard 电子学堂>自发布以来,受到广大网友的热烈关注.虽然我前期设计我花了大量精力,但能得到大家的认可,我也非常欣慰.由 ...
- 重排数列-Java实现(2018网易校招研发岗)
题目: 链接:https://www.nowcoder.com/questionTerminal/6c184566ecff4d3baff3536449d4a3e2 来源:牛客网 小易有一个长度为N的正 ...
- kubernetes-集群备份和恢复
一.备份 思路: ①集群运行中etcd数据备份到磁盘上 ②kubeasz项目创建的集群,需要备份CA证书文件,以及ansible的hosts文件 [deploy节点操作] 1:创建存放备份文件 ...
- Redis数据类型和操作
<"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...
- java面试题干货1-50
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...