首页 > 其他分享 >springboot中自定义注解在service方法中,aop失效

springboot中自定义注解在service方法中,aop失效

时间:2023-06-17 22:35:53浏览次数:57  
标签:applicationContext springboot service ApplicationContext getBean name static pub


问题描述

写了个自定义注解,但是该注解只会出现在serviece层中的方法中。启动发现aop未拦截到

问题原因:

调用service中的xx()方法时,Spring的动态代理帮我们动态生成了一个代理的对象,暂且叫他$XxxxService。所以调用xx()方法实际上是代理对象$XxxxService调用的。但是在xx()方法内调用同一个类的另外一个注解方法子方法时,实际上是通过this.子方法()执行的, this 指的是XxxxService对象,并不是$XxxxService代理对象调用的,没有走代理。所以注解失效

解决:

通过实现ApplicationContext获取代理对象。新建获取代理对象的工具类SpringUtil

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
    {
        if (SpringUtil.applicationContext == null)
        {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext()
    {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name)
    {
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz)
    {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz)
    {
        return getApplicationContext().getBean(name, clazz);
    }
}

调用:

@Service
public class XxxxServiceImpl implements IXxxService {
    @Override
    public void 方法1() {
        List<XxxData> xxxDataList = xxMapper.selectList();
        for(int i = 0; i< xxxDataList.size();i++){
              SpringUtil.getBean(this.getClass()).方法2(xxxDataList.get(i));
        }
    }

    @自定义注解
    public void 方法2(XxxData xxxData){
       //.....具体业务
    }

}

标签:applicationContext,springboot,service,ApplicationContext,getBean,name,static,pub
From: https://blog.51cto.com/u_13002884/6506398

相关文章

  • springboot注册过滤器
    springboot注册过滤器需要使用过滤器的话,优先选择拦截器。因为拦截器符合aop思想。在springboot中使用过滤器有三种方式。分别如下方式一:传统web在传统javaweb、ssm中使用过滤器差不多类似,这里以java配置为例,实现Filter接口@WebFilter("/*")publicclassMyFilter01i......
  • SpringBoot整合ActiveMQ
    第一步: 第二步: 第三步: 下面如有需要才使用 ......
  • Springboot整合mongodb
    入门案例创建工程,导入依赖导入依赖点击查看代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.3.9.RELEASE</version>......
  • SpringBoot--MQ不生效
    Cannotresolveconfigurationproperty'rabbitmq.username'rabbitmq:username:adminpassword:adminvirtual-host:test_datalistener:simple:#表示消费者消费成功消息以后需要手工的进行签收(ack确认),默认为autoacknowledge-mode:manualprefet......
  • springboot @Bean自动注册
    这个注解,可以注册Bean到spring容器中@BeanpublicXXXBeanxxxBean(){returnnewXXXBean();}这个注解也可以用在void方法上,用在在spring容器启动后固定执行某个代码逻辑:@BeanpublicvoidxxxHandler(){System.out.println("我想容器启动后执行一次某个代......
  • ServiceAccount 访问API实验
    概念SA账号是Pod内的进程使用的关联服务账号的身份,向集群的API服务器进行身份认证。SA(服务账号)是针对运行在Pod中的应用进程而言的,在Kubernetes中这些进程运行在容器中,而容器是Pod的一部分配置SAapiVersion:v1kind:ServiceAccountmetadata:name:sa-testnames......
  • chrome浏览器Bing主页自定义
    前言在使用Bing主页的时候,无法将主页的新闻彻底隐藏,也无法更换背景图片(如下图)。这就很难受了,我只想要一个只有搜索框加背景图片的一个主页。在集百家之所长后,得到一个符合个人要求的主页。主要文件manifest.json1{2"chrome_url_overrides":{3"newtab":......
  • SpringBoot学习笔记
    新建SpringBoot项目阿里云地址:https://start.aliyun.com异常消息处理//1.自定义异常类,继承RuntimeExceptionpublicclassMyExceptionextendsRuntimeException{publicMyException(){}}//2.定义全局异常类@RestControllerAdvicepublicclassGloabExcept......
  • Go 语言之自定义 zap 日志
    Go语言之自定义zap日志zap日志:https://github.com/uber-go/zap一、日志写入文件zap.NewProduction、zap.NewDevelopment是预设配置好的。zap.New可自定义配置zap.New源码这是构造Logger最灵活的方式,但也是最冗长的方式。对于典型的用例,高度固执己见的预设(NewProdu......
  • 【Azure 应用服务】Azure Function App在部署时候遇见 503 ServiceUnavailable
    问题描述在VSCode中编写好AzureFunctionApp代码后,通过 funcazurefunctionapppublish部署失败,抛出503ServiceUnavailable错误。Gettingsitepublishinginfo...Creatingarchiveforcurrentdirectory...Performingremotebuildforfunctionsproject.Deleting......