Spring AOP 사용자 정의 주해 구현 예시

일 을 한 후에 일부 작은 프로젝트 설정 업 무 를 제외 하고 AOP 를 사용 한 적 이 있 습 니 다.진정 으로 스스로 AOP 를 쓸 기회 가 적 습 니 다.다른 한편,일 을 한 후에 사용자 정의 주 해 를 쓴 적 이 없습니다.주해 가 어떻게 그 가 원 하 는 기능 을 실현 하 는 지 궁금 해 했 습 니 다.마침 프로젝트 를 할 때 뜻 을 다 하지 못 하고 문제 가 자주 발생 했 습 니 다.로 그 를 찾 아 본 후에 야 주 해 를 잊 어 버 렸 습 니 다.그래서 이 기 회 를 틈 타 자 료 를 찾 아 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 가 사용자 정의 주 해 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기