这篇文章主要为大家展示了“非Spring管理Bean怎么添加AOP”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“非Spring管理Bean怎么添加AOP”这篇文章吧。
在万荣等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都网站制作 网站设计制作按需网站制作,公司网站建设,企业网站建设,成都品牌网站建设,网络营销推广,成都外贸网站建设,万荣网站建设费用合理。
问题如下图
归其根本这是个历史项目,里面有很多的类并没有交给spring管理,但现在需要统一添加日志。
面对这样的问题,其实只要了解AOP的原理,就会有多种方法。AOP都是基于动态代理来实现,而动态代理常见的就是cglib和java动态代理,不了解的可以看下之前干货君写的文章
java动态代理为什么需要基于接口
cglib动态代理对类没有任何限制吗?
但此两种方法似乎在这样的场景不好实现,需要修改大量的代码,那么有没有什么好的方案呢?
答案当然是有。
首先要清楚的是AOP的底层实现原理就是字节码,我们只需要从字节码层面,就一定可以解决这样的问题。因此可以利用编译期增强和运行期增强,常见的方案有两种,一种Java Agent技术,另一种 AspectJ方案。
Java Agent
Java 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
引入依赖
编译增强,依赖此jar
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class Aop { @Pointcut("execution(* com.ganhuojun.gracefulshutdown.controller..*.*(..))") public void pointcut1(){ } @Before("pointcut1()") public void before(){ System.out.println("controller before"); } }
定义注解
注意:该注解不要交给spring管理
org.codehaus.mojo aspectj-maven-plugin 1.11 1.8 UTF-8 compile
配置maven插件
org.codehaus.mojo aspectj-maven-plugin 1.11 1.8 UTF-8 compile
排除spring的aop
如果对spring aop比较熟悉的都知道,spring的aop也是基于AspectJ的,因此需要exclude的,已经配置到mavn的地方了。
编译&运行&测试
编译后class文件已经被织入了相关代码,如下图
运行相关日志输出如下
说明功能已经实现。
以上是“非Spring管理Bean怎么添加AOP”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!