在开始使用Spring的AOP之前我们需要在bean.xml中引入aop约束,并在pom.xml导入依赖

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--........-->
</beans>
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.7</version></dependency>
</dependencies>

一、编写公共代码制作成通知

package com.itheima.utils/*** 用于记录日志的工具类,它里面提供了公共的代码*/
public class Logger {/*** 用于打印日志:计划让其在切入点方法执行之前执行(切入点方法就是业务层方法)*/public void printLog(){System.out.println("Logger类中的pringLog方法开始记录日志了。。。");}
}

二、编写配置文件

1.把通知类用bean标签配置起来

<!-- 配置Logger类 -->
<bean id="logger" class="com.itheima.utils.Logger"></bean>

2.使用aop:config申明aop配置

<!--配置AOP-->
<aop:config><!--配置代码-->
</aop:config>

3.使用aop:aspect配置切面

 <!--配置AOP--><aop:config><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><!--配置通知类型--></aop:aspect></aop:config>

4.使用aop:pointcut配置切入点(要增强的方法)表达式

<!--配置AOP-->
<aop:config><aop:pointcut pointcut="execution(* com.itheima.service.impl.*.*(..))" id="pt1"><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><!--配置通知类型--></aop:aspect>
</aop:config>

切入点表达式的写法:
关键字:execution(表达式)
表达式:访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)

标准的表达式写法:public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
访问修饰符可以省略:void com.itheima.service.impl.AccountServiceImpl.saveAccount()

返回值可以使用通配符,表示任意返回值
* com.itheima.service.impl.AccountServiceImpl.saveAccount()

包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*.
* *.*.*.*.AccountServiceImpl.saveAccount())

包名可以使用…表示当前包及其子包
* *…AccountServiceImpl.saveAccount()

类名和方法名都可以使用*来实现通配
* *…*.*()

参数列表:

  • 可以直接写数据类型:

    • 基本类型直接写名称:int
    • 引用类型写包名.类名的方式:java.lang.String
  • 可以使用通配符*表示任意类型,但是必须有参数
  • 可以使用…表示有无参数均可,有参数可以是任意类型
  • 全通配写法:
    * *…*.*(…)

实际开发中切入点表达式的通常写法:
切到业务层实现类下的所有方法:* com.itheima.service.impl.*.*(…)

5.使用aop:xxx配置对应的通知类型

<!--配置AOP-->
<aop:config><!--务必写在配置切面之前,这是spring规定好的--><aop:pointcut expression="execution(* com.itheima.service.impl.*.*(..))" id="pt1"></aop:pointcut><!--配置切面 --><aop:aspect id="logAdvice" ref="logger">  <aop:before method="printLog" pointcut-ref="pt1"></aop:before><!--aop:pointcut和aop:before也可以合为一句,不过在对一个切入点配置多个aop:xxx的时候,分开写的优势就体现了,即不用多次写切入点表达式--><!--<aop:before method="printLog" pointcut="execution(* com.itheima.service.impl.*.*(..))"></aop:before>--></aop:aspect>
</aop:config>

aop:xxx:
aop:before
作用:用于配置前置通知

aop:after-returning
作用:用于配置后置通知

aop:after-throwing
作用:配置异常通知

aop:after
配置最终通知

以上这些可以类比java的try-catch执行机制来理解。

三、环绕通知

环绕通知的通知类写法和上面不同,但是在xml中的配置还是差不多的,使用aop:around配置对应的通知类型。环绕通知可以手动控制增强代码什么时候执行,而不限于上面的前置、后置。通常情况下around都是单独使用的,也就是对要增强的方法不用再配置前置、后置之类的通知了。

spring 框架为我们提供了一个接口:ProceedingJoinPoint,它可以作为环绕通知的方法参数。在环绕通知执行时,spring框架会为我们提供该接口的实现类对象,我们直接使用就行。例如对上面的例子进行改写:

