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

问题描述

写了个自定义注解,但是该注解只会出现在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){
       //.....具体业务
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_40841731/article/details/131233049