【sping揭秘】14、@before @AfterThrowing
@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的更多相关文章
- 【sping揭秘】13、Spring AOP一世&二世
Spring AOP一世 Spring AOP中的advice Before advice 这个就是在方法执行之前执行,也就是在对应的joinpoint之前 spring AOP二世 开启aspect ...
- 【sping揭秘】25、Spring远程方案
分化:RMI,EJB,Hessian Spring有 Rmi,http,hessian,burlap 基于rmi的remoting方案 RMI要求远程类对象包路径和本地一致 基于HTTP的轻量级rem ...
- 【sping揭秘】24、Spring框架对JMS的集成(无环境版,以后学MQ的时候再隆重介绍)& 任务调度和线程池
这个我也不是很了解,那么这个需要好好学习一下了 JMS有2种消息域类型 1. point to point 点对点模式 2.发布订阅模式 publish/subscribe Pub/Sub 模式 传 ...
- 【sping揭秘】23、Spring框架内的JNDI支持
JndiTemplate 经过jdbctemplate,transactionTemplate...的洗礼,想必大家看到template就知道是个什么尿性了吧 一样的,我们只需要调用jnditempl ...
- 【sping揭秘】22、事务管理
有关事务的楔子 什么是事务??? 事务就是以可控的方式对数据资源进行访问的一组操作. 事务本身持有四个限定属性 原子性,一致性,隔离性,持久性 事务家族 Resource Manager RM,负责 ...
- 【sping揭秘】21、Spring动态数据源的切换
对于多个数据源的时候,我们如何切换不同的数据源进行数据库的操作呢? 当然我们可以直接定义2个DataSource,然后在每次获取connection的时候,从不同的DataSource中获取conne ...
- 【sping揭秘】20、spring的orm
面向对象的操作方式,spring统一定义在org.springframework.jdbc.object以RdbmsOperation作为顶层抽象定义 Spring对各种ORM的集成 Spring的集 ...
- 【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢
我们这是可以正好借助之前学的factorybean类,自己吧jdbctemplate加载到spring容器中,我们可以封装多个这种对象,那么可以实现针对不同的数据库的jdbctemplate 首先我们 ...
- 【sping揭秘】18、使用spring访问数据
统一的数据访问异常层次体系 基于基本的jdbc封装dao层访问接口,封装不论是访问,csv文件,关系数据库(RDBMS),ladp都可以封装成一个个DAO对象来进行访问 抛出问题 可是对于我们忽略了一 ...
随机推荐
- 在windows下安装Git并用GitHub同步
准备环境: 1,注册github账户 2,下载安装git(下载地址:https://git-scm.com/download/win) 注释: git是什么? git是版本管理工具,当然也是分布式的管 ...
- iOS的SVN
1.cornerstone 2.smart svn mac (比较好用) 3.还xcode自带的.
- C# dns.gethostentry()获取失败,提示不存在主机
传入参数domain有误. 如果是域名,可以解析.如果是局域ip可以解析. 如果是外网,解析不成功. 解决方法: 判断传入参数是域名还是ip,如果是域名,则使用dns.gethostentry(dom ...
- Linux基础知识回顾及BASH学习
2019-2020-030189224 <网络攻防技术与实践>第一周学习总结 Linux基础知识错题回顾 1.Linux中使用(B)命令新建空白文件. A .mkdir B .touch ...
- java命令分析线程死锁以及内存泄漏
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- hdpi对应分辨率
ldpi QVGA (240×320) mdpi HVGA (320×480) hdpi WVGA (480×800),FWVGA (480×854) xhdpi 720P(1280*720) ...
- CentOS7 安装oracle客户端
1.本机环境CentOS7 64 [root@localhost etc]# uname -a Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 ...
- 简述Python入门小知识
如今的Python开发工程师很受企业和朋友们的青睐,现在学习Python开发的小伙伴也很多,本篇文章就和大家探讨一下Python入门小知识都有哪些. 扣丁学堂简述Python入门小知识Python培训 ...
- dpkg: error: dpkg status database is locked by another process
First run: lsof /var/lib/dpkg/lock Then make sure that process isn't running: ps cax | grep PID If i ...
- 在centos7上使用最简单的方法把php脚本做成服务,随开机启动运行
1.准备文件:coffeetest.service # copy to /usr/lib/systemd/system # systemctl enable coffeetest.service [U ...