AOP 구현 : XML 스키마 기반
Aspect 구현하기
XML 스키마를 이용할 경우, XML 설정을 이용해서 Aspect를 어디에 적용할지를 설정한다. XML 설정에서 사용할 Aspect 구현 클래스는 일반 자바 클래스이며 아래에 코드를 올렸다.
package com.ktko.aop; import java.util.Arrays; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; public class ExeTimeAspect { 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));
} } }
ProceedingJoinPoint 타입의 파라미터는 대상 객체의 메서드를 호출할 때 사용된다.실제 대상 객체의 메서드를 호출할 때에는 13행의 코드처럼 proceed() 메서드를 사용한다. 이 메서드를 호출하면 대상 객체의 메서드가 실행되므로, 이 코드의 이전과 이후의 공통 기능을 위한 코드를 위치시키면 된다.
getSignature(), getTarget(), getArgs() 등의 메서드는 각각 메서드 시그니처, 대상 객체, 인자 목록을 구하는데 사용된다.
XML 스키마 설정하기
네임스페이스에서 AOP를 추가
<beans:bean id="exeTimeAspect" class="com.ktko.aop.ExeTimeAspect" /> <!-- AOP 설정 시작 --> <aop:config> <!-- Aspect의 ID를 지정하고 AOP공통 기능을 Bean으로 등록햇던 exeTimeAspect를 참조. --> <aop:aspect id="measureAspect" ref="exeTimeAspect"> <!-- pointcut의 ID는 publicmethod 이고, com.ktko.test.* 패키지에 있는 모든 클래스에 공통 기능을 적용. --> <aop:pointcut id="publicMethod" expression="within(com.ktko.test.*)"/> <!-- com.ktko.aop.ExeTimeAspect 클래스에 measure라는 공통기능 메소드를 publicMethod라는 pointcut에 적용. --> <aop:around pointcut-ref="publicMethod" method="measure"/> </aop:aspect> </aop:config>
예제 소스
Main
Calculator impeCal = new ImmpeCalculator(); System.out.println(impeCal.factorial(5)); Calculator recCal = new RecCaculator(); System.out.println(recCal.factorial(5));
package com.ktko.calculate; public interface Calculator { public long factorial(long num); }
package com.ktko.calculate; public class ImmpeCalculator implements Calculator{ @Override public long factorial(long num) { long result = 1; for(int i = 1; i <= num; i++) { result *= i; } return result; } }
package com.ktko.calculate; public class RecCaculator implements Calculator{ @Override public long factorial(long num) { if(num == 0) { return 1; } else { return num * factorial(num - 1); } } }
실행 결과
샘플 코드
'Spring 스프링 ' 카테고리의 다른 글
[스프링/Spring] ProceedingJoinPoint의 메서드 (0) | 2018.04.16 |
---|---|
[스프링/Spring] AOP구현(@Aspect 어노테이션 사용) (0) | 2018.04.16 |
[스프링/Spring] AOP 개념 설명 (0) | 2018.04.16 |
[스프링/Spring] properties 읽어오기 (0) | 2017.09.18 |
[스프링/Spring] properties암호화 (0) | 2017.09.18 |