336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
AOP 구현 : @Aspect 어노테이션 사용
@Aspect 어노테이션을 이용해서 공통으로 적용할 기능을 구현한 경우, XML 설정에서 이를 인식할 수 있도록
<aop:aspectj-autoproxy/> 태그를 추가해주어야 한다.
<aop:aspectj-autoproxy /> <beans:bean id="exeTimeAspect" class="com.ktko.aop.ExeTimeAspect" />
@Aspect 어노테이션을 이용해서 공통 기능을 제공하는 Aspect 클래스를 작성할 수도 있다. @Aspect 어노테이션을 이용한 공통 기능 구현 방법은 POjo 방식과 크게 다르지 않다. 차이점이 있다면, @Aspect 어노테이션을 적용한 클래스에 공통 기능과 PointCut을 설정한다는 점이다.
package com.ktko.aop; import java.util.Arrays; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; //Aspect 역할을 할 클래스를 선언하기 위해 어노테이션 선언 @Aspect public class ExeTimeAspect { //PointCut의 속성에 핵심코드의 어느 부분까지 공통 기능을 사용하겟다고 명시 @Pointcut("expression=within(com.ktko.test.*)") private void publicTarget() { } //around가 적용될 포인트 컷을 명시 : publicTarget() @Around("publicTarget()") public Object measure(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.nanoTime(); try { Object result = joinPoint.proceed(); return result; } finally { long finish = System.nanoTime(); Signature sig = joinPoint.getSignature(); System.out.printf("%s.%s(%s) 실행 시간 : %d ns\n", joinPoint.getTarget().getClass().
getSimpleName(), sig.getName(), Arrays.toString(joinPoint.getArgs()), (finish - start)); System.out.println(joinPoint.getTarget().getClass().getSimpleName()); System.out.println(sig.getName()); System.out.println(Arrays.toString(joinPoint.getArgs())); } } }
XML 스키마 방식으로 구현했던 것과 차이점은
클래스에 @Aspect 어노테이션 적용
@Pointcut 어노테이션을 적용하여 PointCut을설정했다.
@Around 어노테이션을 적용해서 메서드가 Around Advice로 사용된다고 설정햇다.
즉 @Aspect 어노테이션을 적용한 클래스는 PointCut과 Advice 설정 그리고 Aspect 구현을 함께 제공한다. measure 메서드는 Aspect가 제공할 공통 기능의 구현에 해당한다. 이 공통 기능을 언제 어디에 적용할지 여부는 메서드에 붙은 @Around 어노테이션을 사용하여 설정하고 있다.
예제 코드
'Spring 스프링 ' 카테고리의 다른 글
[스프링/Spring] DI를 왜 사용해야 할까 ? (1) | 2018.10.15 |
---|---|
[스프링/Spring] ProceedingJoinPoint의 메서드 (0) | 2018.04.16 |
[스프링/Spring] AOP구현(XML 스키마 기반) (0) | 2018.04.16 |
[스프링/Spring] AOP 개념 설명 (0) | 2018.04.16 |
[스프링/Spring] properties 읽어오기 (0) | 2017.09.18 |