이전 시간에는 포인트 컷과 Advisor를 따로 분리했었는데 이것들을 하나의 Advisor로 합쳐보자
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="target" class="spring.aop.entity.NewlecExam" p:kor="1" p:eng="1" p:com="1" p:math="1"/>
<bean id="logAroundAdvice" class="spring.aop.advice.LogAroundAdvice"/>
<bean id="logBeforeAdvice" class="spring.aop.advice.LogBeforeAdvice"/>
<bean id="logAfterReturningAdvice" class="spring.aop.advice.LogAfterReturningAdvice"/>
<bean id="logAfterThrowingAdvice" class="spring.aop.advice.LogAfterThrowingAdvice"/>
/*
<bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total"/>
</bean>
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="pointcut" ref="classicPointCut"/>
</bean>
*/
/* 위의 두 가지를 합쳐놓은것 */
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="mappedNames" >
<list>
<value>total</value>
<value>avg</value> // avg메서드도 추가
</list>
</property>
</bean>
/*
<bean id="classicAroundAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logAroundAdvice"/>
<property name="pointcut" ref="classicPointCut"/>
</bean>
*/
// 위에서 아래로 변경
<bean id="classicAroundAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logAroundAdvice"/>
<property name="mappedName" value="total" />
</bean>
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target" />
<property name="interceptorNames">
<list>
<value>classicAroundAdvisor</value>
<value>classicBeforeAdvisor</value>
<value>logAfterReturningAdvice</value>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
</beans>
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/aop/setting.xml");
Exam proxy = (Exam) context.getBean("proxy");
System.out.printf("total is %d\n", proxy.total());
System.out.printf("avg is %f\n", proxy.avg());
}
}
// <출력>
//앞에서 실행될 로직
//returnValue:4, method:total
//201ms 시간이 걸렸습니다.
//total is 4
//앞에서 실행될 로직
//returnValue:1.0, method:avg
//avg is 1.000000
/*
<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>
참고자료
'🖥️ Backend > Spring' 카테고리의 다른 글
[Spring] 20.Spring AOP(XML, Point Cut①) (0) | 2024.12.31 |
---|---|
[Spring] 19.Spring AOP(XML, AfterThrowingAdvice) (0) | 2024.12.31 |
[Spring] 18.Spring AOP(XML, AfterReturningAdvice) (0) | 2024.12.31 |
[Spring] 17.Spring AOP(XML, BeforeAdvice) (0) | 2024.12.31 |
[Spring] 16.Spring AOP(XML, AroundAdvice) (0) | 2024.12.31 |