영혼과영혼의양식
2012. 5. 11. 23:04
●AOP 관련해서 JoinPoint를 파라미터로 전달받을 경우 반드시 첫번째 파라미터로 지정해야 함(그 외는 예외 발생)
●JoinPoint 인터페이스는 호출되는 대상 객체, 메서드 그리고 전달되는 파라미터 목록에 접근할 수 있는 메서드를 제공
■ Signature getSignature( ) - 호출되는 메서드에 대한 정보를 구함
■ Object getTarget( ) - 대상 객체를 구함
■ Object[ ] getArgs( ) - 파라미터 목록을 구함
●org.aspectj.lang.Signature 인터페이스는 호출되는 메서드와 관련된 정보를 제공하기 위해 다음과 같은 메서드를 정의
■ String getName( ) - 메서드의 이름을 구함
■ String toLongName( ) - 메서드를 완전하게 표현한 문장을 구함(메서드의 리턴 타입, 파라미터 타입 모두 표시)
■ String toShortName( ) - 메서드를 축약해서 표현한 문장을 구함(메서드의 이름만 구함)
●Around Advice의 경우 org.aspectj.lang.ProceedingJoinPoint를 첫 번째 파라미터로 전달받는데 해당 인터페이스는 프록시 대상 객체를 호출할 수있는 proceed() 메서드를 제공
●ProceedingJoinPoint는 JoinPoint 인터페이스를 상속받았기 때문에 Signature를 이용하여 대상 객체, 메서드 및 전달되는 파라미터에 대한 정보를 구할 수 있음
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());
return null; }
} |
TestAspect.java
package sp.aop.aspect;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;
@Aspect public class TestAspect { @Pointcut("execution(public * sp.aop.service.*.*())") private void allTarget(){};
@Before("allTarget()") public void aaa(JoinPoint joinPoint){ Signature signature = joinPoint.getSignature(); Object target = joinPoint.getTarget(); Object[] args = joinPoint.getArgs(); System.out.println("Signature : " + signature.toString()); System.out.println("target : " + target.toString()); System.out.println("name : " + signature.getName()); System.out.println("longName : " + signature.toLongString()); System.out.println("shortName : " + signature.toShortString()); for(int i=0; i < args.length; i++){ System.out.println("args[" + i + "] : " + args[i].toString()); } }
}
|
spring302-servlet.xml
결과
<<===== START =====>> Signature : String sp.aop.service.Board.getBoardName() target : sp.aop.service.NoticeBoardImpl@552a66ea name : getBoardName longName : public abstract java.lang.String sp.aop.service.Board.getBoardName() shortName : Board.getBoardName() Board Name-1 : Notice Board |
[참고자료] Spring 3.0 프로그래밍-최범균