Thanks for your reply,Brice! Actually, my app is almost the same as the spring example in the xfire-distribution-1.2.3.zip, what I want is just to put spring aop into work. as in the xfire-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" " http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- START SNIPPET: xfire --> <bean class=" org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/EchoService"> <ref bean="echo"/> </entry> </map> </property> </bean> <!-- Declare a parent bean with all properties common to both services --> <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter "> <property name="serviceFactory"> <ref bean="xfire.serviceFactory"/> </property> <property name="xfire"> <ref bean="xfire"/> </property> <property name="serviceBean"> <ref bean="echoBean"/> </property> <property name="serviceClass"> <value>org.codehaus.xfire.spring.example.Echo</value> </property> </bean> <!-- END SNIPPET: xfire --> </beans> I think that XFireExporter takes control of "echoBean" and make some proxy beans using it , which handle http request. While my spring advice only intercept "echoBean", so there is no effect. Is it right? And what should I do to make it works? 2006/12/31, Brice Ruth <[EMAIL PROTECTED]>:
I'm not sure about the xfire-servlet mechanism, but when we first started using Spring AOP with XFire + JSR-181 + Jsr181BeanPostProcessor, we found that the Jsr181BeanPostProcessor was grabbing the service bean before the AOP advice had been wrapped around it. Order is very important, since the advice is applied at runtime to an object (by creating a proxy) - not to the class, which is how many folks learn to use AOP. With Spring AOP, you can easily have an object with and without the advice you've created, which isn't the case with compile-time weaving. xfire-servlet is either not looking at your Spring context bean at all (its instantiating it purely from some configuration), or its grabbing your Spring context bean before its been advised. I can't really tell w/o know more about how xfire-servlet configuration works and what else you have in your Spring context related to XFire. Cheers, Brice On 12/31/06, yongguang zhao <[EMAIL PROTECTED]> wrote: > > Hi, > I want to add some logging functionality to the XFire spring > example--Echo, > that is, after some client invokes the Echo service, I want to log > something. > I think Spring AOP is the best choice, > here is my applicationContext.xml: > > <?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="echoBean" class=" > org.codehaus.xfire.spring.example.EchoImpl"/> > <bean id="LoggingInterceptor" class="com.xyz.LoggingAdvice"/> > > <bean id="LoggingPointcutAdvisor" class=" > org.springframework.aop.support.DefaultPointcutAdvisor "> > <property name="advice"> > <ref local="LoggingInterceptor"/> > </property> > <property name="pointcut"> > <bean class=" > org.springframework.aop.support.JdkRegexpMethodPointcut"> > <property name="pattern"> > <value>.*</value> > </property> > </bean> > </property> > </bean> > <bean id="LoggingAOPProxy" class=" > org.springframework.aop.framework.ProxyFactoryBean"> > <property name="target"> > <ref local="echoBean" /> > </property> > <property name="interceptorNames"> > <list> > <value>LoggingPointcutAdvisor</value> > </list> > </property> > </bean> > </beans> > the LoggingAdvice mentioned before is simple: > > package com.xyz; > > import java.lang.reflect.Method; > > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.log4j.Logger; > import org.springframework.aop.AfterReturningAdvice; > import org.springframework.aop.MethodBeforeAdvice ; > > public class LoggingAdvice implements MethodBeforeAdvice, > AfterReturningAdvice { > private static Log log = LogFactory.getLog(LoggingAdvice.class); > > public void before(Method method, Object[] args, Object target) > throws Throwable { > log.debug("before"); > } > > public void afterReturning(Object retuVal, Method method, Object[] > args, > Object target) throws Throwable { > log.debug("afterReturning"); > } > } > while xfire-servlet.xml is the same as in the example. > > However the interceptor just does not work, > can anyone please help me? > > thanks. > > -- Brice Ruth Software Engineer, Madison WI
