IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot基于AOP +自定义注解实现打印方法耗时 -> 正文阅读

[Java知识库]SpringBoot基于AOP +自定义注解实现打印方法耗时

一、定义注解类TimeLog

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeLog {
    String value() default "";
}

二、定义切面AOP类

@Slf4j
@Aspect
@Component
public class TimeLogAspect {
    private static final ThreadLocal<Long> firstThreadLocal = new ThreadLocal<>();
    private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    // 解决方法调用见清除 threadLocal 空指针
    private static final ThreadLocal<Integer> countThreadLocal = new ThreadLocal<>();

    @Pointcut("execution(* *(..)) && @annotation(timeLog )")
    public void pointcut(TimeLog timeLog ) {
    }
    
	@Around(value = "pointcut(timeLog)", argNames="joinPoint, timeLog")
    public Object doAround(ProceedingJoinPoint point, TimeLog timeLog) throws Throwable {
  		Long startTime = System.currentTimeMillis();
		Object result = point.proceed();
		
        // 获取方法的参数值
        Method method = this.getMethod(point);
        String methodName = method.toString();
        Object[] args = point.getArgs();
        EvaluationContext context = this.bindParam(method, args);
        // 根据spel表达式获取值
        Expression expression = parser.parseExpression(timeLog.value());
        Object methodDesc= expression.getValue(context);
        
        // 打印
        Long endTime = System.currentTimeMillis();
        Long costTime = endTime - startTime;
        log.info("methodName: {}, methodDesc: {}, costTime {}ms",methodName,methodDesc,costTime);
        return result;
    }

    /**
     * 获取当前执行的方法
     *
     * @param pjp
     * @return
     * @throws NoSuchMethodException
     */
    private Method getMethod(ProceedingJoinPoint point) throws NoSuchMethodException {
        MethodSignature methodSignature = (MethodSignature) point.getSignature();
        Method method = methodSignature.getMethod();
        Method targetMethod = point.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes());
        return targetMethod;
    }

    /**
     * 将方法的参数名和参数值绑定
     *
     * @param method 方法,根据方法获取参数名
     * @param args   方法的参数值
     * @return
     */
    private EvaluationContext bindParam(Method method, Object[] args) {
        //获取方法的参数名
        String[] params = discoverer.getParameterNames(method);

        //将参数名与参数值对应起来
        EvaluationContext context = new StandardEvaluationContext();
        for (int len = 0; len < params.length; len++) {
            context.setVariable(params[len], args[len]);
        }
        return context;
    }
}

三、Aspectj LoadTimeWeaving

1、创建aop.xml配置,放到/src/main/resources/META-INF目录下

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "https://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-XnoInline -Xset:weaveJavaxPackages=true -Xlint:ignore -verbose -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
        <!-- 只对指定包下的类进行编织 -->
        <include within="test..*"/>
    </weaver>
    <aspects>
        <!-- 使用指定的切面类进行编织 -->
        <aspect name="xxx.TimeLogAspect"/>
    </aspects>
</aspectj>

2、在程序启动时开启agent

@Slf4j
public class MyAspectjAgentInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
	@Override
	public void initialize(ConfigurableApplicationContext context) {
				//关键代码,用于在程序中开启agent
		//通过bytebuddy拿到当前jvm的Instrumentation实例
		Instrumentation instrumentation = ByteBuddyAgent.install();
		//激活Aspectj的代理对象
		Agent.agentmain("", instrumentation);
		//激活spring代理对象
		InstrumentationSavingAgent.agentmain("", instrumentation);
	}
}

3、创建spring.factories,放到/src/main/resources/META-INF目录下

org.springframework.context.context.ApplicationContextInitializer=\
xxx.MyAspectjAgentInitializer 

Maven关键依赖

<dependency>
	<groupId>net.bytebuddy</groupId>
	<artifactId>byte-buddy-agent</artifactId>
	<version>1.10.9</version>
</dependency>
<dependency>
	<groupId>net.bytebuddy</groupId>
	<artifactId>byte-buddy</artifactId>
	<version>1.10.9</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aspects</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-instrument</artifactId>
	<version>5.2.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>5.2.5</version>
</dependency>

参考


  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:42:44  更:2022-09-24 20:44:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:03:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码