1. 포인트 컷이란?
AOP를 적용할 때 해당 객체의 모든 메소드에 적용하는 것이 아닌,
개발자가 원하는 특정 메소드만 AOP를 적용하는 것을 의미한다.
2. xml 설정
<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="classicAroundAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="logAroundAdvice"/>
<property name="pointcut" ref="classicPointCut"/>
</bean>
logBeforeAdvice와 logAroundAdvice로 AOP를 실행할 때,
classicPointCut에 지정되어있는 total 메소드에만 AOP를 적용하여 실행한다는 의미이다.
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="target"/>
<property name="interceptorNames">
<list>
<!-- <value>logAroundAdvice</value> -->
<value>classicAroundAdvisor</value>
<!-- <value>logBeforeAdvice</value> -->
<value>classicBeforeAdvisor</value>
<value>logAfterReturningAdvice</value>
<value>logAfterThrowingAdvice</value>
</list>
</property>
</bean>
따라서 proxy에 주입해주는 객체로 기존의 logAroundAdvice -> classicAroundAdvisor로 위에 생성한 객체를
주입해줘야한다.
그렇다면 앞으로 total 메소드에만 AOP가 적용되고 그 외에 다른 메소드들에는 해당 핸들러가 AOP 기능을 수행하지
않게된다.
3. 코드 간략화
<bean id="classicPointCut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="total"/>
</bean>
위 코드를 삭제해도 특정 핸들러에 포인트컷을 지정할 수 있도록 간략화하는 코드를 소개하겠다.
1) 하나의 메소드를 포인트컷으로 지정할 때
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="mappedName" value="total"/>
</bean>
2) 두 개 이상의 메소드를 포인트컷으로 지정할 때
<bean id="classicAroundAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="logAroundAdvice"/>
<!-- mappedNames 를 쓰면 포인터컷에 사용할 메소드 여러개 설정 가능 -->
<property name="mappedNames">
<list>
<value>total</value>
<value>avg</value>
</list>
</property>
</bean>
property name에 mappedName이 아닌 mappedNames를 쓴것에 유의한다.
3) 메소드명 패턴에 따른 포인트컷 지정
<bean id="classicBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="patterns">
<list>
<value>.*to.*</value>
</list>
</property>
</bean>
메소드 이름에 to가 들어간 모든 메소드들에 AOP를 적용한다.
property name을 patterns으로 수정했으며, 빈객체 클래스도 변했음에 유의한다.