当前位置: 首页 > news >正文

Spring AOP基于注解方式实现

1. 场景介绍

目前假设我们有一个计算器类,并要为其中的方法添加日志功能。

计算器类如代码所示:

public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}
public class CalculatorPureImpl implements Calculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}@Overridepublic int sub(int i, int j) {int result = i - j;return result;}@Overridepublic int mul(int i, int j) {int result = i * j;return result;}@Overridepublic int div(int i, int j) {int result = i / j;return result;}
}

可以看到,计算器类的实现类目前只有最核心的功能方法。

下面,我们就使用spring aop为其添加日志功能。

2. 实现

步骤如下所示:

2.1 加入依赖

<!-- spring-aspects会帮我们传递过来aspectjweaver -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.6</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.6</version>
</dependency>

2.2 声明切面类

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;// @Aspect表示这个类是一个切面类
@Aspect
// @Component注解保证这个切面类能够放入IOC容器
@Component
public class LogAspect {// @Before注解:声明当前方法是前置通知方法// value属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上@Before(value = "execution(public int org.kkk.proxy.CalculatorPureImpl.add(int,int))")public void printLogBeforeCore() {System.out.println("[AOP前置通知] 方法开始了");}@AfterReturning(value = "execution(public int org.kkk.proxy.CalculatorPureImpl.add(int,int))")public void printLogAfterSuccess() {System.out.println("[AOP返回通知] 方法成功返回了");}@AfterThrowing(value = "execution(public int org.kkk.proxy.CalculatorPureImpl.add(int,int))")public void printLogAfterException() {System.out.println("[AOP异常通知] 方法抛异常了");}@After(value = "execution(public int org.kkk.proxy.CalculatorPureImpl.add(int,int))")public void printLogFinallyEnd() {System.out.println("[AOP后置通知] 方法最终结束了");}}

2.3 开启aspectj注解支持

@Configuration
@ComponentScan(basePackages = "org.kkk")
//作用等于 <aop:aspectj-autoproxy /> 配置类上开启 Aspectj注解支持!
@EnableAspectJAutoProxy
public class MyConfig {
}

2.4 测试

@SpringJUnitConfig(value = {MyConfig.class})
public class AopTest {@Autowiredprivate Calculator calculator;@Testpublic void testCalculator(){calculator.add(1,1);}
}

相关文章:

  • python中的模块和包
  • 【C++】深度解剖多态
  • 数据结构与算法:链式二叉树
  • c++单例模式和call_once函数
  • 一键部署Tesseract-OCR环境C++版本(Windows)
  • 速盾网络:cdn加速技术和云计算的区别
  • spring三种配置方式总结
  • 笔记本上使用usb蓝牙适配器
  • 软件测试相关内容第三弹--软件测试基础
  • round四舍五入在python2与python3版本间区别
  • ubuntu 20.04 安装 huggingface transformers 环境
  • 从零搭建NodeJS项目(小白教程)
  • 2024年阿里云服务器租用费用一年和包月价格表
  • Diddler抓包工具——学习笔记
  • 2. gin中间件注意事项、路由拆分与注册技巧
  • [译]前端离线指南(上)
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Gradle 5.0 正式版发布
  • Java的Interrupt与线程中断
  • 关于Java中分层中遇到的一些问题
  • 诡异!React stopPropagation失灵
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 时间复杂度与空间复杂度分析
  • 使用 Docker 部署 Spring Boot项目
  • 写给高年级小学生看的《Bash 指南》
  • 在Mac OS X上安装 Ruby运行环境
  • 栈实现走出迷宫(C++)
  • 最简单的无缝轮播
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #NOIP 2014# day.2 T2 寻找道路
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (C语言)字符分类函数
  • (JS基础)String 类型
  • (办公)springboot配置aop处理请求.
  • (二)springcloud实战之config配置中心
  • (力扣)1314.矩阵区域和
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四)库存超卖案例实战——优化redis分布式锁
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 5种线程安全集合
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core WebAPI中封装Swagger配置
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net中ListT 泛型转成DataTable、DataSet
  • .stream().map与.stream().flatMap的使用
  • :not(:first-child)和:not(:last-child)的用法
  • @Autowired自动装配
  • @FeignClient注解,fallback和fallbackFactory
  • @RequestMapping 的作用是什么?
  • [17]JAVAEE-HTTP协议
  • [20150321]索引空块的问题.txt
  • [Android]一个简单使用Handler做Timer的例子
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成