대체로 어노테이션을 사용하면 좀 더 직관적이고, 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 ...) |