想法
- 在任何一个方法上加上注解,都要能打印出参、入参信息,而不局限于spring管理的类方法。
- 不要每次调用方法都要经过各种反射,而是编译时就把增强代码注入到方法第一行。这样性能更好。
- 可以自定义使用什么日志框架输出日志。
实验环境
- 开发工具:idea或eclipse
- 项目管理工具:maven3.3.9
- jdk版本:1.8.0_144
实现
创建maven项目
使用idea创建一个普通的maven项目hello。并创建两个子模块hello-core和hello-test。整体项目结构如下图:
父模块pom.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
hello-core模块pom.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
注意:编译插件一定要配置:
<compilerArgument>-proc:none</compilerArgument>
, 否则编译时报错:
1 | Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider com.kangyonggan.demo.hello.core.MethodLoggerProcessor not found |
注意:一定要依赖
tools.jar
,否则编译时报错:
1 | com.sun.tools.javac.processing does not exist |
编译时注解
MethodLogger.java
1 | package com.kangyonggan.demo.hello.core; |
注解处理器
MethodLoggerProcessor.java
1 | package com.kangyonggan.demo.hello.core; |
注册注解处理器
在resources/META-INF/services
目录下创建文件javax.annotation.processing.Processor
, 文件内容如下:
1 | com.kangyonggan.demo.hello.core.MethodLoggerProcessor |
hello-test模块pom.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
测试
MethodLoggerTest.java
1 | package com.kangyonggan.demo.hello.test; |
运行main方法输出如下:
1 | Hello world!!! |
反编译MethodLoggerTest.class
1 | // |
源代码
Hello World的源代码托管在github上:https://github.com/kangyonggan/method-logger-hello.git
最终实现的代码:https://github.com/kangyonggan/method-logger.git
此jar包已经发布到中央仓库,联网即可依赖。