根本模式,我们先直接看一下就可以了,对照简单,网上一堆。。。
不是我装逼哈,我学了那么久spring,aop的皮毛也就是网上的那些blog内容,稍微高级点的我也不会,这里跳过根本部分
不过有一点很重要,必需了解一波:
1、 测试被拦截的要领里面挪用另一个同类被拦截要领
注意了:这个就只会被拦截一次,并不会拦截要领里面再次挪用的阿谁要领,固然你直接在外围挪用一次另一个要领,还是会被拦截
2、 测试被拦截的要领里面挪用另一个差别类被拦截要领
注意了:这个就会被拦截两次,你挪用的这个要领会被拦截一次,你挪用的这个要领里面挪用的阿谁要领,还会被拦截一次
这两问有个大前提,所有提及的要领都是被拦截东西,也就是说切入点包罗以上使用到的要领
OK,讲完上面,好,重点这就来了,
我们想要知道被拦截的要领的参数是个什么情况,我们要怎么措置惩罚惩罚呢?这里提出问题,我们着手解决一下这个问题
这里我们介绍一下joinpoint和args,前者可以通过getArgs要领获取参数,,还有其他的一堆其他要领使用。后者是作为注解里面的一个标识表记标帜符,可以直接声明相应的参数
我们成立一个bean
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Component; @Component public class BeofreTestBean { private static final Log logger = LogFactory.getLog(BeofreTestBean.class); public void method1() { logger.info("这里是要领 method1"); } public void method2(String param1) { logger.info("这里是要领 method2 参数值是:param1-" + param1); } }
创建拦截类,对这个bean进行拦截
package cn.cutter.start.aop; import java.lang.reflect.Modifier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class BeforeAspect { private static final Log logger = LogFactory.getLog(BeforeAspect.class); @Pointcut("execution(* cn.cutter.start.bean.BeofreTestBean.*(..))") private void beforePointCut() {} /** * 直接前置拦截 */ @Before("beforePointCut()") public void beforeOpertatorNoArg() { logger.info("前置拦截不带参数 beforeOpertatorNoArg"); } @Before("beforePointCut()") public void beforeOpertatorWithJoinPoint(JoinPoint joinPoint) { logger.info("前置拦截带参数 beforeOpertatorWithJoinPoint"); logger.info("方针要领名为:" + joinPoint.getSignature().getName()); logger.info("方针要领所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName()); logger.info("方针要领所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName()); logger.info("方针要领声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers())); //获取传入方针要领的参数 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { logger.info("第" + (i+1) + "个参数为:" + args[i]); } logger.info("被代办代理的东西:" + joinPoint.getTarget()); logger.info("代办代理东西本身:" + joinPoint.getThis()); } @Before("beforePointCut() && args(param1)") public void beforeOpertatorWithArg(String param1) { logger.info("前置拦截带参数 beforeOpertatorWithArg 参数是param1:" + param1); } @Before("beforePointCut() && args(param1)") public void beforeOpertatorWithArgAndJoinPoint(JoinPoint joinPoint, String param1) { logger.info("------------------------------------------------------------------------"); logger.info("前置拦截带参数 beforeOpertatorWithArgAndJoinPoint 参数是param1:" + param1); logger.info("方针要领名为:" + joinPoint.getSignature().getName()); logger.info("方针要领所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName()); logger.info("方针要领所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName()); logger.info("方针要领声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers())); //获取传入方针要领的参数 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { logger.info("第" + (i+1) + "个参数为:" + args[i]); } logger.info("被代办代理的东西:" + joinPoint.getTarget()); logger.info("代办代理东西本身:" + joinPoint.getThis()); logger.info("------------------------------------------------------------------------"); } }
检察功效: