Spring实现指定执行某些类后的方法后再去执行某个特定的方法 - 前/后增强拦截器

问题需求: 在执行系统中的某些方法后(如执行类名包含有Controller关键字的类中的方法后,再去执行打印某短信息的方法)。

 

解决办法<->: 

 


一、在Spring的配置文件中配置名为BeanNameAutoProxyCreator的interceptor

<bean id="accessAdvisor" class="com.wsheng.uiservices.advisors.RestAPIAccessAdvisor" />
 
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
         	<list>

                        <value>*RestAPI</value>
         		<value>*Controller</value> 
         	</list>
         </property>
        <property name="interceptorNames">
            <list>
                <value>accessAdvisor</value>
            </list>
        </property>
    </bean>

 

 

 

二、创建类RestAPIAccessAdvisor并实现接口:AfterReturningAdvice

这样当调用完*Controller.java或者是*RestAPI.java这样的类中的方法后,将会执行其中的afterRutrning()方法,

public void afterReturning(Object returnValue, Method method,
			Object[] params, Object target) throws Throwable {
		
		try {
			String methodName = method.getName();

                        // 在这里执行相应的逻辑
			System.out.println(methodName);
		} catch (Exception e) {
	logger.error("Building Rest API Access Metrics Failure!!!", e);
		}
		
	}

 

 解决办法<二>

 

一、同样在spring的配置文件中启动Spring的MVC配置。

<mvc:annotation-driven>
<context:component-scan base-package="com.chuanliu.platform.activity"/>

 

二、配置相关的Interceptor类并制定interceptor的url

<mvc:interceptors>
   <mvc:interceptor>
<mvc:mapping path="/rest/relation/contacts/add/*"/>
<bean class="com.chuanliu.platform.activity.basic.advisor.ActionAdvisor"/>      </mvc:interceptor>
</mvc:interceptors>

 

三、完成ActionAdvisor类

/**
 * 
 */
package com.chuanliu.platform.activity.basic.advisor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  [email protected]
 */
@Component("actionAdvisor")
public class ActionAdvisor extends HandlerInterceptorAdapter {

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println(" ---- afterCompletion");
		super.afterCompletion(request, response, handler, ex);
		
	}

	@Override
	public void afterConcurrentHandlingStarted(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(" --- afterCOncurrentHandlingStarted");
		super.afterConcurrentHandlingStarted(request, response, handler);
		
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(" --- postHandle");
		System.out.println("=== " + request.getRequestURL());
		System.out.println(" === " + response.getStatus());
		super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(" --- preHandle");
		System.out.println("--- " + request.getRequestURL());
		return super.preHandle(request, response, handler);
	}

}

 

执行测试会发现前拦截器中复写的方法都被执行了。

 

 

猜你喜欢

转载自josh-persistence.iteye.com/blog/2096530