Spring框架(使用xml配置开发AOP)

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

Spring知识

  一丶SpringIOC初步认识↓↓↓
第一篇---->初识Spring
  二丶SpringIOC深入↓↓↓
第二篇---->深入SpringIoC容器(一)
第三篇---->深入SpringIoC容器(二)
  三丶装配SpringBean↓↓↓
第四篇---->依赖注入的方式
第五篇---->基于xml装配Bean
第六篇---->基于注解装配Bean
第七篇---->Spring Bean之间的关系
第八篇---->SpringBean的作用域
第九篇---->Spring 加载属性(properties)文件
第十篇---->Spring表达式(SpEL)
第十一篇---->Spring在xml中配置组件扫描
  四丶面向切面编程↓↓↓
第十二篇—>认识SpringAOP及底层原理
第十三篇—>使用@AspectJ注解开发AOP
第十四篇—>使用xml配置开发AOP
  五丶Spring中数据库编程↓↓↓
第十五篇—>数据库编程JdbcTemplate
  六丶Spring事务管理↓↓↓
第十六篇—>Spring事务管理初识
第十七篇—>编程式事务和声明式事务
第十八篇—>事务ACID特性
第十九篇—>事务传播行为
第二十篇—>事务隔离级别

6 使用xml配置开发Spring AOP

6.1 简要介绍

  • 除了使用AspectJ注解声明切面,Spring也支持在Spring配置文件中声明切面,这种声明是通过aop命名空间来完成的.
  • 依旧需要明确一点,基于注解的声明要优于基于xml的声明.通过AspectJ注解,切面可以与AspectJ兼容,而基于xml的配置则是Spring专有的.由于AspectJ得到越来越多的AOP框架支持,所以以注解风格编写的切面将会有更多重用的机会.

6.1.2 声明切面

  • 使用xml声明切面,就需要在<beans>根元素中导入aop的命名空间,并且在配置文件中,所有的关于 AOP的配置都必须定义在<aop:config>元素内部,对于每个切面来说,都要创建一个<aop:aspect>元素来为具体的切面实现引用Bean实例.
  • 切面Bean的定义必须有一个标识符(一般为id),供aop:aspect元素引用

6.1.3 声明切入点

  • 在声明切入点的时候要使用<aop:pointcut>元素声明,切入点的定义位置有两种,一个是定义在aop:aspect元素下,或者直接定义在aop:config元素下,二者区别在于,定义在aop:aspect元素下:只对当前切面有效,而定义在aop:config元素下,对所有切面都有效.
  • 基于xml的AOP配置不允许在切入点表达式中用名称引用其他切入点.

6.1.4 声明通知

  • 在AOP命名空间中, 每种通知类型都对应一个特定的 XML 元素.
  • 通知元素需要使用来引用切入点,或者用直接嵌入切入点表达式.method属性指定切面类中通知方法的名称.

6.1.5 声明引入

  • 可以利用aop:declare-parents元素在切面内部声明引入

6.2 案例讲解–搭建基本环境

  • 既然是基于xml进行开发SpringAOP,那么首先需要在代码中的配置文件开启aop的命名空间及引入xsd文件—>如果你不知道怎么写命名空间,这篇文章内容保存一下,随时可以用Spring配置文件命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

</beans>
  • 准备jar包,没有jar包资料的可以去看第一篇里面有链接(使用其他方式例外如Maven),下面五个完全够用
      在这里插入图片描述
  • 此外介绍一下,配置文件用会用到的关于AOP的元素及其用途
      在这里插入图片描述
  • 上一篇已经谈过了基于@AspectJ注解驱动的切面开发,上面的内容看名字其实就已经明白大部分了,记住他们是如何织入到正常流程中即可,后面就看看具体使用了.
  • 下面定义一下要拦截的类和方法,建议使用接口和实现类的方式,有利于实现和定义分离,使系统更加灵活,Spring中对于有接口的真实对象使用JDK动态代理,对于没有接口的使用CGLib动态代理.
      在这里插入图片描述
  • 下面定义一个切面类
      在这里插入图片描述
  • 以上都没有用到任何注解,现在让我们用XML来给SpringIOC容器描述他们

6.3 前置通知,后置通知,返回通知和异常通知

  • 首先回顾一下,在注解开发AOP中用到的通知流程图
      在这里插入图片描述
  • 下面开始将这四种通知在xml中进行配置
      在这里插入图片描述
  • 细心的你可能看到我们使用的切入点表达式在多个通知中的书写是一样的,明显是冗余的,不知你是否能回忆起第十二篇讲说注解开发的时候是如何复用切入点表达式的,在xml中同样有这样的功能,可以使用aop:pointcut标签来设置,如下图,当把aop:pointcut放在某个切面标签内时,它可以作用在该切面内,当把它放在aop:config下时,它可以作用在所有切面上
      在这里插入图片描述
  • 上述的通知方法都会根据约定织入到流程中,也避免了多次书写同一表达式的繁琐.

6.4 环绕通知

  • 由于环绕通知比较强大,而且涉及一些单独知识点,所以单独进行说明
  • 和之前提到的4种通知一样,它也可以织入到约定的流程当中,现在在切面类XmlAspect中加入环绕通知
      在这里插入图片描述
  • ProceedingJoinPoint对象是JoinPoint的子接口,JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象.我们调用它的proceed方法就可以调用被拦截的方法
  • 在配置文件中配置好环绕通知
      在这里插入图片描述
  • 开始测试,创建测试类Test
      在这里插入图片描述
  • 但是需要注意的是有些通知之间执行顺序是不一定的,如下图(有兴趣的同学可以看一下第十二篇,结尾也有注解的执行顺序,和本次xml的顺序是不相同的)
      在这里插入图片描述

6.5 给通知传递参数

  • 回顾一下注解中传递参数的方式
      在这里插入图片描述
  • 在xml中也可以实现该操作,以前置通知为例,首先改写切面类中的before方法
      在这里插入图片描述
  • 在配置文件中修改前置通知相关配置,和前置通知不同的是,使用了and代替&&,因为xml中&&有特殊含义
      在这里插入图片描述
  • 再次运行测试类,查看结果,传递参数方式在其他通知中应用方式相同
      在这里插入图片描述

阶段总结

  • 从12到14篇,分析了SpringAOP的原理,掌握了动态代理和责任链模式在SpringAOP中的应用,通过xml和注解形式配置AOP可以明白我们可以把一些通知织入到约定的流程中.
  • AOP可以将一些公用代码抽取出来,减少开发工作量.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值