详述Spring AOP @Before,@After,@AfterReturning、@AfterThrowing和@Around
一、AOP的作用
当多个方法中出现重复的代码时,一般会将其提取为新的方法,然后通过调用这个新的方法以此简化代码
而spring aop就是专门做这样的工作的
二、怎么使用AOP
1、创建项目
我们可以创建一个AOP类,并添加@Aspect注解,在此之前需要引包aspectjweaver-1.8.10.jar;在app.xml文件的Namespaces中勾选aop,配置aop:aspectj-autoproxy标签,作用是自动对应到有@Aspect注解所标识的类。
举个例子,创建一个javaweb项目,项目结构如下
在IoC容器创建的同时,ComputerAOP对象和ComputerService对象也随之初始化,aop:aspectj-autoproxy查找到ComputerAOP类创建代理类和代理对象,@Before中的语句可以自动为该类下所有返回值类型为public int的方法提供代理,我们打印出此时掌管该类的类名发现是代理类
若将注解注释掉,打印结果为本类名,说明这些方法没有被代理
2、观察@Before、@After、@AfterReturning、@AfterThrowing的应用场合
结果为
说明@Before对应于方法开始执行之前;@After对应于方法结束;@AfterThrowing对应于抛出异常后;@AfterReturning在出现异常时不执行。
将被除数改为1,运行结果如下
结论:@AfterReturning是在返回成功时调用;@After是在方法结束之后、执行return之前调用
3、@Around:可以代替前四种
并且ProceedingJoinPoint对象可以调用getTarget()方法,获得被代理的对象
执行结果
pjp对象还可以调用proceed()来调用原方法,如下图
做而论道_CS: 计算机中,只有二进制数(0 和 1)。 根本就没有小数点(.)。 而且,CPU 进行计算时,数据,只有一个符号位。 双符号位,就是没影的事。 即使是唐所费自己制作一个 CPU,他也不会弄成两个符号位。 因为,一个符号位,就可以解决所有的问题。 多弄一个无用的,干嘛呢?
做而论道_CS: 事实上,不仅你写的有错。 就是计算机教材(比如唐所费的)里面,也是写的不伦不类。 正常人学计算机,都感觉很难。 因为这些专家、老师,他自己都不知道讲的是什么。
做而论道_CS: 你的图片中有:x = 0.101001,y = 0.111。 这里的 x、y,是什么东西? 它们,应该都是数字,应该写正负号(+-)。 正确的写法是: x = +101001,y = +111。 然后,再写一个:-y = -111。 写完这些,再求它们的原码或补码: [x]补 = 0.101001, [y]补 = 。。。, [-y]补 = 。。。
做而论道_CS: 请教一个简单的: 十进制: 14 / 4 = 3 ... 2。 用四位二进制,应该怎么算呢? 又比如:-14 / 4 =-3 ... -2。 又应该怎么算?
kate0000000: 如果X,Y符号不同,那余数怎么看?还是先当做符号相同的算出余数,商,最后看符号