【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对象来进行访问 抛出问题 可是对于我们忽略了一 ...
随机推荐
- jq修改导航栏样式(选中、使用两张图片替代的是否选中效果)
<footer class="toolbar"> <ul> <li> <a href="{:url('Index/home')} ...
- 220. Contains Duplicate III 数组指针差k数值差t
[抄题]: Given an array of integers, find out whether there are two distinct indices i and j in the arr ...
- PHP 实现单链表
数据结构是计算机存储.组织数据的方式,结构不同那么数据的检索方式和效率都不一样, 常用的数据结构有 数组 .栈 .队列 .链表 .树.堆 今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表 ...
- 查看sql 语句io执行情况
set statistics io,time on 表 'xx'.扫描计数 1,逻辑读取 19 次,物理读取 0 次,预读 0 次,lob 逻辑读取 76 次,lob 物理读取 0 次,lob 预读 ...
- MySQL数据查询之多表查询
多表查询 多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dna ...
- Linux 给文件夹或者文件增加权限
chmod -R 777 文件夹参数-R是递归的意思777表示开放所有权限 chmod 777 test.sh chmod +x 某文件 如果给所有人添加可执行权限:chmod a+x 文件名:如果给 ...
- ef core中使用code first
这个配置还是挺坑,照这个一步步做倒是可以 https://www.cnblogs.com/chenzhaoyu/p/7831980.html
- ABP 异常处理 第四篇
1.ABP异常处理机制是通过过滤器实现的,我们查看的webAPI的异常处理,我们来看看他的源码,AbpApiExceptionFilterAttribute 继承ExceptionFilterAttr ...
- 为docker配置HTTP代理服务器
背景: node1不能访问外网, node2可以访问外网,node1通过node2的代理服务来访问外网. 1. node1不能访问外网 vim /etc/resolv.conf 注释掉DNS配置文件 ...
- SpringBoot编写自定义Starter
根据SpringBoot的Starter编写规则,需要编写xxxStarter依赖xxxAutoConfigurer,xxxStarter是一个空的jar,仅提供辅助性的依赖管理,引入其他类库 1.建 ...