最近一段时间做项目总是用到AOP,在此做个简单的Spring Aop 日志记录Demo
简单的回顾一下Aop,他的代理方式有两种:
第一种:.静态代理(也就是编译时进行代理,如AspectJ)。
第二种:动态代理(动态又分为两种代理方式1.JDK动态代理 2.CGLIB动态代理,至于区别就不多说了)。
想要实现多个方法用同一个切面增强,怎么区别方法的模块名字和描述呢?当然方式很多,我这里用自定义
注解来实现:
第一步编写自定义注解:
---------自定义注解参数解释:
- /**
- * 表示对标记有xxx注解的类,做代理 注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
- * Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
- * 这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配
- * RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
- * 用@Retention(RetentionPolicy
- * .CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
- * 用@Retention(RetentionPolicy.SOURCE
- * )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
- * 用@Retention(RetentionPolicy.RUNTIME
- * )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
- * 所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME
- * 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.
- *
- * 类和方法的annotation缺省情况下是不出现在javadoc中的,为了加入这个性质我们用@Documented
- * java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
- * @interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字
- @Target({ElementType. METHOD})
- @Retention(RetentionPolicy.RUNTIME )
- @Documented
- public @interface MethodRecordLog {
- String moduleName(); //模块名称
- String logType(); //日志类别
- String desc() default "描述信息" ;// 模块描述
- }
第二步编写日志记录类(也就是增强类)
- @Aspect
- @Component
- public class LogAspect {
- @Autowired
- private LogService LogService;
- //此注解是后置增强,方法执行成功后会执行
- @AfterReturning("within(com.xxx.*.web..*) && @annotation(mrl)")
- public void insertLogSuccess(final ProceedingJoinPoint pjp, final MethodRecordLog mrl){
- String moduleName = mrl.moduleName() ;
- String methodName = jp.getSignature().getName(); //获取目标方法名
- XXLog xxLog = new XXLog();
- xxLog.setXX(XX);//这里设置属性就不多写了
- LogService.saveLog(xxLog);//调用方法持久DB
- }
- //该方法体为异常通知,当目标方法出现异常时,执行该方法体
- @AfterThrowing(pointcut= "within(com.xxx.*.web..*) && @annotation(mrl)", throwing="ex")
- public void insertLog(final ProceedingJoinPoint pjp, final MethodRecordLog mrl, CRUDException ex){
- String moduleName = mrl.moduleName() ;
- String methodName = jp.getSignature().getName(); //获取目标方法名
- XXLog xxLog = new XXLog();
- xxLog.setXX(XX);//这里设置属性就不多写了
- LogService.saveLog(xxLog);//调用方法持久DB
- }
- //ProceedingJoinPoint继承自JoinPoint,在 JoinPoint的基础上添加了反射、具体参照javadoc
注:@AfterReturning为注解方法体成功执行后,执行的方法。@AfterThrowing为注解方法体抛出CRUDException 异常时执行的方法。ProceedingJoinPoint pjp参数可以获得注解方法体的相关值,包括类名、方法名、参数等信息。MethodRecordLog mrl参数为自定义注解的类,可以获得自定义注解的值
第三步在spring 的配置文件里面启动注解:
- <!-- 启用@AspectJ支持 -->
- <aop:aspectj-autoproxy />
第四步是controller层面自定义注解的用法:
- @JpfLog(moduleName="用户",logType="",desc= "添加用户")
- @RequestMapping(value = "/saveByUser")
- public String saveByUser(User user) throws CRUDException {
- int result = userService.saveUser(user);
- return "";
- }
相关推荐
在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
在IT行业中,Spring框架是Java开发中的一个基石,尤其在企业级应用开发中扮演着重要角色。Spring AOP(Aspect ...通过运行这些测试,我们可以看到AOP日志功能的实际效果,并学习如何在自己的项目中应用这些概念。
- **日志记录**:在方法调用前后记录操作信息。 - **事务管理**:自动进行事务的开启、提交、回滚等操作。 - **权限控制**:在访问敏感资源前进行权限检查。 - **性能监控**:记录方法执行时间,分析系统性能瓶颈。 ...
spring aop实现接口参数变更前后对比和日志记录完整代码,拿到项目代码,只需要做数据库连接的修改即可运行起来使用,代码案例详细,真是可靠,代码原文地址:...
3. `Main`类:启动应用,调用`Service`类的方法以触发AOP日志记录。 4. `pom.xml`:Maven配置文件,引入了Spring AOP和日志框架的依赖。 5. `application.properties`或`application.yml`:配置文件,可能包含日志...
总结来说,Spring AOP提供了一种简洁且灵活的方式来实现日志功能,使得开发者可以专注于业务逻辑,而不是重复的日志记录代码。通过定义切面和通知,我们可以将日志操作与业务代码解耦,提升代码的可复用性和可扩展性...
以下是一个简单的例子,展示如何使用Spring AOP实现日志记录: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore...
在这里,我们重点关注如何利用Spring AOP实现分层日志记录。 **一、Spring AOP基本概念** 1. **切面(Aspect)**: 切面是封装了横切关注点的模块,例如日志记录就是一个横切关注点,它横跨多个对象和类。 2. **通知...
1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录、事务管理、性能监控等。在Spring AOP中,切面由通知(Advice)和切点(Pointcut)定义。 2. **通知(Advice)**:通知是在特定连接点(Join Point)...
通过这个项目,我们可以学习到如何在Spring AOP中实现日志记录,这不仅可以帮助我们调试和监控应用程序,还可以为未来的维护提供宝贵的线索。同时,这也是理解和实践面向切面编程的一个很好的起点。
为了在不改变原代码的情况下增加日志记录功能,我们创建了一个名为HelloProxy的代理类,该代理类也实现了IHello接口。代理类中的sayHello()方法会在调用原Hello类的sayHello()方法之前和之后分别调用Logger类进行...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件...通过理解advice、pointcut和advisor这三个核心概念,开发者可以更有效地利用Spring AOP实现日志记录、事务管理等各种功能,提高代码的可维护性和可扩展性。
AOP允许我们在不修改原有业务逻辑的情况下,插入日志记录代码,使得日志功能的实现更加灵活和高效。 首先,让我们理解Flex和Spring这两个技术。Flex是一种基于Adobe Flash Player或Adobe AIR的开放源代码框架,用于...
在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...
另一方面,Spring AOP(面向切面编程)则是Spring框架的一个核心特性,用于实现跨切面的关注点,如日志记录。本篇文章将深入探讨如何将Swagger与Spring AOP结合起来,以实现优雅的日志记录功能。 首先,让我们了解...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...