다양한AOP구현방법
다양한 AOP 구현방법
-
컴파일
- A.java —(AOP)—> A.class 컴파일할때 중간에 추가된다 : AspectJ컴파일러
-
바이트코드 조작
- A.java —> A.class —(AOP)—> 메모리 클래스 로더가 클래스를 읽어서 메모리에 올릴때 조작
-
프록시 패턴
- (스프링 AOP가 사용하는 방법)
- 프록시 예시
public interface Payment {
void pay(int amount);
}
public class Store {
Payment payment;
public Store(Payment payment) {
this.payment = payment;
}
public void buysomething(int amount) {
payment.pay(amount);
}
}
public class Cash implements Payment {
@Override
public void pay(int amount) {
System.out.println(amount + " 현금 결제");
}
}
//프록시
public class CashPerf implements Payment {
Payment cash = new Cash();
@Override
public void pay(int amount) {
// if (amout < 100) {
// System.out.println(amount + " 신용카드");
// } else {
// cash.pay(amout);
// }
//CashPerf가 알아서 판단 cash를 쓸지, creditcard를 쓸지)
StopWatch stopWatch = new StopWatch();
stopWatch.start();
cash.pay(amount);
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
}
}
public class StoreTest {
@Test
public void testPay() {
Payment cashPerf = new CashPerf(); //프록시코드사용
Store store = new Store(cashPerf);
store.buysomething(amount:100);
}
}
//새로운 코드를 추가하였지만 기존 코드를 건드리지 않았다는 점이 중요하다.
//스프링에서는 @Transactional같은 어노테이션이 붙은 경우 프록시가 생성된다.