어드바이스 유형 | 인터페이스 |
Before | org.springframework.aop.MethodBeforAdvice |
After-returning | org.springframework.aop.AfterReturningAdvice |
After-throwing | org.springframework.aop.ThrowAdvice |
Around | org.aopalliance.intercept.MethodInterceptor |
Introduction | org.springframework.aop.IntroductionInterceptor |
/**
* 세가지 어드바이스 유형을 구한다. MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice
*
*/
public class AudienceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {
public AudienceAdvice() {
}
// 메소드 실행전에 호출된다.
public void before(Method method, Object[] args, Object target) throws Throwable {
audience.takeSeats();
audience.turnOffCellPhones();
}
// 성공적으로 메소드가 반환되면 실행된다
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
audience.applaud();
}
// 예외가 발생되면 실행된다.
public void afterThrowing(Throwable throwable) {
audience.demandRefund();
}
private Audience audience;
public void setAudience(Audience audience) {
this.audience = audience;
}
}
<bean id="audience" class="chapter4.classicSpringAop.Audience" />
<bean id="audienceAdvice"
class="chapter4.classicSpringAop.AudienceAdvice">
<property name="audience" ref="audience" />
</bean>
<bean id="audienceAdvisor"
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="audienceAdvice" />
<property name="pointcut" ref="performancePointcut" />
</bean>
<bean id="performancePointcut"
class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression" value="execution(* perform(..))" />
</bean>
<bean id="performancePointcut"
class="org.springframework.aop.aspectj.JdkRegexpMethodPointcut">
<property name="pattern" value="*.perform" />
</bean>
기호 | 의미 |
. | 어떤 문자든 딱 한 글자 |
* | * 앞에 있는 문자가 여러개 있을 수 있음 |
+ | + 앞에 있는 문자가 최소한 한 개에서 여러개 있을 수 있음 |
\ | \ 뒤에 오는 문자가 있어야한다 |
<bean id="audienceAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="audienceAdvice" />
<property name="pattern" value=".*perform" />
</bean>
<bean id="dukeTarget"
class="chapter2.springidol.PoeticJuggler"
autowire="constructor">
<constructor-arg ref="sonnet29"/>
</bean>
<bean id="duke" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="dukeTarget" />
<property name="interceptorNames" value="audienceAdvisor" />
<property name="proxyInterfaces" value="chapter2.springidol.Performer" />
</bean>
<bean id="stevieTarget"
class="chapter2.springidol.PoeticJuggler"
autowire="constructor">
<constructor-arg ref="sonnet29"/>
</bean>
<!-- 똑같은 코드의 중복 -->
<bean id="stevie" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="stevieTarget" />
<property name="interceptorNames" value="audienceAdvisor" />
<property name="proxyInterfaces" value="chapter2.springidol.Performer" />
</bean>
<bean id="dukeTarget"
class="chapter2.springidol.PoeticJuggler"
autowire="constructor">
<constructor-arg ref="sonnet29"/>
</bean>
<bean id="stevieTarget"
class="chapter2.springidol.PoeticJuggler"
autowire="constructor">
<constructor-arg ref="sonnet29"/>
</bean>
<bean id="audienceProxyBase"
class="org.springframework.aop.framework.ProxyFactoryBean"
abstract="true">
<property name="interceptorNames" value="audienceAdvisor" />
<property name="proxyInterface" value="chapter2.springidol.Performer" />
</bean>
<bean id="stevie" parent="audienceProxyBase">
<property name="target" ref="stevieTarget" />
</bean>
<bean id="duke" parent="audienceProxyBase">
<property name="target" ref="dukeTarget" />
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />