@before

基础模式,我们先直接看一下就可以了,比较简单,网上一堆。。。

不是我装逼哈,我学了那么久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("------------------------------------------------------------------------");
} }

查看结果:

    @Test
public void testAop2() {
ApplicationContext ctx = this.before(); BeofreTestBean btb = (BeofreTestBean) ctx.getBean("beofreTestBean"); // btb.method1();
btb.method2("测试aop before"); }

结果截图:

@AfterThrowing

这个注解有个独特的属性,那就是throwing

设计一个类,执行一个方法之后,抛出异常

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 AfterThrowingTestBean {
private static final Log logger = LogFactory.getLog(AfterThrowingTestBean.class); public void throwingException() throws Exception {
throw new Exception("测试异常抛出");
} }

设计拦截类

package cn.cutter.start.aop;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; @Component
@Aspect
public class AfterThrowingAspect { private static final Log logger = LogFactory.getLog(AfterThrowingAspect.class); @AfterThrowing(pointcut="execution(* cn.cutter.start.bean.AfterThrowingTestBean.*(..))", throwing="e")
public void testAfterThrowing(Exception e) {
logger.info("testAfterThrowing: " + e.getMessage()); e.printStackTrace(); } }

测试结果:

@Test
public void testAop3() {
ApplicationContext ctx = this.before(); AfterThrowingTestBean att = (AfterThrowingTestBean) ctx.getBean("afterThrowingTestBean"); try {
att.throwingException();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("抛出异常捕获");
} }

结果:

【sping揭秘】14、@before @AfterThrowing的更多相关文章

  1. 【sping揭秘】13、Spring AOP一世&二世

    Spring AOP一世 Spring AOP中的advice Before advice 这个就是在方法执行之前执行,也就是在对应的joinpoint之前 spring AOP二世 开启aspect ...

  2. 【sping揭秘】25、Spring远程方案

    分化:RMI,EJB,Hessian Spring有 Rmi,http,hessian,burlap 基于rmi的remoting方案 RMI要求远程类对象包路径和本地一致 基于HTTP的轻量级rem ...

  3. 【sping揭秘】24、Spring框架对JMS的集成(无环境版,以后学MQ的时候再隆重介绍)& 任务调度和线程池

    这个我也不是很了解,那么这个需要好好学习一下了 JMS有2种消息域类型 1. point to point 点对点模式 2.发布订阅模式  publish/subscribe Pub/Sub 模式 传 ...

  4. 【sping揭秘】23、Spring框架内的JNDI支持

    JndiTemplate 经过jdbctemplate,transactionTemplate...的洗礼,想必大家看到template就知道是个什么尿性了吧 一样的,我们只需要调用jnditempl ...

  5. 【sping揭秘】22、事务管理

    有关事务的楔子 什么是事务??? 事务就是以可控的方式对数据资源进行访问的一组操作. 事务本身持有四个限定属性 原子性,一致性,隔离性,持久性 事务家族 Resource Manager  RM,负责 ...

  6. 【sping揭秘】21、Spring动态数据源的切换

    对于多个数据源的时候,我们如何切换不同的数据源进行数据库的操作呢? 当然我们可以直接定义2个DataSource,然后在每次获取connection的时候,从不同的DataSource中获取conne ...

  7. 【sping揭秘】20、spring的orm

    面向对象的操作方式,spring统一定义在org.springframework.jdbc.object以RdbmsOperation作为顶层抽象定义 Spring对各种ORM的集成 Spring的集 ...

  8. 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

    我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...

  9. 【sping揭秘】18、使用spring访问数据

    统一的数据访问异常层次体系 基于基本的jdbc封装dao层访问接口,封装不论是访问,csv文件,关系数据库(RDBMS),ladp都可以封装成一个个DAO对象来进行访问 抛出问题 可是对于我们忽略了一 ...

随机推荐

  1. python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别

    三者联系 迭代器(iterator)是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和__iter__方法返回自己本身,即为迭代器 通常生成器是通过调用一个或多个yi ...

  2. C#使用 params object[] 将参数个数不一样的方法 集成一个

    getChange("1"); getChange("1","2"); public string getChange(params obj ...

  3. xcode项目打不开:incompatible project version问题

    低版本xcode打开高版本xcode项目或库工程的时候就会出现,打不开的问题 解决 1可以重建创建工程,将文件拷贝到新工程 2 相对一,较简单 找到.xcodeproj文件 右键 显示包内容,找到pr ...

  4. tiny4412 --uboot移植(2) 点灯

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  5. Tomcat9报错 The valid characters are defined in RFC 7230 and RFC 3986

    tomcat8项目移到tomcat9,出现如下问题 HTTP Status 400 – Bad Request Type Exception Report Message Invalid charac ...

  6. centos 7 安装pip

    1.首先检查centos 有没有安装python-pip 包, >>yum install python-pipnotice:NO package python-pip available ...

  7. c# sshnet控制linux 使用unzip的一些问题

    无法使用unzip 解压缩 linux文件夹下的zip文件 于是想在win下生成一个 shell 文件传到linux 下运行,结果这个sh文件在linux  运行时出错,同样的文件在linux下生成就 ...

  8. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...

  9. maven 项目中没有src/test/java文件夹

    项目右键->buildPath configure Build Path->点击选项卡Libraries->选中JRE System Library->点击edit->选 ...

  10. Android工具

    2018-09-27 安卓签名工具 AndroidKiller 比如包打好了,想替换一个图片,就用zip打开,替换图片,重新签名.