문제 설명
맞춤 주석을 작성했는데 해당 주석은 서비스 계층의 메서드에만 표시됩니다. 스타트업은 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){
//.....具体业务
}
}