스프링 제공 기능
관점 지향 프로그래밍이라고 한다.Exam exam = new NewLecExam(1, 1, 1, 1);
Exam proxyExam = (Exam)Proxy.newProxyInstance(NewLecExam.class.getClassLoader(),
new Class[] { Exam.class },
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long start = System.currentTimeMillis();
Object result = method.invoke(exam, args);
long end = System.currentTimeMillis();
String msg = (end-start) + "ms 시간";
System.out.println(msg);
return result;
}
});
System.out.printf("total is %d \n", proxyExam.total());
System.out.printf("avg is %f \n",proxyExam.avg())
// exam 빈 등록
<bean id="exam" class="spring.aop.entity.NewLecExam" p:kor="1" p:eng="1" p:math="1" p:com="1"/>
// proxy 빈 등록
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="exam"/><!-- DI -->
<property name="interceptorNames">
<list>
<value>logAroundAdvice</value>
<value>logBeforeAdvice</value>
<value>logAfterReturningAdvice</value>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
ApplicationContext context =
new ClassPathXmlApplicationContext("spring/aop/setting.xml");
Exam exam = (Exam) context.getBean("proxy");
System.out.printf("total is %d \n", exam.total());
System.out.printf("avg is %f \n",exam.avg());
package spring.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class LogBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("앞에서 실행될 로직");
}
}
○setting.xml
<bean id="exam" class="spring.aop.entity.NewLecExam" p:kor="1" p:eng="1" p:math="1" p:com="1"/>
<bean id="logBeforeAdvice" class="spring.aop.advice.LogBeforeAdvice"/>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="exam"/><!-- DI -->
<property name="interceptorNames">
<list>
<value>logBeforeAdvice</value>
</list>
</property>
</bean>
package spring.aop.advice;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
// core concern 실행 후 반환값으로 처리할 것이 있는 경우 사용하는 프록시
public class LogAfterReturningAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("returnValue : " + returnValue + ", method : " + method.getName());
}
}
○setting.xml
<bean id="exam" class="spring.aop.entity.NewLecExam" p:kor="1" p:eng="1" p:math="1" p:com="1"/>
<bean id="logAfterReturningAdvice" class="spring.aop.advice..LogAfterReturningAdvice"/>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="exam"/><!-- DI -->
<property name="interceptorNames">
<list>
<value>logAfterReturningAdvice</value>
</list>
</property>
</bean>
package spring.aop.advice;
import org.springframework.aop.ThrowsAdvice;
// core concern 실행 시 예외 발생할 경우 실행.
public class LogAfterThrowingAdvice implements ThrowsAdvice{
public void afterThrowing(IllegalArgumentException e) throws Throwable{
System.out.println("예외가 발생하였습니다." + e.getMessage());
}
}
○setting.xml
<bean id="exam" class="spring.aop.entity.NewLecExam" p:kor="1" p:eng="1" p:math="1" p:com="1"/>
<bean id="logAfterThrowingAdvice" class="spring.aop.advice.LogAfterThrowingAdvice"/>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="exam"/><!-- DI -->
<property name="interceptorNames">
<list>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
package spring.aop.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LogAroundAdvice implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
long start = System.currentTimeMillis();
Object result =invocation.proceed();
long end = System.currentTimeMillis();
String msg = (end-start) + "ms 시간";
System.out.println(msg);
return result;
}
}
○setting.xml
<bean id="exam" class="spring.aop.entity.NewLecExam" p:kor="1" p:eng="1" p:math="1" p:com="1"/>
<bean id="logAroundAdvice" class="spring.aop.advice.LogAroundAdvice"/>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="exam"/><!-- DI -->
<property name="interceptorNames">
<list>
<value>logAroundAdvice</value>
</list>
</property>
</bean>
<!-- pointcut 생성-->
<bean id="classicPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total"/>
</bean>
<!-- advisor 생성-->
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"></property>
<property name="pointcut" ref="classicPointcut"></property>
</bean>
...
<value>classicBeforeAdvisor</value>
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="mappedNames">
<list>
<value>total</value>
<value>avg</value>
</list>
</property>
</bean>
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="patterns">
<list>
<value>.*to.*</value>
</list>
</property>
</bean>