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