非Spring管理Bean如何添加AOP呢?

 前几天有个朋友问了一个问题,觉得可以给大家分享一下。

创新互联建站10多年企业网站建设服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,企业网站建设及推广,对食品包装袋等多个领域拥有丰富设计经验的网站建设公司。

问题如下图

归其根本这是个历史项目,里面有很多的类并没有交给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

 
 
 
 
  1. import org.aspectj.lang.annotation.Aspect; 
  2.  
  3. import org.aspectj.lang.annotation.Before; 
  4.  
  5. import org.aspectj.lang.annotation.Pointcut; 
  6.  
  7. @Aspect 
  8.  
  9. public class Aop { 
  10.  
  11.  
  12.  
  13. @Pointcut("execution(* com.ganhuojun.gracefulshutdown.controller..*.*(..))") 
  14.  
  15. public void pointcut1(){ 
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22. @Before("pointcut1()") 
  23.  
  24. public void before(){ 
  25.  
  26. System.out.println("controller before"); 
  27.  
  28.  

定义注解

注意:该注解不要交给spring管理

 
 
 
 
  1.  
  2.  
  3. org.codehaus.mojo 
  4.  
  5. aspectj-maven-plugin 
  6.  
  7. 1.11 
  8.  
  9.  
  10.  
  11. 1.8 
  12.  
  13. 1.8 
  14.  
  15.  
  16.  
  17.  
  18.  
  19. UTF-8 
  20.  
  21.  
  22.  
  23.  
  24.  
  25. src/main/java 
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. **/ServiceAop.java 
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. compile 
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  

配置maven插件

 
 
 
 
  1.  
  2.  
  3. org.codehaus.mojo 
  4.  
  5. aspectj-maven-plugin 
  6.  
  7. 1.11 
  8.  
  9.  
  10.  
  11. 1.8 
  12.  
  13. 1.8 
  14.  
  15.  
  16.  
  17.  
  18.  
  19. UTF-8 
  20.  
  21.  
  22.  
  23.  
  24.  
  25. src/main/java 
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. **/ServiceAop.java 
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. compile 
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  

排除spring的aop

如果对spring aop比较熟悉的都知道,spring的aop也是基于AspectJ的,因此需要exclude的,已经配置到mavn的地方了。

编译&运行&测试

编译后class文件已经被织入了相关代码,如下图

运行相关日志输出如下

 说明功能已经实现。

本文标题:非Spring管理Bean如何添加AOP呢?
转载源于:http://www.gawzjz.com/qtweb2/news6/756.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联