public class TestMain { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("aop/config/aop.xml"); MemberService service = (MemberService)ctx.getBean("memberService"); service.a(); String str = service.c(); System.out.println("main : "+str);
}
}
package aop.advice;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggerAdvice { public Object aroundLogger(ProceedingJoinPoint jp)throws Throwable{ System.out.println("---------before"); try{ Object retValue = jp.proceed();//클라이언트가 호출한 핵심 로칙 처리 메소드 호출 System.out.println("---------after-returning : 리턴값 : "+retValue);
// retValue = "asdfsdf";//String 값도 주소값으로 넘어다니기 때문에 retValue의 main에서의 값이 변한다. return retValue; }catch (Throwable ta) { System.out.println("--------after-throwing"); throw ta;//여기서 예외를 처리하는 것이 아니기 때문에 호출한 곳으로 예외를 던져준다. }finally{ System.out.println("--------after"); }
public class MemberService { public void a(){ System.out.println("MemberService.a() 실행"); } public void b(){ System.out.println("MemberService.b() 실행"); } public String c(){ System.out.println("MemberService.c() 실행"); return "abc"; } }
* 결과
---------before MemberService.a() 실행 ---------after-returning : 리턴값 : null --------after ---------before MemberService.c() 실행 ---------after-returning : 리턴값 : abc --------after main : abc