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定义了几个时刻织入增强行为的接口 => ...
随机推荐
- idea 集成svn
1.下载svn客户端 官网下载地址:https://tortoisesvn.net/downloads.html 2. 安装svn客户端 在安装svn客户端的时候一定要勾选,否则在idea上集成svn ...
- js中escape的用法
escape() 方法,它用于转义不能用明文正确发送的任何字符.比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符. var s="http://local ...
- 如何为MyEclipse添加XML文档所使用的DTD
1.打开MyEclipse,找到菜单栏"Window"---->"Preferences(首选项)": 2.在左侧导航菜单栏找到"MyEclip ...
- unittest(22)- p2p项目实战(8)-test_class_auto_incre
# 8.test_class_auto_incre # 使用ddt import requests import unittest from p2p_project_7.tools.http_requ ...
- spring整合ehcache实现缓存
Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它支持注解方式使用缓存,非常方便. spring本身内置了对Cache的支持,之 ...
- 跟随大神实现简单的Vue框架
自己用vue也不久了,学习之初就看过vue实现的原理,当时看也是迷迷糊糊,能说出来最基本的,但是感觉还是理解的不深入,最近找到了之前收藏的文章,跟着大神一步步敲了一下简易的实现,算是又加深了理解. 原 ...
- 《自动化平台测试开发-Python测试开发实战》新书出版了
首先 第一本书,当初在百度阅读初步写了个电子版,刚一上线不久即收到了数百位读者朋友阅读收藏购买,于是顺利成章就出版了纸质书. <软件自动化测试开发>认真看过的读者应该都知道,介绍的主要是自 ...
- Google在百慕大避税几十亿美金,为什么巨头和富豪都会选百慕大避税?
为什么"越有钱越有钱"?为什么富豪只要不自己"作",就能让自己的财富疯狂增加?除了经营意识之外,关键他们还可以利用自己的资源.实力等去做很多看似让人不齿,但其实 ...
- 高阶函数---swift中的泛型介绍(一步步实现Map函数)
说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...
- rpmbuild 实践
安装 rpmbuild 1 # yum install -y rpm-build 查看 rpmbuild 相关的宏和参数 12345678 # rpmbuild --showrc | grep --c ...