Die benutzerdefinierte Annotation in Springboot befindet sich in der Servicemethode und aop ist ungültig.

Problembeschreibung

Ich habe eine benutzerdefinierte Annotation geschrieben, aber die Annotation wird nur in Methoden in der Serviceschicht angezeigt. Beim Start wurde festgestellt, dass AOP nicht abgefangen wurde

Problemursachen:

Beim Aufrufen der xx()-Methode im Dienst hilft uns der dynamische Proxy von Spring dabei, dynamisch ein Proxy-Objekt zu generieren. Nennen wir es vorerst $XxxxService. Der Aufruf der xx()-Methode wird also tatsächlich vom Proxy-Objekt $XxxxService aufgerufen. Wenn jedoch eine andere Annotationsmethode-Untermethode derselben Klasse innerhalb der xx()-Methode aufgerufen wird, wird diese tatsächlich über this.submethod() ausgeführt. Dies bezieht sich auf das XxxxService-Objekt, nicht auf das $XxxxService-Proxy-Objekt. Es gibt kein Durchgehen Agent. Die Anmerkung ist also ungültig

lösen:

Rufen Sie das Proxy-Objekt ab, indem Sie ApplicationContext implementieren. Erstellen Sie eine neue Toolklasse SpringUtil zum Abrufen von Proxy-Objekten

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);
    }
}

überweisen:

@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){
       //.....具体业务
    }

}

Supongo que te gusta

Origin blog.csdn.net/weixin_40841731/article/details/131233049
Recomendado
Clasificación