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
附件下载。