博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
神奇的AOP
阅读量:6822 次
发布时间:2019-06-26

本文共 4709 字,大约阅读时间需要 15 分钟。

hot3.png

通过spring框架我们可以轻易地实现aop。来看下面的例子。

package com.fengshu.gotian.controller;import javax.inject.Named;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;
import java.io.IOException;import java.io.PrintWriter;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.IOUtils;import org.apache.commons.lang.StringUtils;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.web.servlet.ModelAndView;import com.iflashbuy.base.common.ContextThread;import com.iflashbuy.base.common.JsonResult;import com.iflashbuy.base.enums.Status;import com.iflashbuy.base.util.JsonUtil;/** * 针对方法级别的切面 *  * @author 漂泊者及其影子 * @date 2016年2月17日 */@Aspectpublic class MethodInterceptor {	private static Logger logger = LoggerFactory.getLogger(MethodInterceptor.class);	@Autowired	private ApplicationContext applicationContext;	@Pointcut("bean(*Controller)")	public void pointcut1() {	}	@Pointcut("execution(* com.iflashbuy.chat.controller.*Controller.*(..))")	public void pointcut2() {	}	/*	 * @Pointcut("target(org.springframework.web.servlet.ModelAndView)")	 */public void pointcut3() {	}	@Before(value = "pointcut1() && pointcut2()")	public void before(JoinPoint point) {		HttpServletRequest request = ContextThread.getCurrentRequest();		try {			logger.info(point.getSignature() + " called...");			logger.info("request url:\n " + getRequstAddress(request));		} catch (Exception e) {			e.printStackTrace();		}	}	public static String getRequstAddress(HttpServletRequest request) {		String result = "";		String reqMethod = request.getMethod();		if ("POST".equals(reqMethod) || "post".equals(reqMethod)) {			result = request.getRequestURL() + "?" + getAllPostParam(request);		}		if ("GET".equals(reqMethod) || "get".equals(reqMethod)) {			result = request.getQueryString() != null ? request.getRequestURL().append("?")					.append(request.getQueryString()).toString() : request.getRequestURL().toString();		}		return result;	}	public static String getAllPostParam(HttpServletRequest request) {		@SuppressWarnings("unchecked")		Map
postParam = request.getParameterMap(); String queryString = ""; for (String key : postParam.keySet()) { String[] values = postParam.get(key); for (int i = 0; i < values.length; i++) { String value = values[i]; queryString += key + "=" + value + "&"; } } if (StringUtils.isNotEmpty(queryString)) { queryString = queryString.substring(0, queryString.length() - 1); } return queryString; } //打印返回报文 @Around(value = "pointcut1() && pointcut2()") public Object around(ProceedingJoinPoint pjp) throws Throwable { JsonResult jsonResult = null; Object object = pjp.proceed(); if(!(object instanceof ModelAndView) && !(object instanceof String)) { try { logger.info("请求执行完毕,执行结果如下:\n{}", JsonUtil.objectToPrettyJsonStr(object)); } catch (Exception e) { } } return object; } /** * 此切面在有数据源的项目中慎用,防止跟事务的aop冲突 */ @AfterThrowing(pointcut = "pointcut1() && pointcut2()", throwing = "e") public void handleException(JoinPoint jp, Exception e) { JsonResult jsonResult = new JsonResult(Status.BUSY); PrintWriter pw = null; try { pw = ContextThread.getCurrentResponse().getWriter(); ContextThread.getCurrentResponse().setCharacterEncoding("utf-8"); ContextThread.getCurrentResponse().setContentType("application/json;charset=UTF-8"); pw.println(JsonUtil.objectToJsonStr(jsonResult)); } catch (IOException ioException) { logger.error("print response data error:" + ioException); } finally { IOUtils.closeQuietly(pw); } logger.error("aop catch top exception at {}:\n" + e, jp.getSignature()); }}

 

 

spring xml配置

 

注意

如果报

IllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误,spring添加配置,这是因为spring 默认的动态代理是jdk动态代理 ,它必须针对接口不能针对实现

 

如上配置完成后每次执行com.fengshu.gotian.controller 包下的方法都会调用ActionLogger中的log方法.

以上配置,因为某些原因,比如版本或者配置等问题可能会出现不成功,可以使用org.springframework.aop.support.RegexpMethodPointcutAdvisor 作为替代解决方案 。。

 

此外如果是对于controller的拦截,配置应该放到spring*-servlet的配置文件里面 

 

 

 

 

 

 

转载于:https://my.oschina.net/fengshuzi/blog/290252

你可能感兴趣的文章
关于java的跨平台特性
查看>>
之前写了http解析高德地图时,json转对象搞了半天 , 今天同事用GSON把json转对象,一句代码就解决了,代码如下...
查看>>
HDU-1047(DP-二进制状态压缩)
查看>>
Careercup | Chapter 3
查看>>
myeclipse2014如何添加源码反编译工具插件
查看>>
sqlmap的简要使用方法
查看>>
在Lua中使用数字的时候有个坑
查看>>
热血高校
查看>>
六、其他javascript秘籍
查看>>
EXPLAIN说明
查看>>
c语言课程设计
查看>>
vue 父子组件传值以及方法调用,平行组件之间传值以及方法调用大全
查看>>
BZOJ 4820 [SDOI2017] 硬币游戏
查看>>
boost中bind的使用
查看>>
PXC搭建
查看>>
tp 内置压缩文件zip
查看>>
FineUI开源版(ASP.Net)开发实践-目录
查看>>
Coding WebIDE 开放支持第三方 Git 仓库
查看>>
java的数据交互方式
查看>>
关于Python的super用法
查看>>