본문 바로가기

SPRING

AOP (2) - @Aspect Annotaion

대체로 어노테이션을 사용하면 좀 더 직관적이고, xml보다 더 많이 사용되는 추세


@Aspect Annotation을 사용한 예제


AOP (1) - XML Schema 예제에 사용된 일부 파일 소스를 수정한 예제


1) ApplicationCTX.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

	<aop:aspectj-autoproxy />
	<bean id="logAop" class="com.ska.ex.LogAop" />
	
	<!--  aop 태그는 삭제 -->
 
	<bean id="student" class="com.ska.ex.Student">
		<property name="name" value="frederic" />
		<property name="major" value="Java" />
	</bean>
	
	<bean id="worker" class="com.ska.ex.Worker">
		<property name="name" value="chopin" />
		<property name="job" value="Pianist" />
	</bean>
</beans>


2) LogAop.java

@Aspect
public class LogAop {
	
	@Pointcut("within(com.ska.ex.*)")
	private void pointcutMethod(){}
	
	// pointcut이 지정된 method를 설정
	@Around("pointcutMethod()")
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
		String signatureStr = joinpoint.getSignature().toShortString();
		System.out.println("! " + signatureStr + " has been started");
		
		long timeStart = System.currentTimeMillis();
		
		try {
			Object obj = joinpoint.proceed();
			return obj;
		} finally {
			long timeEnd = System.currentTimeMillis();
			System.out.println("! " + signatureStr + " has been finished, time elapsed : " + (timeEnd - timeStart));
		}
	}
	
	// 직접 pointcut을 설정
	@Before("within(com.ska.ex.*)")
	public void beforeAdvice(){
		System.out.println("Before Advice ");
	}
}


Aspectj Pointcut 표현식



 Expression

.. 

 의미

 모두

현재 

0개 이상 


 Execution

@Pointcut("execution(  public void get*(..)  )")	
// public void인 모든 get 메서드

@Pointcut("execution(  * com.ska.ex.*.*()   )")	
//  com.ska.ex 패키지에 파라미터가 없는 모든 메서드

@Pointcut("execution(  * com.ska.ex..*.*()  )")	
//  com.ska.ex 패키지 및 하위 패키지에 파라미터가 없는 모든 메서드

@Pointcut("execution(  * com.ska.ex.Worker.*()  )")	
//  com.ska.ex.Worker 안의 모든 메서드

 within

@Pointcut("within(  com.ska.ex.*  )")
// com.ska.ex 패키지 안의 모든 메서드

@Pointcut("within(  com.ska.ex..*  )")
// com.ska.ex 패키지 및 하위 패키지의 모든 메서드

@Pointcut("within(  com.ska.ex.Worker  )")
// com.ska.ex.Worker의 모든 메서드

 bean

@Pointcut("bean(  student  )")
// student 빈에만 적용

@Pointcut("bean(  *ker  )")
// 이름이 ~ker 로 끝나는 빈만 적용 (ex: Worker, Stalker, Kicker ...)