漯河网站seo,wordpress 图集插件,品牌网络营销推广方案策划,wordpress文本编辑器前几天有个朋友问了一个问题#xff0c;觉得可以给大家分享一下。问题如下图归其根本这是个历史项目#xff0c;里面有很多的类并没有交给spring管理#xff0c;但现在需要统一添加日志。面对这样的问题#xff0c;其实只要了解AOP的原理#xff0c;就会有多种方法。AOP都…前几天有个朋友问了一个问题觉得可以给大家分享一下。问题如下图归其根本这是个历史项目里面有很多的类并没有交给spring管理但现在需要统一添加日志。面对这样的问题其实只要了解AOP的原理就会有多种方法。AOP都是基于动态代理来实现而动态代理常见的就是cglib和java动态代理不了解的可以看下之前干货君写的文章java动态代理为什么需要基于接口cglib动态代理对类没有任何限制吗但此两种方法似乎在这样的场景不好实现需要修改大量的代码那么有没有什么好的方案呢答案当然是有。首先要清楚的是AOP的底层实现原理就是字节码我们只需要从字节码层面就一定可以解决这样的问题。因此可以利用编译期增强和运行期增强常见的方案有两种一种Java Agent技术另一种 AspectJ方案。Java AgentJava Agent中文名字叫做java 探针可以在运行java时指定探针程序对原程序无侵入常见的一些APM工具都会这样如skywalking后续有机会给大家介绍下。如下图java agent的主要原理就是利用JVMTI(JVM Tool Interface)JVM用来暴露一些供用户扩展的接口集合因此可以在此处做一些运行期字节码增强。Java Agent内容比较多有很多大家熟悉的工具都是基于它去做的例如阿里的arthas。本文就不介绍了后期会给大家详细介绍下Java Agent。AspectJ方案可以利用aspectj javac来编译织入代码也可以利用maven插件aspectj-maven-plugin下面利用AspectJ注解 aspectj-maven-plugin来实战一下。aspectj-maven-plugin官网 http://www.mojohaus.org/aspectj-maven-plugin/usage.html引入依赖编译增强依赖此jarimport org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;Aspectpublic class Aop { Pointcut(execution(* com.ganhuojun.gracefulshutdown.controller..*.*(..))) public void pointcut1(){ } Before(pointcut1()) public void before(){ System.out.println(controller before); }}定义注解注意该注解不要交给spring管理org.codehaus.mojoaspectj-maven-plugin1.111.81.8UTF-8src/main/java**/ServiceAop.javacompile配置maven插件org.codehaus.mojoaspectj-maven-plugin1.111.81.8UTF-8src/main/java**/ServiceAop.javacompile排除spring的aop如果对spring aop比较熟悉的都知道spring的aop也是基于AspectJ的因此需要exclude的已经配置到mavn的地方了。编译运行测试编译后class文件已经被织入了相关代码如下图运行相关日志输出如下说明功能已经实现。如果还有其他比较好的方法欢迎大家留言谢谢