AOP를 구현하는 3가지 방법
1) POJO Class를 이용한 AOP구현 (전통적인 방식)
2) 스프링 API를 이용한 AOP구현 (<aop> 엘리먼트 이용)
3) 어노테이션을 이용한 AOP 구현 (@Aspect으로 직접 구현)
1) 설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="msgBean" class="spring.aop.ch01.MessageBeanImpl" >
<property name="name" value="Spring AOP" />
</bean>
<bean id="logging" class="spring.aop.ch01.Logging"></bean>
<!-- proxy : 스프링 AOP에서 메서드 호출을 가로채기한다. -->
<!-- target 속성 : 위빙될 대상 클래스 -->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="msgBean"/><!-- 인터셉트할 대상을 지정, name은 target 메서드, 타겟 클래스 ID는 ref에 -->
<property name="interceptorNames"><!-- setter 메서드인 interceptorNames는 입력값은 리스트 타입. -->
<list>
<value>advisor</value>
</list>
</property>
</bean>
<!-- advisor : pointcut + advice -->
<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logging"/>
<property name="pointcut">
<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern">
<value>.*helloApp.*</value>
</property>
</bean>
</property>
</bean>
</beans>
2) 메시지빈 인터페이스
package spring.aop.ch01;
public interface MessageBean {
public void helloApp();
}
3) 메시지빈 클래스
package spring.aop.ch01;
public class MessageBeanImpl implements MessageBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void helloApp() {
try {
Thread.sleep(5000); // 시간 지연을 위한 스레드 sleep 메소드 사용
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hello, " + name + "!");
}
}
4) Logging 클래스
package spring.aop.ch01;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.util.StopWatch;
public class Logging implements MethodInterceptor {
// 스프링이 AOP 인터셉트 기능을 수행하게 하는 메서드인터셉터 인터페이스를 구현
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// 인터셉트 한 것을 알려주는 메서드
String methodName = arg0.getMethod().getName();
// 현재 인터셉트한 메서드의 이름을 가져옴
StopWatch sw = new StopWatch(); // 스프링에서 제공하는 타이머 기능의 클래스
sw.start();
System.out.println("[메서드 추적 로그 정보]: "+methodName+" 메서드를 호출합니다.");
Object rtnObj = arg0.proceed(); // proceed는 인터셉트를 수행하러 가라는 오브젝트 타입의 메서드
sw.stop(); // 위 메서드가 끝나면 StopWatch도 끝내기
System.out.println("[메서드 추적 로그 정보]: "+methodName+" 메서드를 호출을 완료합니다.");
System.out.println("[메서드 실행 시간]: "+sw.getTotalTimeMillis()/1000+"초");
return null;
}
}
5) 실행 클래스
package spring.aop.ch01;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
context.registerShutdownHook();
MessageBean msgBean = context.getBean("proxy", MessageBean.class);
msgBean.helloApp();
context.close();
}
}
실행 후 5초 후에 뜬다.
[메서드 추적 로그 정보] : helloApp 메서드를 호출합니다.
Hello, Spring AOP!
[메서드 추적 로그 정보] : helloApp 메서드 호출을 완료합니다.
[메서드 실행 시간] : 5초
' Spring Framework' 카테고리의 다른 글
AOP라는 엘리먼트를 이용해 AOP 설정을 하는 방법 (0) | 2016.04.01 |
---|---|
AOP 용어 및 개념 이해를 위한 예제 (0) | 2016.04.01 |
스프링에서 어노테이션을 이용한 MVC패턴 구성 (0) | 2016.03.31 |
@Controller와 @Component (0) | 2016.03.30 |
@Resource : 이름으로 Bean을 지정하는 어노테이션 (0) | 2016.03.30 |