Dashboard > OpenSource Project > ... > Spring > 入門 43 - Before, After Returning Advice
OpenSource Project Log In   View a printable version of the current page.
入門 43 - Before, After Returning Advice
Added by cheetah, last edited by cheetah on Apr 11, 2005
Labels: 
(None)

  在Spring中實現Before Advice或是After Returning Advice,作法與Interceptor類別,只要分別實現org.springframework.aop.MethodBeforeAdvice及org.springframework.aop.AfterReturningAdvice,兩個介面的定義如下:

 代碼:

MethodBeforeAdvice.java
public interface MethodBeforeAdvice extends BeforeAdvice { 
    void before(Method m, Object[] args, Object target) throws Throwable; 
}

 代碼:

AfterReturningAdvice.java
public interface AfterReturningAdvice extends Advice { 
    void afterReturning(Object returnValue, Method m, Object[] args, Object target) 
            throws Throwable; 
}

  MethodBeforeAdvice的before()方法會在被呼叫的方法之前調用,它不需要如Interceptor呼叫MethodInvocation的proceed()方法,在進入方法前BeforeAdvice被調用的順序由Bean定義檔中設定的順序決定。

  AfterReturningAdvice的afterReturning()方法會在被呼叫的方法之後調用,它可以存取傳回值,但不能改變其值,無論是Interceptor、Before Advice或是After Returning Advice,當發生例外時,會沿著interceptor鏈往上傳播。

  來看實際的設定例子,我們分別實現MethodBeforeAdvice及AfterReturningAdvice:

 代碼:

LogBeforeAdvice.java
package onlyfun.caterpillar; 

import org.springframework.aop.MethodBeforeAdvice; 
import java.lang.reflect.Method; 
import java.util.logging.*; 

public class LogBeforeAdvice implements MethodBeforeAdvice { 
    private Logger logger = Logger.getLogger(this.getClass().getName()); 
    
    public void before(Method method, Object[] args, Object target) 
                   throws Throwable { 
        logger.log(Level.INFO, "method starts..." + method); 
   } 
}

 代碼:

LogAfterAdvice.java
package onlyfun.caterpillar; 

import org.springframework.aop.AfterReturningAdvice; 
import java.lang.reflect.Method; 
import java.util.logging.*; 

public class LogAfterAdvice implements AfterReturningAdvice { 
    private Logger logger = Logger.getLogger(this.getClass().getName()); 
    
    public void afterReturning(Object object, Method method, 
                               Object[] args, Object target) 
                                  throws Throwable { 
        logger.log(Level.INFO, "method ends..." + method); 
   } 
}

  其它像是IHello介面、HelloSepaker類別與測試程式,都與之前主題中介紹的相同,不需作任何的修改,我們只要改變Bean設定檔的內容,就可以改變這些Advice的介入,Bean設定檔的內容如下:

 代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="logBeforeAdvice" class="onlyfun.caterpillar.LogBeforeAdvice"/> 
    <bean id="logAfterAdvice" class="onlyfun.caterpillar.LogAfterAdvice"/> 

    <bean id="logBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
        <property name="advice"> 
            <ref bean="logBeforeAdvice"/> 
        </property> 
        <property name="patterns"> 
            <value>onlyfun\.caterpillar\.IHello\.hello</value> 
        </property> 
    </bean> 

    <bean id="logAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
        <property name="advice"> 
            <ref bean="logAfterAdvice"/> 
        </property> 
        <property name="patterns"> 
            <value>onlyfun\.caterpillar\.IHello\.morning</value> 
        </property> 
    </bean> 

    <bean id="helloSpeaker" class="onlyfun.caterpillar.HelloSpeaker"/> 
    
    <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 
        <property name="proxyInterfaces"> 
            <value>onlyfun.caterpillar.IHello</value> 
        </property> 
        <property name="target"> 
            <ref bean="helloSpeaker"/> 
        </property> 
        <property name="interceptorNames"> 
            <list> 
                <value>logBeforeAdvisor</value> 
                <value>logAfterAdvisor</value> 
            </list> 
        </property> 
    </bean> 
</beans>

  這邊仍使用了RegexpMethodPointcutAdvisor,分別設定在執行hello()之前介入logBeforeAdvisor,以及morning()方法之後使用logAfterAdvisor。

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators