Springboot配置AOP的注解切点失效解决方案

 更新时间:2026年06月04日 11:01:02   作者:sheclockes  
本文探讨了在Spring框架中使用AOP拦截静态方法调用的实现细节,重点在于ApplicationContext和ApplicationContextAware接口的使用差异,通过对比两种获取Bean的方式,最终解决了切点无法被拦截的问题

问题描述

在静态方法中调用本类的另一个静态方法,需要在AOP中拦截该方法实现一部分业务逻辑,在aop类中添加了@Aspect@Component@EnableAspectJAutoProxy三个注解,切点通知方式为@Around,但是切点一直无法被拦截。

问题发现

当前类的实例是通过applicaitoncontext.getBean(类名.class)获取的,所以一直无法在切点无法被拦截(代码中的第一种方式)。

修改为实现了ApplicationContextAware接口的getBean(类名.class)(代码中的第二种方式),就可以正常被拦截了。

applicaitoncontext和ApplicationContextAware的getBaen()方法的异同点查询文档可知:

当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。

换句话说:

就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。

@Component
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static <T> T getBean(Class<T> tClass){
return applicationContext.getBean(tClass);
    }
public static <T> T getBean(String name , Class<T> tClass){
return applicationContext.getBean(name,tClass);
    }
@Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtils.applicationContext = applicationContext;
    }
}
@Component
public class SendSmm {
private static SendSmm sendSmm=null;
public static void test1(){
if(null == sendSmm){
sendSmm = Const.applicationContext.getBean(SendSmm.class);//第一种
            sendSmm = ApplicationContextUtils.getBean(SendSmm.class);//第二种
        }
sendSmm.test2();
    }
public void test2(){
    }
}
public class Const {
public static ApplicationContext applicationContext = null ;
}
@Aspect
@Component
@EnableAspectJAutoProxy
public class TestAopUtils {
@Pointcut("execution( public * com.example.demo.service.*(..))")
public void testAop(){}
@Around("testAop()")
public Object Around (ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object object = null;
Object[] args = proceedingJoinPoint.getArgs();//获取切点的请求参数
        String st = (String) args[0];//第一个参数
        proceedingJoinPoint.proceed();//调用原方法
        return object ;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用jar命令配置服务器端口的完整指南

    Java使用jar命令配置服务器端口的完整指南

    本文将详细介绍如何使用java -jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助
    2025-08-08
  • Spring myBatis数据库连接异常问题及解决

    Spring myBatis数据库连接异常问题及解决

    这篇文章主要介绍了Spring myBatis数据库连接异常问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • dubbo服务链路跟踪方式

    dubbo服务链路跟踪方式

    这篇文章主要介绍了dubbo服务链路跟踪方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 如何解决Maven无法拉取SNAPSHOT依赖问题

    如何解决Maven无法拉取SNAPSHOT依赖问题

    在使用Maven管理项目时,可能会遇到无法拉取SNAPSHOT版本依赖的问题,这通常是因为Maven默认不支持直接拉取SNAPSHOT版本,遇到这样的问题,可以通过在项目的pom.xml文件中添加<repositories>标签,并配置启用SNAPSHOT的仓库地址来解决
    2024-10-10
  • 有关ThreadLocal的面试题你真的懂了吗

    有关ThreadLocal的面试题你真的懂了吗

    这篇文章主要介绍了面试题ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • spring事务@Transactional失效原因及解决办法小结

    spring事务@Transactional失效原因及解决办法小结

    今天就跟大家聊聊有关spring中@Transactional失效原因及解决办法小结,主要从三个方面考虑,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Java中MapStruct转换实体的步骤实现

    Java中MapStruct转换实体的步骤实现

    本文主要介绍了Java中MapStruct转换实体的步骤实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • Spring整合Mycat2的具体过程详解

    Spring整合Mycat2的具体过程详解

    这篇文章主要给大家介绍Springboot整合Mycat2的具体过程,文中有详细的图解过程,感兴趣的小伙伴可以跟着小编一起来学习
    2023-05-05
  • Java动态代理(设计模式)代码详解

    Java动态代理(设计模式)代码详解

    这篇文章主要介绍了Java动态代理(设计模式)代码详解,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringBoot中间件ORM框架实现案例详解(Mybatis)

    SpringBoot中间件ORM框架实现案例详解(Mybatis)

    这篇文章主要介绍了SpringBoot中间件ORM框架实现案例详解(Mybatis),本篇文章提炼出mybatis最经典、最精简、最核心的代码设计,来实现一个mini-mybatis,从而熟悉并掌握ORM框架的涉及实现,需要的朋友可以参考下
    2023-07-07

最新评论