springAOP中的各种通知

2024-08-26 15:18
文章标签 通知 springaop

本文主要是介绍springAOP中的各种通知,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


  在上一篇博客中我们介绍了AOP的一些基本概念,并且在博客中的Demo我们没有使用配置文件的形式来实现,在博客的结尾我们我们也抛出了那样写的问题,在这篇博客中我们就用配置文件的方式来来介绍AOP中的五大通知。

 前置通知(before):在目标方法执行之前执行

 后置通知(after):在目标方执行完成后执行,如果目标方法异常,则后置通知不再执行

 异常通知(After-throwing):目标方法抛出异常的时候执行  

 最终通知(finally);不管目标方法是否有异常都会执行,相当于try。。catch。。finally中的finally

 环绕通知(round):可以控制目标方法是否执行

 下面就通过一个栗子来总结一下这几个通知应该如何使用.

           

  上面截图就是demo的基本目录结构,先来说一下jar包,其中aspectjrt.jar和aspectjweaver.jar是springAOP配置文件形式所需要的jar包,其实这和springAOP的由来有联系,因为AOP的思想最原始就是aspect技术,只不过当时开发人员不知道这个技术干什么用,导致该项技术没有什么用武之地,但是到后来spring的作者意识到这种思想的优势的使用,加以整合提出aop的思想,使这项技术到达了巅峰。cglib是代理对象形成的另一种形式。

  和上一篇博客对比我们可以发现,我们不需要自己写拦截器,而是在配置文件中实现。

  首先来看一下配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><!-- 导入目标类导入切面进行aop的配置-->        <bean id="personDao" class="com.itheima11.spring.aop.xml.transaction.PersonDaoImpl"></bean><bean id="transaction" class="com.itheima11.spring.aop.xml.transaction.Transaction"></bean><aop:config><!-- 切入点表达式符合切入点表达式的类要产生代理对象expression就是切入点表达式id 标示符--><aop:pointcut expression="execution(* com.itheima11.spring.aop.xml.transaction.PersonDaoImpl.*(..))" id="perform"/><aop:aspect ref="transaction"><!-- 前置通知1、在目标方法执行之前2、前置通知中,方法有一个参数JoinPoint--><aop:before method="beginTransaction" pointcut-ref="perform"/><!-- 后置通知1、在目标方法执行之后2、能够获取目标方法的返回值returning="val" val就是通知方法中 后置通知中的参数名称3、如果目标方法产生异常,则后置通知不再执行--><aop:after-returning method="commit" pointcut-ref="perform" returning="val"/><!-- 异常通知获取目标方法抛出的异常信息throwing="ex"--><aop:after-throwing method="throwingMethod" pointcut-ref="perform" throwing="ex"/><!-- 最终通知--><aop:after method="finallyMethod" pointcut-ref="perform"/><!-- 环绕通知能够控制目标方法的执行环绕通知可以有返回值,这个返回值就是代理对象的方法的返回值前置通知和后置通知只能在目标方法执行之前和之后加代码,但是不能控制目标方法的执行--><aop:around method="aroundMethod" pointcut-ref="perform"/></aop:aspect></aop:config>
</beans>

  核心类切面代码:

package com.itheima11.spring.aop.xml.transaction;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;public class Transaction {/*** 前置通知 参数:JoinPoint 连接点:客户端调用哪个方法,这个方法就是连接点*/public void beginTransaction(JoinPoint joinPoint) {System.out.println("目标类:" + joinPoint.getTarget().getClass());System.out.println("目标方法的名称:" + joinPoint.getSignature().getName());System.out.println("目标方法的参数:" + joinPoint.getArgs().length);System.out.println("begin transaction");}/*** 后置通知 val接收目标类的目标方法的返回值*/public void commit(JoinPoint joinPoint, Object val) {System.out.println("返回值:" + val);System.out.println("commit");}/*** 异常通知 不管是否目标方法是否抛出异常,都会执行这个方法,相当于finally*/public void throwingMethod(JoinPoint joinPoint, Throwable ex) {System.out.println(ex.getMessage());}/*** 最终通知*/public void finallyMethod() {System.out.println("finally method");}/*** 环绕通知 可以控制目标方法的是否执行*/public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("around method");return joinPoint.proceed();// 执行目标方法,如果不写行代码 则目标方法不会执行}
}
  客户端代码

