Spring AOP 로 인해@Autowired 의존 주입 실패 해결 방법
2288 단어 springaop@autowired의존 주입 실패
이전에 springAOP 로 조작 로그 기록 을 만 들 었 는데 이번 에는 다른 종류 에 사용 할 때 service 가 계속 주입 에 실 패 했 고 인터넷 에서 많은 내용 을 찾 았 는데 모두 비슷 한 상황 이 발생 했 지만 자신의 상황 과 맞지 않 는 다 는 것 을 알 게 되 었 다.나중에 자신의 상황 을 정리 한 결과 방법 은 private 로 수식 한 것 으로 AOP 가 적당 할 때 service 주입 에 실 패 를 초래 할 수 있 고 같은 service 는 다른 Public 방법 에서 이런 상황 이 없 으 며 매우 기괴 하 다.
해결 과정:
찾 아 본 자 료 를 결합 하여 분석 했다.org.springframework.aop.support.aopUtils 에서:
public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) {
if (!pc.getClassFilter().matches(targetClass)) {
return false;
}
MethodMatcher methodMatcher = pc.getMethodMatcher();
IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null;
if (methodMatcher instanceof IntroductionAwareMethodMatcher) {
introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher;
}
Set classes = new HashSet(ClassUtils.getAllInterfacesForClassAsSet(targetClass));
classes.add(targetClass);
for (Iterator it = classes.iterator(); it.hasNext();) {
Class clazz = (Class) it.next();
Method[] methods = clazz.getMethods();
for (int j = 0; j < methods.length; j++) {
if ((introductionAwareMethodMatcher != null &&
introductionAwareMethodMatcher.matches(methods[j], targetClass, hasIntroductions)) ||
methodMatcher.matches(methods[j], targetClass)) {
return true;
}
}
}
return false;
}
이곳Method[] methods = clazz.getMethods();
은 Public 방법 만 받 을 수 있 습 니 다.execution(* *(..))
public/protected 와 일치 할 수 있 습 니 다.Public 가 일치 하 는 것 이 있 기 때문에 목표 류 는 대 리 됩 니 다.그리고 접점 매 칭 을 할 때 도 일치 할 수 있 습 니 다.또한 cglib 방식 은 가방 등급/protected 방법 을 얻 을 수 있 고 가방 등급/protected 방법 은 직접 반사 로 호출 할 수 있 습 니 다. private 수정자 의 접점 은
Method[] methods = clazz.getMethods();
여기 있 는 어떤 것 도 일치 하지 않 기 때문에 대리 할 수 없습니다.그래서 private 방법 이 대리 되 지 않 아@Autowired 가 주입 되 지 않 을 수 있 습 니 다.수정 방법:
1.방법 장식 부 호 를 Public 로 변경 합 니 다.
2.AspectJ 를 사용 하여 주입 한다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spring AOP 를 이용 하여 사용자 작업 로 그 를 기록 하 는 방법 예시절단면 종류: 설정 클래스: 서비스 종류: 테스트 방법: springAOP 절단면 에 서 는 프 록 시 를 사용 하기 때문에 프 록 시 대상 을 직접 얻 고 실제 대상 의 정 보 를 얻 을 수 없습니다.예 를 들 어...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.