springboot의 사용자 정의 주석이 서비스 메소드에 있으며 aop가 유효하지 않습니다.

문제 설명

맞춤 주석을 작성했는데 해당 주석은 서비스 계층의 메서드에만 표시됩니다. 스타트업은 AOP가 차단되지 않았음을 발견했습니다.

문제 원인:

서비스에서 xx() 메소드를 호출할 때 Spring의 동적 프록시는 프록시 객체를 동적으로 생성하는 데 도움이 됩니다. 당분간 이를 $XxxxService라고 부르겠습니다. 따라서 xx() 메서드 호출은 실제로 프록시 개체 $XxxxService에 의해 호출됩니다. 그러나 xx() 메소드 내에서 동일한 클래스의 다른 Annotation 메소드 하위 메소드를 호출할 경우 실제로는 this.submethod()를 통해 실행되는데 이는 $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