package com.itheima11.spring.aop.xml.transaction;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** aop的原理*     1、启动spring容器*     2、spring容器会为personDao和transaction实例化*     3、spring容器解析aop:config的配置*         当spring容器解析到切入点表达式的时候,就会把切入点表达式解析出来*            会让切入点表达式的类和spring容器中的类进行匹配*               如果匹配成功,则会为该对象创建代理对象*                  代理对象的方法形成=通知+目标方法*               如果匹配不成功,则会报错*     4、在客户端context.getBean时,如果当前的对象有代理对象,则返回代理对象*              如果没有代理对象返回对象的本身*     5、在spring内部会检查目标类有没有实现接口*           如果目标类实现了接口,则采用jdkproxy产生代理对象*           如果目标类没有实现接口,则采用cglibproxy产生代理对象* @author zd**/
public class PersonDaoTest {@Testpublic void testSpring(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");PersonDao personDao = (PersonDao)context.getBean("personDao");String s = personDao.savePerson();System.out.println(s);}
}
  结果:

  

  小编在都将重要的注释写在代码中,请读者自行体会。上面这个demo就是对于springAOP中常用的几个通知的实现,在实际的场景我们需要不同的需求来运用不同的通知来实现。

  当我们对这个模式比较熟悉以后,里面比较重要是我们切入点表达式的编写,我们不在用原先的if。。else。。来实现,我们根据需求编写表达式实现。所以我们需要熟悉表达式的编写。

  在下面的博客中将会利用这些基本知识,实现具体的业务需求。


  

   

这篇关于springAOP中的各种通知的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108927

相关文章

springAOP 和 aspectJ 有什么区别

介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容?我在哪实现AOP?集成到我的应用是否很快?性能开销是多少? 本文中,我们将会着重回答这些问题,并介绍两款Java最流行的AOP框架:Spring AOP 和 AspectJ。 AOP概念 在我们开始之前,让我们对术语和核心概念做一个快速,高水平的回顾: Aspect切面:一个分布在应用程序中多个位置

AOP之执行前通知@Before

Spring AOP之执行前通知@Before 此文章说一下执行前通知,即注解@Before。 作用 多用于日志记录、权限校验、初始化资源等。 触发时间 目标函数执行触发。 定义 public class AopBeforeAspect {@Before("execution(public * com.example.demo.service.impl.AccountServiceI

安卓8.0通知栏适配

一、谷歌为什么在安卓8.0对通知栏进行修改         系统通知栏作为除桌面启动图标之外的唯一入口,对app的日活起到非常重要的作用,因此各个app开发商都希望能抢占用户的通知栏。随着移动端的普及和安卓手机存储容量的扩大,用户手机能安装的app数量越来越多,一台手机安装几十到上百个app已经不足为奇,各个app都极尽可能的抢占通知栏,而安卓系统本身又没有一种规范来约束app开发商的这种行为,

ubuntu —— 命令行执行完毕通知(undistract-me)

当我们在命令行下:   (1)git clone 一个项目时(2)sudo apt-get install 时(3)sudo make 时。。。 往往要经历比较长的时间等待,一方面我们不能盲等,时间白白流失,我们需要转而去做其他事情,另一方面,我们有不确定方才的任务是否执行完毕,我们会时不时的去查看下该命令是否执行完毕了(类似计算机中的轮循机制),这样效率比较低,饱受 distract(分心

Notification PendingIntent失效,每个通知都响应第一个PendingIntent

1、bug描述 可生成多个通知,但通知生成后,点击均响应第一个通知对应的PendingIntent。 但之前是可以正常使用的。 2、可能原因 期间,对AndroidStudio进行升级到3.2.1,buildToolsVersion更新到28.0.3。 并没有其他的额外涉及通知的操作,所以可能的原因是build更新,使得PendingIntent.getActivity的第2个和第4个参数重新起作

app版本更新,通知形式显示安装包下载进度

也是公司的项目需要,就稍微研究了下,参考网上一些不错的思路,但其适用版本都比较早,所以通知做了适配了Android 8.0,及权限问题等问题。 原理;下载apk过程中,发起一个通知,并不断发起最新进度的相同ID的通知,覆盖上一个通知,达到显示当前下载进度的效果。 demo已上传:https://download.csdn.net/download/u013370255/10603681 下面

通知Notification(可展开的大布局)使用,适配android8.0

补充修正: 2018-11-07 问题:Notification PendingIntent失效,每个通知都响应第一个PendingIntent https://blog.csdn.net/u013370255/article/details/83791750 2018-08-16 问题:app版本更新,通知形式显示安装包下载进度 https://blog.csdn.net/u01337025

springAOP 学习

maven引入 <properties><org.springframework.version>4.3.7.RELEASE</org.springframework.version></properties> <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifact

SpringAOP与Redis搭建缓存

http://toutiao.com/a6329614943227412737/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=5367969992&utm_medium=toutiao_ios