package com.chester.utils;import org.aspectj.lang.ProceedingJoinPoint;
/*** 用于记录日志的工具类,它里面提供了公共的代码*/
public class Logger {/*** 用于打印日志:计划让其在切入点方法执行之前执行(切入点方法就是业务层方法)*/public void printLog(ProcessingJoinPoint pjp){try{System.out.println("Logger类中的pringLog方法开始记录日志了。。。");pjp.proceed();System.out.println("Logger类中的pringLog方法结束记录日志了。。。");}catch(Throwable e){System.out.println("运行出错");e.printStackTrace();}finally{System.out.println("Logger类中的pringLog方法完成记录日志了。。。");}}
}

现在在xml进行配置:

<!-- 配置Logger类 -->
<bean id="logger" class="com.chester.utils.Logger"></bean><aop:config><aop:pointcut expression="execution(* com.chester.service.impl.*.*(..))" id="pt1"></aop:pointcut><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><aop:around method="printLog" pointcut-ref="pt1"></aop:around></aop:aspect>
</aop:config>

使用Spring-AOP相关推荐

  1. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  2. 利用Spring AOP与JAVA注解为系统增加日志功能

    Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...

  3. Spring AOP的一些概念

            切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子. 在Spring AOP中,切面可以使用通用类(基于模 ...

  4. Spring AOP与IOC

    Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...

  5. Spring AOP与IOC以及自定义注解

    Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...

  6. Spring Aop的应用

    2019独角兽企业重金招聘Python工程师标准>>> AOP的基本概念 连接点( Jointpoint) : 表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行 ...

  7. Spring AOP详解(转载)所需要的包

    上一篇文章中,<Spring Aop详解(转载)>里的代码都可以运行,只是包比较多,中间缺少了几个相应的包,根据报错,几经百度搜索,终于补全了所有包. 截图如下: 在主测试类里面,有人怀疑 ...

  8. 关于spring aop Advisor排序问题

    关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...

  9. 利用spring aop统一处理异常和打日志

    利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用. 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger. ...

  10. 我所理解的Spring AOP的基本概念

    Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了很多例子后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 假设一个OA系统中的一个功 ...

最新文章

  1. Silverlight4.0教程之使用CompositeTransform复合变形特效实现倒影
  2. [php]数据结构算法(PHP描述) 半折插入排序 straight binary sort
  3. 一种常见的关于率指标的错误分析思路
  4. 多线程编程(三)--创建线程之Thread VS Runnable
  5. matlab命令 脑电波,基于Matlab的脑电波信号处理
  6. hdata datax交流总结
  7. 提高linux运行速度,提高Linux操作系统的运行速度
  8. 查看网络情况netstat指令与动态监控top指令
  9. 联想硬盘保护系统计算机名,联想硬盘保护系统EDU7.0安装方法
  10. c语言指针的作用 举例,c语言指针详解(c语言指针用法举例)
  11. 统计推断——假设检验——方差分析之多重比较(LSD法、Sidak法、Bonferroni法、Dunnett法、Tukey法、SNK 法、Duncan法)
  12. matlab模拟正态分布曲线拟合,[MATLAB数学相关] 急请教:正态分布曲线拟合问题
  13. Python数据分析5-数据分组与聚合
  14. java 线程的插队运行_java笔记–线程的插队行为
  15. J-LINK 软件下载地址
  16. oracle12c 兼容,12c(oracle12c兼容11g吗)
  17. python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...
  18. SQL语句插入日期类型
  19. GitHub 又又又多了一个新主题 —— Dimmed Dark 主题!
  20. JS 事件冒泡、捕获。学习记录

热门文章

  1. mysql中char,varchar,text
  2. tomcat集群 (自带Cluster集群)
  3. 打开深蓝医生的国庆大礼包!
  4. 基于逆向最大化词表中文分词法zz
  5. 在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
  6. 用javah 导出类的头文件, 常见的错误及正确的使用方法
  7. C/C++从入门到高手所有必备PDF书籍收藏
  8. jar包名冲突gradle_jar包又冲突了?如何快速确定与哪个jar包冲突?
  9. jsonProperty
  10. shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中