java注解监听器_SpringBoot基于注解切面监听事件

创建监听器三步骤:

1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。

2、监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。

3、事件发布者(publisher)事件发生的触发者。

代码展示:

pom.xml

org.springframework

spring-aspects

cn.hutool

hutool-all

4.6.8

第一步:

定义一个事件,需要继承spring的ApplicationEvent

package top.xzhand.event;

import org.springframework.context.ApplicationEvent;

/**

* 定义一个事件,需要继承spring的ApplicationEvent

*/

public class LogEvent extends ApplicationEvent {

public LogEvent(Object source) {

super(source);

}

}

第二步:

定义切面,发布事件

@Component

@Aspect

这两个注解必须添加

package top.xzhand.event.aspect;

import com.alibaba.fastjson.JSON;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.core.env.Environment;

import org.springframework.stereotype.Component;

import top.xzhand.event.LogEvent;

import top.xzhand.po.RequestLog;

import org.aspectj.lang.JoinPoint;

import top.xzhand.util.LogUtil;

import java.util.Date;

/**

* 切面发布

*/

@Component

@Aspect

public class LogAspect {

public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>();

@Autowired

private ApplicationContext applicationContext;

@Pointcut("@annotation(top.xzhand.event.common.Log)")

public void logAspect() {

}

@Before(value = "logAspect()")

public void before(JoinPoint point) throws Throwable {

RequestLog requestLog = new RequestLog();

requestLog.setCreateAt(new Date());//开始时间

Environment environment = applicationContext.getEnvironment();

String appName = environment.getProperty("spring.application.name");

//sysLog.setCreateName(createName);

THREAD_LOCAL.set(LogUtil.getSysLog(point,requestLog));

System.out.println("进入切面:"+JSON.toJSONString(requestLog));

}

@AfterReturning(returning = "rvt", pointcut = "logAspect()")

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,您可以使用AOP(面向切面编程)在调用方法时添加监听器。您可以使用`@Around`注解来定义一个环绕通知,然后在通知中添加监听器逻辑。例如,您可以在方法调用时添加一个计时器: ```java @Aspect @Component public class PerformanceMonitor { @Around("execution(* com.example.myapp.service.*.*(..))") public Object monitor(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); long elapsedTime = endTime - startTime; // 处理监听事件 return result; } } ``` 在上面的示例中,我们定义了一个名为`PerformanceMonitor`的切面,并使用`@Around`注解在`com.example.myapp.service`包中的所有方法上添加监听器。在`monitor()`方法中,我们首先记录方法调用开始的时间,然后调用`joinPoint.proceed()`执行原始方法,最后记录方法调用结束的时间,并计算方法调用的时间。在计算出方法调用的时间后,您可以将其传递给处理监听事件的方法。 关于效率方面,AOP是一种强大的技术,但它的性能会受到一些影响。在使用AOP时,需要考虑以下因素: 1. AOP的性能与拦截的方法数量、拦截器的数量和拦截器的逻辑复杂度有关。 2. AOP会增加应用程序的复杂性和开销。 3. 在使用AOP时,需要小心不要影响应用程序的性能和可维护性。 因此,在使用AOP时,需要仔细考虑其性能和可维护性,并避免过度使用AOP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值