15.Spring基于xml的AOP

参考的学习视频→https://b23.tv/av47952931/p82

-pom文件新增的依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.7</version>
</dependency>

-bean.xml文件需要加入AOP约束

<?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.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
    
</beans>


-spring中基于xml的aop配置步骤-

  1. 把通知Bean交给spring来管理
  2. 使用aop:config标签表明开始AOP的配置
  3. 使用aop:aspect标签标明配置切面       id   给切面提供的唯一标识        ref   指定通知类Bean的Id
  4. 在aop:aspect标签的内部使用对应标签来配置通知的类型

aop:before   前置通知
aop:after-returning   后置通知
aop:after-throwing   异常通知
aop:after   最终通知
aop:around   环绕通知

  • method属性:指定将哪个方法作为该类通知(适用于以上五种)
  • pointcut属性:用于指定切入点表达式,表示对业务中哪些方法增强
  • pointcut-ref属性:使用aop:pointcut标签配置的切入点表达式

aop:pointcut 配置切入点表达式

  • id属性:用于指定表达式唯一标识 
  • expression属性:用于指定表达式内容

(此标签写在aop:aspect内部,只能供当前切面使用,写在aop:aspect标签外部则所有切面可用,但必须定义在使用之前)

 

★切入点表达式写法

  • 关键字:execution(表达式)
  • 表达式:访问修饰符   返回值     包名.包名.包名...类名.方法名(参数列表)
  1. 访问修饰符可省略 eg:void com.example.service.impl.AccountServiceImpl.saveAccount()
  2. 返回值可以使用通配值,表示任意返回值 eg:* com.example.service.impl.AccountServiceImpl.saveAccount()
  3. 包名可以使用通配符表示任意包,但是有几级包就要写几个星号  eg:* *.*.*.*.AccountServiceImpl.saveAccount()
  4. 包名可以使用..表示当前包及其子包 eg:* *..AccountServiceImpl.saveAccount()
  5. 类名和方法名都可以使用星号来实现通配 eg:* *..*.saveAccount()  | * *..*.*()
  6. 参数列表可以直接写数据类型(基本类型写名称,引用类型写包名.类名) eg:* *..*.*(java.lang.String)  |  * *..*.*(int)
  7. 可以使用星号表示任意类型,但必须有参数 eg:* *..*.*(*)
  8. 可以用..表示有无参数均可,有参数可以是任意类型  eg:* *..*.*(..)
  • 标准表达式的写法:public void com.example.service.impl.AccountServiceImpl.saveAccount()
  • 全通配写法:* *..*.*(..)
  • 实际开发中切入点表达式的通常写法:切到业务层实现类下的所有方法 * com.example.service.impl.*.*(..)

 

★关于环绕通知

->spring框架为我们提供的一种在代码中手动控制增强方法何时执行的方式

  • 问题:如果仅按照其他四类通知的方式配置环绕通知,则会出现切入点方法没有执行,而通知方法执行了的情况
  • 分析:通过对比动态代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而我们的代码中没有
  • 决:Spring框架为我们提供了一个接口:ProceedingJoinPoint,该接口有一个方法proceed(),相当于明确调用切入点方法 。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用

*环绕通知正确使用方式↓

-示例-

新建maven工程,配置pom文件
 
 
定义业务层接口
 
 
定义业务层接口实现类
 
然后我们定义了一个日志工具类,希望能够在每个切入点方法执行之前都能够先执行日志打印的方法
 
 
对xml文件进行如下配置:
 
 
写测试类来测试
 
 
运行结果
 
 
如果使用全通配写法,就对所有方法有效了~
 
 
配置完所有通知的最终代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值