영혼과영혼의양식
2012. 5. 12. 17:29
※ 하나의 JoinPoint에 한 개 이상의 Advice가 적용될 경우, 순서를 명시적으로 지정할 수 있음
지정방법
▶ org.springframework.core.annotation.Order 어노테이션을 적용
▶ org.springframework.core.Ordered 인터페이스를 구현
■ @Order 어노테이션을 이용하는 방법
NoticeBoardImpl.java
package sp.aop.service;
import org.springframework.stereotype.Component;
@Component("noticeBoard") public class NoticeBoardImpl implements Board {
@Override public String getBoardName() { // TODO Auto-generated method stub return "Notice Board"; }
@Override public String checkBoard() { // TODO Auto-generated method stub return "Y"; } } |
BoardController.java
package sp.aop.controller;
import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import sp.aop.service.Board;
public class BoardController extends org.springframework.web.servlet.mvc.AbstractController {
@Resource(name="noticeBoard") private Board board; @Override protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { // TODO Auto-generated method stub System.out.println("<<===== START =====>>"); System.out.println("Board Name-1 : " + board.getBoardName()); System.out.println("<<===== END =====>>"); return null; }
} |
TestAspect.java
package sp.aop.aspect;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order;
@Aspect @Order(1) public class TestAspect {
@Pointcut("execution(* sp.aop.service.*.get*())") private void getInfo(){}; @Before("getInfo()") public void beforeLog(JoinPoint joinPoint){ System.out.println("--- beforeLog ---"); } } |
LogAspect.java
package sp.aop.aspect;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.core.annotation.Order;
@Aspect @Order(2) public class LogAspect {
@Pointcut("execution(public * sp.aop.service.*.get*(..))") private void profileTarget(){}; @Around("profileTarget()") public Object allLog(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println("*"); System.out.println("**"); try{ Object ret = joinPoint.proceed(); return ret; }finally{ System.out.println("***"); System.out.println("****"); } } } |
spring302-servlet.xml
결과 => LogAspect : Order(2), TestAspect : Order(1)
<<===== START =====>> --- beforeLog --- * ** *** **** Board Name-1 : Notice Board <<===== END =====>> |
결과 => LogAspect : Order(1), TestAspect : Order(2)
<<===== START =====>> * ** --- beforeLog --- *** **** Board Name-1 : Notice Board <<===== END =====>> |
● 적용 순서 값이 낮은 Advice의 우선 순위가 더 높다. 순서 값이 1인 Advice가 순서 값인 2인 Advice보다 우선 순위가 높다. 메서드 호출 전, 메서드 호출에 대해서느 우선 순위가 높은 Advice가 먼저 실행되고, 메서드 호출 후에 대해서는 우선 순위가 낮은 Advice가 먼저 실행
■ XML 스키마를 사용할 경우 <aop:asect> 태그의 order 속성을 사용
<aop:config> <aop:aspect id="" ref="" order="1"> <aop:pointcut expression="" id=""/> <aop:around method=""/> </aop:aspect> </aop:config> |
[참고자료] Spring 3.0 프로그래밍-최범균