ProxyFactoryBean을 이용한 초간단 AOP 구현
스프링 AOP가 어렵다고 생각하시는 분들은 저 클래스를 사용하는 방법부터 익히시면 도움이 될 것 같습니다.
아주 간략하게 ProxyFactoryBean을 사용해서 AOP를 적용해 보겠습니다.
AOP는 OOP 같은 프로그래밍 기법이지 무슨 기술이 아닙니다. 따라서 이 글에서 구현하는 내용은 AOP 적용 방법 중 하나라고 생각하시면 됩니다.
interface Service {
public void hi();
public void hi2();
}
이런 인터페이스가 있고
class ServiceImpl implements Service {
public void hi(){
System.out.println("my business");
}
@Override
public void hi2() {
System.out.println("my2");
}
}
이런 구현체가 있을 때. hi() 호출 전 후에만 메시지를 출력하고 hi2()는 걍 저대로 출력하고 싶다면 ... 우선 해당 작업을 수행할 MethodIterceptor 인터페이스의 구현체를 만듭니다.
class ServiceLoggingAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("before hi");
invocation.proceed();
System.out.println("after hi");
return null;
}
}
그리고 hi()와 hi2()를 선별해줄 NameMatchMethodPointcut을 만듭니다.
class ServiceLoggingPointcur extends NameMatchMethodPointcut {
ServiceLoggingPointcur() {
setMappedName("hi");
}
}
이제 마지막으로 ProxyFactoryBean으로 위에서 만들었던 타겟(Service 구현체), 어드바이스(MethodInterceptor 구현체), 포인트컷(NameMatchMethodPointcut 구현체)을 ProxyFactoryBean에 설정 해주면 끝!
Service service;
ProxyFactoryBean proxyFactoryBean;
@Before
public void setUp(){
proxyFactoryBean = new ProxyFactoryBean();
proxyFactoryBean.setTarget(new ServiceImpl());
proxyFactoryBean.addAdvisor(new DefaultPointcutAdvisor(
new ServiceLoggingPointcur(),
new ServiceLoggingAdvice()));
}
@Test
public void logging(){
Service service = (Service) proxyFactoryBean.getObject();
service.hi();
service.hi2();
}
이렇게 하면 콘솔에
요런식으로 출력됩니다.
자세한 내용은 언젠간 출간될 Toby님의 스프링 책을 참조하세요.