Spring注解Aop简单使用

Spring注解Aop简单使用

结构:


相关代码配置:

Anno.java

package com.nassir.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解
 * 
 * @author nassir wen
 */

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface Anno {
    
    String isAop() default "Y";
}
 

Aop.java

package com.nassir.aop;

import java.lang.reflect.Method;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

/**
 * AOP
 * @author nassir wen
 */
@Aspect
@Component
public class Aop
{
    private final static Log logger = LogFactory.getLog(Aop.class);
    
    /**
     * 定义一个切入点,在方法含@Anno注解位置切入
     */
    @Pointcut("@annotation(com.nassir.aop.Anno)")
    public void aopPoint()
    {
    }

    /**
     * @param jp
     * @return
     */
    @Around("aopPoint()")
    public Object execAop(ProceedingJoinPoint jp) throws Throwable
    {
        long start = System.currentTimeMillis();
        
        Method method = getMethod(jp);
        Anno anno = method.getAnnotation(Anno.class);
        
        String methodName = method.getName();
        
        String aop = anno.isAop();
        
        Object retVal = null;
        if (logger.isInfoEnabled()) {
            logger.info("begin exec fun ######: " +  methodName);
        }
        if (StringUtils.equalsIgnoreCase(aop,"Y"))
        {
            retVal = jp.proceed();
        }else {
            //如果注解aop不为"Y/y"返回err
            retVal = "err";
        }
        if (logger.isInfoEnabled()) {
            logger.info("end exec fun ######: " +  methodName);
        }
        
        if (logger.isInfoEnabled()) {
            logger.info("spend time : " + (System.currentTimeMillis()-start) + "ms");
        }
        return retVal;
    }

    private Method getMethod(JoinPoint jp) throws NoSuchMethodException
    {
        Signature sig = jp.getSignature();
        MethodSignature msig = (MethodSignature) sig;
        return getClass(jp).getMethod(msig.getName(),
                msig.getParameterTypes());
    }
    
    private Class<? extends Object> getClass(JoinPoint jp) throws NoSuchMethodException{
        return jp.getTarget().getClass();
    }
}
 

AopTarget.java

package com.nassir.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

import com.nassir.aop.Anno;

/**
 * @author nassir wen
 * @data 2012-3-13 下午12:53:13
 */
@Component
public class AopTarget {
    private final static Log logger = LogFactory.getLog(AopTarget.class);
    
    @Anno(isAop = "y")
    public String exec() {
        logger.info("exec...");
        return "suc";
    }
}
 

applicationContext.xml

<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
	<context:annotation-config/>
	
	<!-- aop动态代理 -->
	<aop:aspectj-autoproxy/>
	 
	<!-- 扫描注解对象 -->
	<context:component-scan base-package="com.nassir" />
 

main.java:

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext beanApp = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        AopTarget aopTarget = (AopTarget) beanApp.getBean("aopTarget");
        System.out.println("result: ######: " + aopTarget.exec());
    }
}

测试:

 @Anno(isAop = "y")

  public String exec() 

结果:

2012-03-13 14:01:59 [INFO] [Aop.java->execAop(53)] begin exec fun ######: exec
2012-03-13 14:01:59 [INFO] [AopTarget.java->exec(22)] exec...
2012-03-13 14:01:59 [INFO] [Aop.java->execAop(63)] end exec fun ######: exec
2012-03-13 14:01:59 [INFO] [Aop.java->execAop(67)] spend time : 16ms
result: ######: suc
 

@Anno(isAop = "n")

  public String exec() 

2012-03-13 13:58:05 [INFO] [Aop.java->execAop(53)] begin exec fun ######: exec
2012-03-13 13:58:05 [INFO] [Aop.java->execAop(63)] end exec fun ######: exec
2012-03-13 13:58:05 [INFO] [Aop.java->execAop(67)] spend time : 0ms
result: ######: err
 

附件下载。

猜你喜欢

转载自nassir.iteye.com/blog/1452261