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
public class WareHouse { private static WareHouse instance=new WareHouse(); private int flowerCount=10; private int bookCount=10; private WareHouse(){} public static WareHouse getInstance(){ return instance; } public int getFlowerCount() { return flowerCount; } public int getBookCount() { return bookCount; }
}
package shop.service;
import shop.data.WareHouse;
public class BookServiceImpl implements StoreService { private WareHouse wareHouse;
public BookServiceImpl() { } public BookServiceImpl(WareHouse wareHouse){ this.wareHouse=wareHouse; } @Override public void sell(int count) throws InsufficientInventoryException{ if(wareHouse.getBookCount()<count){ throw new InsufficientInventoryException("Book 재고가 부족!",count); } System.out.println("책 "+count+"권 판매 ok!"); } }
package shop.service;
import shop.data.WareHouse;
public class FlowerServiceImpl implements StoreService { private WareHouse wareHouse; public FlowerServiceImpl(WareHouse wareHouse) { super(); this.wareHouse = wareHouse; } @Override public void sell(int count) throws InsufficientInventoryException { if(wareHouse.getFlowerCount()<count){ throw new InsufficientInventoryException("꽃 재고 부족",count); } System.out.println("꽃 "+count+" 송이 판매!"); } }
package shop.service;
//재고 부족시 발생시킬 Exception객체 public class InsufficientInventoryException extends Exception { private int orderCount; public InsufficientInventoryException() { }
public InsufficientInventoryException(String message, int orderCount) { super(message); this.orderCount = orderCount; } public int getOrderCount(){ return orderCount; }
}
package shop.service;
public interface StoreService {
public abstract void sell(int count) throws InsufficientInventoryException;