使用Spring-AOP
在开始使用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相关推荐
- Spring AOP + Redis解决重复提交的问题
Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...
- 利用Spring AOP与JAVA注解为系统增加日志功能
Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...
- Spring AOP的一些概念
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子. 在Spring AOP中,切面可以使用通用类(基于模 ...
- Spring AOP与IOC
Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...
- Spring AOP与IOC以及自定义注解
Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...
- Spring Aop的应用
2019独角兽企业重金招聘Python工程师标准>>> AOP的基本概念 连接点( Jointpoint) : 表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行 ...
- Spring AOP详解(转载)所需要的包
上一篇文章中,<Spring Aop详解(转载)>里的代码都可以运行,只是包比较多,中间缺少了几个相应的包,根据报错,几经百度搜索,终于补全了所有包. 截图如下: 在主测试类里面,有人怀疑 ...
- 关于spring aop Advisor排序问题
关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序,这时候可以用注解org.springframework.core.annotation.Order或 ...
- 利用spring aop统一处理异常和打日志
利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用. 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger. ...
- 我所理解的Spring AOP的基本概念
Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了很多例子后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 假设一个OA系统中的一个功 ...
最新文章
- Silverlight4.0教程之使用CompositeTransform复合变形特效实现倒影
- [php]数据结构算法(PHP描述) 半折插入排序 straight binary sort
- 一种常见的关于率指标的错误分析思路
- 多线程编程(三)--创建线程之Thread VS Runnable
- matlab命令 脑电波,基于Matlab的脑电波信号处理
- hdata datax交流总结
- 提高linux运行速度,提高Linux操作系统的运行速度
- 查看网络情况netstat指令与动态监控top指令
- 联想硬盘保护系统计算机名,联想硬盘保护系统EDU7.0安装方法
- c语言指针的作用 举例,c语言指针详解(c语言指针用法举例)
- 统计推断——假设检验——方差分析之多重比较(LSD法、Sidak法、Bonferroni法、Dunnett法、Tukey法、SNK 法、Duncan法)
- matlab模拟正态分布曲线拟合,[MATLAB数学相关] 急请教:正态分布曲线拟合问题
- Python数据分析5-数据分组与聚合
- java 线程的插队运行_java笔记–线程的插队行为
- J-LINK 软件下载地址
- oracle12c 兼容,12c(oracle12c兼容11g吗)
- python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...
- SQL语句插入日期类型
- GitHub 又又又多了一个新主题 —— Dimmed Dark 主题!
- JS 事件冒泡、捕获。学习记录
热门文章
- mysql中char,varchar,text
- tomcat集群 (自带Cluster集群)
- 打开深蓝医生的国庆大礼包!
- 基于逆向最大化词表中文分词法zz
- 在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
- C/C++从入门到高手所有必备PDF书籍收藏
- jar包名冲突gradle_jar包又冲突了?如何快速确定与哪个jar包冲突?
- jsonProperty
- shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中