Advice parameters
예전에 공부할 때 여기를 공부하다가 멈췄었네요.
Advice parameters 1 (2)
드디어 따라잡았습니다. 흐흣.
1. Access to the current JoinPoint
해당 Advice가 끼어드는 joinpoint에 대한 정보를 얻어 올 수 있습니다. @Around 어드바이스를 제외한 다른 어드바이스들의 첫번째 파라미터로 JoinPoint 를 만들어 주면 됩니다.
public void weblcomeAdvice(JoinPoint jp){
System.out.println(jp.getClass());
System.out.println("안녕하세요. 어떤 영화를 보시겠습니까?");
}
실제 객체는 MethodInvocationProceedingJoinPoint 이 클래스라는 걸 확인할 수 있습니다.
[#M_ more.. | less.. | Object[] getArgs()
String getKind()
org.aspectj.lang.Signature getSignature()
org.aspectj.lang.reflect.SourceLocation getSourceLocation()
org.aspectj.lang.JoinPoint.StaticPart getStaticPart()
Object getTarget() Returns the Spring AOP target.
Object getThis() Returns the Spring AOP proxy.
Object proceed()
Object proceed(Object[] arguments)
void set$AroundClosure(org.aspectj.runtime.internal.AroundClosure aroundClosure)
String toLongString()
String toShortString()
String toString()
_M#]
@Around 어드바이는 이전 글에서 봤듯이 ProceedingJoinPoint가 와야 합니다.
2. Passing parameters to advice
public void sellTicketPointcut() {
}
@Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcut() &&" +
"args(movie, ..)")
public void weblcomeAdvice(JoinPoint jp, Movie movie){
System.out.println("안녕하세요." + movie.getName() + " 을(를) 보시겠습니까?");
이렇게 args()를 사용하여 대상 메소드가 받을 인자를 가져올 수 있습니다.
다른 방법으로는 @Pointcut을 정의할 때 args()를 사용해서 다음과 같이 하는 건데요. IllegalArgumentExecption이 발생하는데 아직 원인을 모르겠습니다. 레퍼런스에 나와있는 코드와 똑같이 친것 같은데 말이죠. ㅠ.ㅠ
[#M_ more.. | less.. | @Pointcut("aop.newStyle.aspect.CinemaAspect.sellTicketPointcutWithMovie() && " +
"args(movie,..)")
public void sellTicketPointcutWithMovie(Movie movie){
}
@Before("aop.newStyle.aspect.CinemaAspect.sellTicketPointcutWithMovie(movie)")
public void weblcomeAdvice(Movie movie){
System.out.println("안녕하세요." + movie.getName() + " 을(를) 보시겠습니까?");
}_M#]
3. Determining argument names
공부해야 할 부분
4. Proceeding with arguments
@Around 에서 proceed()를 실행 할 때 들어갈 인자값을 바꿀 수 있는데요 그때는 proceed(Object[]) 메소드를 사용하면 됩니다.
"args(movie,..)")
public Object ticketAround(ProceedingJoinPoint pjp, Movie movie) throws Throwable{
System.out.println("안녕하세요." + movie.getName() + " (을)를 보시겠습니까?");
Ticket ticket = (Ticket)pjp.proceed(new Object[]{movie, new Date()});
System.out.println(ticket.getMovie().getName() + " 를 구매하셨습니다.");
System.out.println("감사합니다. 다음에 또 오세요.");
ticket.getMovie().setName("바뀐 영화 이름");
return ticket;
}