Spring注解 - AOP 面向切面编程
基本概念:
AOP: Aspect Oriented Programming,即面向切面编程
指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式
- 前置通知(@Before):在目标方法运行之前执行
- 后置通知(@After):在目标方法运行结束之后执行(无论方法执行成功,还是出现异常,都执行)
- 返回通知(@AfterReturning):在目标方法正常返回之后执行
- 异常通知(@AfterThrowing):在目标方法出现异常后执行
- 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
返回通知和异常通知只能同时执行一个
基本使用:
导入aop依赖:Spring AOP(spring-aspects)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
定义一个业务逻辑类
public class MathCalculator {
public int div(int a, int b){
return a / b;
}
}
定义一个日志切面类,告诉 Spring 这个类是切面类(在切面类加上:@Aspect),并且,给目标方法标注“何时何地”执行(通知注解)
切入点基本格式:权限修饰符 方法返回值 全方法名(参数列表类型) 异常类型,加粗的是必填项
在@Before注解上引用,如果引用类外的切入点表达式,需要使用全方法名
@Aspect
public class LogAspects { //抽取公共的切入点表达式
@Pointcut("execution(* com.spring.aop.MathCalculator.*(..))")
public void pointCut(){
} @Before("pointCut()")
public void logStart() {
System.out.println("方法运行");
} @After("pointCut()")
public void logEnd() {
System.out.println("方法结束");
} @AfterReturning("pointCut()")
public void logReturn() {
System.out.println("方法正常返回");
} @AfterThrowing("pointCut()")
public void logException() {
System.out.println("方法出现异常");
}
}
将切面类和业务逻辑类(目标方法所在类)都注册到ioc容器中,注册的几种方式可以参考前面的博客Spring注解 - 组件的注册
@Bean
public MathCalculator mathCalculator(){
return new MathCalculator();
} @Bean
public LogAspects logAspects(){
return new LogAspects();
}
开启基于注解的AOP模式(在配置类加上:@EnableAspectJAutoProxy)
@Configuration
@EnableAspectJAutoProxy
public class SpringConfiguration
测试一把
@Test
public void test1(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration6.class);
MathCalculator mathCalculator = (MathCalculator) applicationContext.getBean("mathCalculator");
mathCalculator.div(2, 1);
}
运行结果:
-----正常运行-----
方法运行
方法结束
方法正常返回
-------异常------
方法运行
方法结束
方法出现异常
但上述输出的内容太简单了,如果想要得到方法具体信息怎么办?我们对切面类做一些改造
@Aspect
public class LogAspects {
@Pointcut("execution(* com.spring.aop.MathCalculator.*(..))")
public void pointCut() {
}
@Before(value = "pointCut()")
public void logStart(JoinPoint joinPoint) {
//参数列表
Object[] args = joinPoint.getArgs();
//方法名
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法运行,参数列表:" + Arrays.toString(args));
}
@After("pointCut()")
public void logEnd(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法结束");
}
@AfterReturning(value = "pointCut()", returning = "returnInfo")
public void logReturn(JoinPoint joinPoint, Object returnInfo) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法正常返回,返回值:" + returnInfo);
}
@AfterThrowing(value = "pointCut()", throwing = "exception")
public void logException(JoinPoint joinPoint, Exception exception) {
String methodName = joinPoint.getSignature().getName();
System.out.println(methodName + "方法出现异常,异常信息:" + exception);
}
}
运行结果:
-----正常运行-----
div方法运行,参数列表:[2, 1]
div方法结束
div方法正常返回,返回值:2
-------异常------
div方法运行,参数列表:[2, 0]
div方法结束
div方法出现异常,异常信息:java.lang.ArithmeticException: / by zero
注意:参数joinPoint
一定要放在参数表的第一位
Spring注解 - AOP 面向切面编程的更多相关文章
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- Spring的AOP面向切面编程
什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...
- Spring框架——AOP面向切面编程
简介 AOP练习 使用动态代理解决问题 Spring AOP 用AspectJ注解声明切面 前置后置通知 利用方法签名编写AspectJ切入点表达式 指定切面的优先级 基于XML的配置声明切面 Spr ...
- Spring框架 AOP面向切面编程(转)
一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...
- spring:AOP面向切面编程02
参考: https://blog.csdn.net/jeffleo/article/details/54136904 一.AOP的核心概念AOP(Aspect Oriented Programming ...
- Spring之AOP(面向切面编程)_入门Demo
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...
- spring:AOP面向切面编程(注解)03
使用注解写aop时最好使用环绕通知写 切面类: /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspect //表示当 ...
- 【spring源码学习】spring的AOP面向切面编程的实现解析
一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口 => ...
随机推荐
- [LC] 165. Compare Version Numbers
Compare two version numbers version1 and version2.If version1 > version2 return 1; if version1 &l ...
- pressure to compete|listen to sb do|have sb do|felt like|shouldn't have done|spring up|in honour of|not more than|much as|
The pressure to compete causes Americans to be energetic, but it also puts then under a constant emo ...
- mysql 子查询 合并查询
4.1带In 关键字的子查询 一个查询语句的条件可能落在另一个SELECT 语句的查询结果中. SELECT * FROM t_book WHERE booktypeId IN (SELECT id ...
- java生成饼图
pom.xml文件导入依赖包 <!-- https://mvnrepository.com/artifact/org.jfree/jfreechart --> <dependency ...
- 押宝在Apple Watch的智能手表游戏玩得转吗?
Watch的智能手表游戏玩得转吗?" title="押宝在Apple Watch的智能手表游戏玩得转吗?"> 如果你给法拉利跑车贴上金箔,会被认为是俗气.但若在Ap ...
- 多线程的lock功能
import threading def job1(): global A, lock lock.acquire() for i in range(10): A += 1 print('job1', ...
- 码海拾遗:Linux常用命令(一)
一.Linux系统安装 系统安装可以分两类:实体机安装Linux,虚拟机(常用虚拟机软件有两种:VMware和VirtualBox)安装Linux. 安装过程网上有很多教程,这里就不赘述了. 二.常用 ...
- Swizzling的使用
在oc的runtime机制内有一类方法是可以用来实现类间的方法替换.解决了我们实际开发中诸多常规手段所无法解决的问题.关于Method Swizzling,这里有一篇介绍基本用法的文章 场景 最近出于 ...
- 无线个人区域网WPAN
无线个人区域网WPAN (Wireless Personal Area Network) 1.1.概述 在个人工作地方把属于个人使用的电子设备用无线技术连接起来自组网络,不需要使用接入点 AP. 整个 ...
- 达拉草201771010105《面向对象程序设计(java)》第十四周学习总结
达拉草201771010105<面向对象程序设计(java)>第十四周学习总结 第一部分:理论知识 布局管理器: 布局管理器是一组类. 实现java.awt.LayoutManager接口 ...