文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

非Spring管理Bean怎么添加AOP

2024-04-02 19:55

关注

这篇文章主要为大家展示了“非Spring管理Bean怎么添加AOP”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“非Spring管理Bean怎么添加AOP”这篇文章吧。

问题如下图

非Spring管理Bean怎么添加AOP

归其根本这是个历史项目,里面有很多的类并没有交给spring管理,但现在需要统一添加日志。

面对这样的问题,其实只要了解AOP的原理,就会有多种方法。AOP都是基于动态代理来实现,而动态代理常见的就是cglib和java动态代理,不了解的可以看下之前干货君写的文章

但此两种方法似乎在这样的场景不好实现,需要修改大量的代码,那么有没有什么好的方案呢?

答案当然是有。

首先要清楚的是AOP的底层实现原理就是字节码,我们只需要从字节码层面,就一定可以解决这样的问题。因此可以利用编译期增强和运行期增强,常见的方案有两种,一种Java  Agent技术,另一种 AspectJ方案。

Java Agent

Java Agent中文名字叫做java  探针,可以在运行java时指定探针程序,对原程序无侵入,常见的一些APM工具都会这样,如skywalking,后续有机会给大家介绍下。如下图

非Spring管理Bean怎么添加AOP

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管理

<plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>aspectj-maven-plugin</artifactId>  <version>1.11</version>  <configuration>  <complianceLevel>1.8</complianceLevel>  <source>1.8</source>  <!--<showWeaveInfo>true</showWeaveInfo>-->  <!--<Xlint>ignore</Xlint>-->  <encoding>UTF-8</encoding>  <sources>  <source>  <basedir>src/main/java</basedir>  <!--此处使用include一致会导致织入失败,暂时未找到好的解决办法,不写则引用所有的Aspect-->  <!--<includes>-->  <!--<include>**/Aop.java</include>-->  <!--<include>**/ControllerAop.aj</include>-->  <!--</includes>-->  <excludes>  <exclude>**/ServiceAop.java</exclude>  </excludes>  </source>  </sources>  </configuration>  <executions>  <execution>  <goals>  <goal>compile</goal>  </goals>  </execution>  </executions>  </plugin>

 配置maven插件

<plugin>  <groupId>org.codehaus.mojo</groupId>  <artifactId>aspectj-maven-plugin</artifactId>  <version>1.11</version>  <configuration>  <complianceLevel>1.8</complianceLevel>  <source>1.8</source>  <!--<showWeaveInfo>true</showWeaveInfo>-->  <!--<Xlint>ignore</Xlint>-->  <encoding>UTF-8</encoding>  <sources>  <source>  <basedir>src/main/java</basedir>  <!--此处使用include一致会导致织入失败,暂时未找到好的解决办法,不写则引用所有的Aspect-->  <!--<includes>-->  <!--<include>**/Aop.java</include>-->  <!--<include>**/ControllerAop.aj</include>-->  <!--</includes>-->  <excludes>  <exclude>**/ServiceAop.java</exclude>  </excludes>  </source>  </sources>  </configuration>  <executions>  <execution>  <goals>  <goal>compile</goal>  </goals>  </execution>  </executions>  </plugin>

 排除spring的aop

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

编译&运行&测试

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

非Spring管理Bean怎么添加AOP

运行相关日志输出如下

非Spring管理Bean怎么添加AOP

说明功能已经实现。

以上是“非Spring管理Bean怎么添加AOP”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