攔截 People 類別中符合特定命名規則的方法,排除特定方法,驗證前置通知觸發情況。
Peoplepublic class People {
public void speak() { System.out.println("Hello,我是People!"); }
public void Running() { System.out.println("我在跑..."); }
public void Loving() { System.out.println("我在和MM戀愛..."); }
public void died() { System.out.println("完了,我死了"); }
}
LogerPeoplepublic class LogerPeople implements MethodBeforeAdvice {
private static final Log log = LogFactory.getLog(LogerPeople.class);
public void before(Method method, Object[] args, Object target) throws Throwable {
log.info(target.getClass().getSimpleName() + "正在" + method.getName() + "!");
}
}
<bean id="Computer" class="aop.test.People"/>
<bean id="LogerComputer" class="aop.test.LogerPeople"/>
<bean id="ProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="Computer"/>
<property name="interceptorNames">
<list><value>DefaultAdvisor</value></list>
</property>
</bean>
<bean id="DefaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="JdkRegexpPointcut"/>
<property name="advice" ref="LogerComputer"/>
</bean>
<bean id="JdkRegexpPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>.*spea.*</value> <!-- 匹配 speak -->
<value>.*ing</value> <!-- 匹配 Running、Loving -->
<value>.*di.*</value> <!-- 匹配 died -->
</list>
</property>
<property name="excludedPattern" value=".*Run.*"/> <!-- 排除 Running -->
</bean>
People p = (People) ac.getBean("ProxyFactoryBean");
p.speak(); // 被攔截 → 輸出日誌
p.Running(); // 被 excludedPattern 排除 → 無日誌
p.Loving(); // 被攔截
p.died(); // 被攔截
People正在speak!
People正在Loving!
People正在died!
Running() 因符合 excludedPattern=".*Run.*" 而未被攔截,驗證排除規則生效。
patterns:字串陣列,任一正則匹配即納入切入點(OR 關係)。excludedPattern / excludedPatterns:匹配者從切入點移除(排除優先級高於包含)。classFilter 屬性限定目標類別。