Spring AOP 사용자 정의 주해 구현 예시
1.주 해 는 다음 과 같다.
package cn.bridgeli.demo.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author bridgeli
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
/**
*
*
* @return
*/
String desc() default "";
}
2.칼국수
package cn.bridgeli.demo.annotation;
import cn.bridgeli.utils.AuthorizeUtil;
import cn.bridgeli.entity.Principal;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author bridgeli
* 1.
*/
@Aspect
@Component
@Slf4j
public class MyLogAspect {
/**
* 2. PointCut ,@annotation ,
* ,
* logPointCut()
*/
@Pointcut("@annotation(cn.bridgeli.demo.annotation.MyLog)")
public void logPointCut() {
}
/**
* 3.
*
* @param joinPoint
* @param myLog
* @return
*/
@Around(value = "logPointCut() && @annotation(myLog)", argNames = "joinPoint,myLog")
public Object logAround(ProceedingJoinPoint joinPoint, MyLog myLog) {
//
String methodFullPathName = joinPoint.getTarget().getClass().getName() + "#" + joinPoint.getSignature().getName();
//
String params = StringUtils.join(joinPoint.getArgs(), ";");
Principal currentUser = AuthorizeUtil.getCurrentUser();
log.info(" :" + (null == currentUser ? "" : currentUser.toString()) + ", [ " + methodFullPathName + " ] , :" + myLog.desc() + ", :" + params);
//
long startTime = System.currentTimeMillis();
Object result = null;
try {
result = joinPoint.proceed();
} catch (Throwable e) {
log.error(" , :" + params, e);
}
long elapsed = System.currentTimeMillis() - startTime;
log.info("[ " + methodFullPathName + " ] , :" + (null == result ? "" : result.toString()) + ", :" + elapsed);
return result;
}
}
그리고 사용 하고 싶 은 곳 에서@MyLog 만 사용 하면 됩 니 다.물론@MyLog(desc="이것 은 방법 설명 입 니 다")를 추가 할 수도 있 습 니 다.이렇게 걸 려 있 는 로 그 는 무엇 을 하 는 방법 이 있 을 수 있 습 니 다.다른 사람 이 로 그 를 볼 때 한눈 에 알 수 있 습 니 다.설명 이 필요 한 것 은 제 가 이 절단면 을 쓸 때 겪 는 작은 문제 입 니 다.인터넷 에서 AOP 의 주 해 를 보면 많은 사람들 이 예 를 들 었 을 때@Around 의 반환 값 에 관심 이 없 기 때문에 방법의 반환 값 은 모두 void 입 니 다.제 가 AOP 에 대해 잘 모 르 기 때문에 똑 같이 void 를 썼 습 니 다.결 과 는 테스트 를 잘 썼 고 차단 도 정상 입 니 다.로그 도 인쇄 되 었 습 니 다.차단 되 는 방법 도 정상적으로 실행 되 었 습 니 다.하지만 반환 값 이 없 었 습 니 다.그 때 는 이상 하 게 도 다음 반환 값 을 Object 로 바 꾸 었 습 니 다.맞 았 습 니 다.그래서 이것 은 작은 구덩이 이자 많은 사람들 이 설명 하지 않 은 점 입 니 다.여러분 들 은 주의 하 셔 도 됩 니 다.사실 이 문제 도 쉽게 생각 할 수 있 습 니 다.@Around 는 서 라운드 차단 입 니 다.차단 되 는 방법 을 실행 한 후에 도 계속 절단면 방법 을 실행 할 것 입 니 다.절단면 방법 이 반환 값 이 없 으 면 자 연 스 럽 게 반환 값 이 없습니다.같은 이치@After 차단 개인 추측 에 도 똑 같은 문제 가 있 을 것 입 니 다.테스트 해 보 세 요.
이상 은 Spring AOP 가 사용자 정의 주 해 를 실현 하 는 예제 의 상세 한 내용 입 니 다.Spring AOP 가 사용자 정의 주 해 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.