로그 - 기반의 인쇄 방법의 실행 시간을 달성하기 위해 AOP

로그 - 기반의 인쇄 방법의 실행 시간을 달성하기 위해 AOP

1.Aop 개요

스프링 프레임 워크 AOP가 AOP는 "크로스"기술이라고하여, 생각의 관점 지향 프로그래밍이다, 다기능 비즈니스 프로세스는 이러한 측면이 상처를 횡단 적절한시기에 별도의 섹션을 형성하기 위해 포장 개별적으로 일반 추출을 포함 지정된 위치로 비즈니스 프로세스 (바이)

2. 간단한 코멘트

나는 우리가 그것의 메모를 정의하기 위해 다음 최대 당신에게, 등 일반적인 @Controller @Service @Autowired로, 많은 주석 매일 개발에 사용할 생각? 다음은 간단한 소개의 예입니다 :

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Performance {
    String functionName() default "";
    String jobKey() default  "";
}

주석 @Target 수정 된 목표 범위를 나타낸다 : 주석 패키지 종류 (클래스, 인터페이스, 열거 주석 형) 부재 타입 (방법, 생성자, 멤버 변수 계수치), 상기 방법은 파라미터를 사용할 수있다 로컬 변수 (예를 들면, 가변 루프 캐치 파라메터). 수정 대상이 더 명확 할 수있다 주석 형 선언에서 대상을 사용합니다

: @Retention 프레스 수명주기는 세 가지 범주로 나눌 수 있습니다
. 1, RetentionPolicy.SOURCE은 : 오직 소스 파일이 유지 될 수, 파일에 자바 클래스 파일을 컴파일 할 때, 주석 포기,
2, RetentionPolicy.CLASS는 : 주석이 유지된다 그들은 기본 라이프 사이클이다, 포기 된 클래스 파일,하지만 JVM 로딩 클래스 파일,
3, RetentionPolicy.RUNTIME : 클래스 노트는 파일에 저장 한 후 존재 여전히 JVM 클래스 파일을로드 할 수 없습니다;

@Documented 노트이 주석 도구의 javadoc가 기록되어야 함을 나타냅니다. 기본적으로 자바 독 주석이 포함되지 않습니다. 그러나, 문 노트가 @Documented 지정된 경우,이 Javadoc 툴처럼 취급 될 것이며, 또한 정보의 유형을 노트 생성 된 문서에 포함되어 마커 주석, 멤버가없는 것입니다
(오류 종료 지점 주시기 바랍니다 더 저자 바이 소득의 개념을보다가)
및 예제가 보여 매개 변수를 정의 할 수 있습니다 선언 @ 인터페이스 유형을.
노트 자체도 그냥이 간단한 응용 프로그램에서했다, 당신이 그것에 대해 자신의 방법을 찾을 수 있습니다 관심이 무엇인지 말해, 다른 메타 주석을 지원합니다.

3.AOP의 특정 코드

@Aspect
@Component
public class PerformanceAspect {

    @Pointcut("@annotation(com.xx.xx.xx.Performance)")
    public void pointCut(){ }

    @Around("pointCut()")
    public void doBefore(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Performance annotation = signature.getMethod().getAnnotation(Performance.class);
        String functionName = annotation.functionName();
        if(functionName.isEmpty()){
            functionName = signature.getMethod().getName();
        }
        String jobKey = (String) AspectSupportUtils.getKeyValue(proceedingJoinPoint,annotation.jobKey());
        long start = System.currentTimeMillis();
        try {
             proceedingJoinPoint.proceed();
        }catch (Exception e){
             LogUtil.exception(e);
        }
        long end = System.currentTimeMillis();
        long timeUse = end - start;
        LogUtil.debug(" service :  " + functionName + jobKey+"  use time: "+timeUse+" ms");
    }

}

@Aspect는 클래스 섹션으로 선언

 @Pointcut("@annotation(com.znv.datacenter.annoations.Performance)")
    public void pointCut(){ }

@Pointcut 주석 표현이 많은 지원 및 구현이 있습니다 관심 캔 바이이다, 내 의견 차단 대신 여기입니다

다음의 주요 방법

@Before :. 동등한 BeforeAdvice 함수 인 미리 향상 식별
@After :. 최종가 예외를 발생 여부, 개선 또는 정상 종료를 실행한다
@AfterReturning : 후면, AfterReturningAdvice 유사한 향상된 일반적 방법 종료를 수행한다.
@AfterThrowing : 강화 예외가 발생, ThrowsAdvice 동등한.
@Around : 서라운드 향상된의 MethodInterceptor 동등한.

논리는 간단하다, 이전과 차단에 대한 방법의 구현 마지막 통화 기록 인쇄의 타임 스탬프 후 다음 메소드 이름을 얻을합니다.
다음 방법 중 어느 곳에 노트 자체를 호출하는 것입니다.

 proceedingJoinPoint.proceed();

댓글을 추가하는 방법에 사용하는 경우

   @UseTemporaryDatabases
    @Performance(functionName = "database import operation job with jobkey : ", jobKey = "#jobKey")
    public void importData(List<Map> tableStructureList, String jobKey) throws Exception {
        DataSourceContextHolder.setDBType("temporarySource");
        //拼接数据库名的转义
        String tableName = "`" + jobKey + "`";
        dataCollectionMapper.importData(tableStructureList, tableName);
    }

주목해야한다 어떤 jobKey가 springEL 식을 사용하여이 매개 변수입니다.
springEL 표현이 매우 강하다, 일반 @Value ( "$ {XXX}는" ) 성능의 사용하지만, 우리는 당신이 SpringEL 식을 사용하고자하는 노트의 자신의 실현의 필요성이 추가 클래스를 추가 할 수 있습니다. 특히 다음 링크를 참조 : 사용자 정의 주석 지원 스프링 EL 식을 .

게시 된 원본 기사 · 원의 칭찬 0 · 조회수 3

추천

출처blog.csdn.net/qq_41696539/article/details/105047412