Spring AOP面向切面编程案例 (注解驱动开发)
AOP(动态代理):指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
【1】导入 aop 模块;Spring AOP:(spring-aspects);
【2】定义一个业务逻辑类(MathCalculator),在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx);
【3】定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知 MathCalculator.div 运行到哪里然后执行;
通知方法:
■ 前置通知(@Before):logStart:在目标方法(div)运行之前运行;
■ 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束);
■ 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行;
■ 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行;
■ 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced());
【4】给切面类的目标方法标注何时何地运行(通知注解);
【5】将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
【6】必须告诉 Spring 哪个类是切面类(给切面类上加一个注解:@Aspect)
【7】给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的 aop 模式】
【三步】:1)、将业务逻辑组件和切面类都加入到容器中;告诉 Spring 哪个是切面类(@Aspect)
2)、在切面类上的每一个通知方法上标注通知注解,告诉 Spring 何时何地运行(切入点表达式)
3)、开启基于注解的 aop 模式;@EnableAspectJAutoProxy
【提前】:导入 aspects 依赖
1 <dependency>
2 <groupId>org.springframework</groupId>
3 <artifactId>spring-aspects</artifactId>
4 <version>5.1.5.RELEASE</version>
5 </dependency>
【切面类】
1 /**
2 * 切面类
3 * @Aspect: 告诉Spring当前类是一个切面类
4 */
5 @Aspect
6 public class LogAspects {
7
8 //抽取公共的切入点表达式
9 //1、本类引用
10 //2、其他的切面引用
11 @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
12 public void pointCut(){};
13
14 //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
15 @Before("pointCut()")
16 public void logStart(JoinPoint joinPoint){
17 Object[] args = joinPoint.getArgs();
18 System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
19 }
20
21 @After("com.atguigu.aop.LogAspects.pointCut()")
22 public void logEnd(JoinPoint joinPoint){
23 System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
24 }
25
26 //JoinPoint一定要出现在参数表的第一位
27 @AfterReturning(value="pointCut()",returning="result")
28 public void logReturn(JoinPoint joinPoint,Object result){
29 System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
30 }
31
32 @AfterThrowing(value="pointCut()",throwing="exception")
33 public void logException(JoinPoint joinPoint,Exception exception){
34 System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
35 }
【正常类】
1 public class MathCalculator {
2 public int div(int i,int j){
3 System.out.println("MathCalculator...div...");
4 return i/j;
5 }
6 }
【配置类】
1 @EnableAspectJAutoProxy
2 @Configuration
3 public class MainConfigOfAOP {
4
5 //业务逻辑类加入容器中
6 @Bean
7 public MathCalculator calculator(){
8 return new MathCalculator();
9 }
10
11 //切面类加入到容器中
12 @Bean
13 public LogAspects logAspects(){
14 return new LogAspects();
15 }
16 }
Spring AOP面向切面编程案例 (注解驱动开发)的更多相关文章
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- 详细解读 Spring AOP 面向切面编程(二)
本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- spring AOP面向切面编程学习笔记
一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
- Spring AOP面向切面编程详解
前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...
- 详细解读 Spring AOP 面向切面编程(一)
又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...
- Spring Aop面向切面编程&&自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
- Spring AOP 面向切面编程入门
什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...
随机推荐
- 基于LabVIEW的计时器
前言: 最近有人问我,怎么实现一个计时器计时,可以做到启动.停止.重新开始等功能,好久没关于LABVIEW的博文,借这个写个计时器相关内容. 一.Labview时间计时器介绍: 这里采用时间计时器计算 ...
- Unit Test下使用H2内存数据库
1.Maven引入包 <dependency> <groupId>com.h2database</groupId> <artifactId>h2< ...
- mysql自动生成时间
字段类型: DATETIME 默认值: CURRENT_TIMESTAMP
- 注释中的Unicode编码也会被转义
现象 public class Unicode { public static void main(String[] args) { // \u000d System.out.println(&quo ...
- Python模块——os模块详解
- 鸣人的影分身【按照前i个数,最小数是不是0,建立转移方程】
鸣人的影分身 题意 鸣人最多有n个分身,m的能量.分身的能量可以为0. 问有多少种方案数. 思路 很容易定义状态:f[i] [j]: 前i个分身,共花费能量j的方案数. 状态转移:刚开始想的枚举第i个 ...
- 关于 indy Idhttp Post数据抛异常 connection closed Gracefully
delphi 使用indy -idHttp 控件post 数据时 会报connection closed Gracefully这个异常的问题. 网上找了很多方法最多的就是 修改: MyHttp.Req ...
- .net 反射简单介绍
1.什么是反射 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直 ...
- CentOS VMWare安装纪要
一.VMware虚拟机下载与安装 版本:VMware Workstation 16 Pro 二.CentOS下载与安装 版本:CentOS-7-x86_64-DVD-2009.iso 三.CentOS ...
- LeetCode 94. 二叉树的中序遍历()
原题解 题目 约束 题解 方法一 class Solution { public: void inorder(TreeNode* root, vector<int>& res) { ...