// 目標介面
public interface Sleepable { void sleep(); }
// 目標實作
public class ChenLliNa implements Sleepable {
public void sleep() { System.out.println("乖,該睡覺了!"); }
}
// 橫切關注點(增強)
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
public void before(Method m, Object[] args, Object target) {
System.out.println("睡覺前要敷面膜");
}
public void afterReturning(Object ret, Method m, Object[] args, Object target) {
System.out.println("睡覺後要作美夢");
}
}
<bean id="sleepHelper" class="...SleepHelper"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*sleep"/>
</bean>
<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="sleepHelper"/>
<property name="pointcut" ref="sleepPointcut"/>
</bean>
<bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="lina"/>
<property name="interceptorNames" value="sleepHelperAdvisor"/>
</bean>
<bean id="sleepHelper" class="...SleepHelper"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="sleepHelper"/>
<property name="pattern" value=".*sleep"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
@Aspect @Component
public class SleepHelper03 {
@Pointcut("execution(* *.sleep(..))") public void sleepPoint() {}
@Before("sleepPoint()") public void beforeSleep() { System.out.println("睡覺前要敷面膜"); }
@AfterReturning("sleepPoint()") public void afterSleep() { System.out.println("睡覺後要作美夢"); }
}
<context:component-scan base-package="com.tgb"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="lina" class="...ChenLliNa"/>
<bean id="sleepHelper" class="...SleepHelper02"/> <!-- 純 POJO -->
<aop:config>
<aop:aspect ref="sleepHelper">
<aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
<aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
</aop:aspect>
</aop:config>
四種配置對應的測試方法均從容器獲取 lina 或 linaProxy 呼叫 sleep(),輸出結果一致:
睡覺前要敷面膜 乖,該睡覺了! 睡覺後要作美夢