日期:2014-05-17  浏览次数:20822 次

Spring3 aop aspectj 打印日志

applicationContext-aspectj.xml? 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"
       default-lazy-init="true">

<aop:aspectj-autoproxy/>
</beans>

?

在applicationContext.xml?中加载? applicationContext-aspectj.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
	default-lazy-init="true">
	<import resource="spring/applicationContext-aspectj.xml" />	
</beans>

?

?

java代码

package com.aspectj.aop;
import java.lang.reflect.Method;
import java.util.List;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect  
@Component 
public class LogInteceptor {
//	private Logger logger = Logger.getLogger(getClass());
	private Logger logger = LoggerFactory.getLogger(LogInteceptor.class);
	
        /**
         * 拦截类的入口
         */
	@Pointcut("execution(* com.content.service.*.*(..))")
	public void pointCut() {
//		logger.info("ponit....");
	}
	
	@Before("pointCut()")
	public void before() {
//		logger.info("被拦截方法调用之前调用此方法,输出此语句");
	}

	@After("pointCut()")
	public void after() {
//		logger.info("被拦截方法调用之后调用此方法,输出此语句");
	}
	
	@SuppressWarnings("rawtypes")
	@Around("pointCut()")
	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
		String className = pjp.getTarget().getClass().getName(); //拦截类
		String methodName = pjp.getSignature().getName() + "()";
		Object[] paramValues = pjp.getArgs(); //拦截类的入参数

		MethodSignature joinPointObject = (MethodSignature) pjp.getSignature();
		Method method = joinPointObject.getMethod();
		Class[] classTypes = method.getParameterTypes();
		if (logger.isDebugEnabled()) {
			logger.debug("invoke class name: {}, invoke method name: {}, parameter type: {}, parameter value: {}", new Object[] { className, methodName,
					classTypes, paramValues });
		}

		Object obj = pjp.proceed();// 此处返回的是拦截的方法的返回值,如果不执行此方法,则不会执行被拦截的方法,利用环绕通知可以很好的做权限管理
		Object logObj = obj;
		if (obj != null) {
			if (obj instanceof List && ((List) obj).size() > 10) {
				logObj = ((List) obj).size();
			}
		}
		if (logger.isDebugEnabled()) {
			logger.debug("invoke class name: {}, invoke method name: {}, return type: