四、Spring-面向切面编程
内容
- 面向切面编程基本原理
- 通过POJO创建切面
- 使用@AspectJ注解
- 为AspectJ切面注入依赖
关键词
- 横切关注点(cross-cutting concern)
- 继承 (inheritance)
- 委托 (delegation)
- 通知 (advice)
- 切点 (pointcut)
- 连接点 (join point)
4.1 面向切面编程
日志是应用切面的常见范例,其他常见还包括声明式事务、安全和缓存
那么什么是切面编程?
在代码中的一个地方定义通用功能,通过声明的方式被调用,而无需修改其他类。那么该模块化的特殊类,就被称之为切面(Aspect)。可以使关注代码集中管理,而不是分散式管理;服务模块更加简洁,更多的关注于核心代码,而切面类的代码就可以使次要关注点。
4.1.1 定义AOP术语
- 通知 (advice)
- 切点 (pointcut)
- 连接点 (join point)
通知:切面的工作被称之为通知。通知定义了切面是什么以及何时使用,还解决了什么时候执行的问题。
五种类型的通知
| 名词 | 说明 |
|---|---|
| 前置通知(Before) | 在目标方法被调用之前调用通知功能 |
| 后置通知(After) | 在目标方法完成之后调用通知,此时不会关心方法的输出是什么 |
| 返回通知(After-returning) | 在目标方法执行成功后通知 |
| 异常通知(After-throwing) | 在目标方法抛出异常后通知 |
| 环绕通知(Around) | 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。 |
连接点:是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至是修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。
切点:通知定义了“何时”和“什么”,那么切点就定义了“何处”。切点的定义通常会匹配通知所要织入的一个或多个连接点。通常会指定明确的类或者方法,但是也会使用正则等进行类和方法的匹配。
切面:切面=通知+切点;即阐明了“何时”在“何处”执行了“什么”。
引入(Introduction):引入允许我们向现有的类添加新方法或属性
织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入。
- 编译期:切面在目标类编译时被织入。
- 类加载期:切面在目标类加载到JVM时被织入。
- 运行期:切面在应用运行的某个时刻被织入。
4.2 切点表达式语言
| AspectJ指示器 | 描述 |
|---|---|
| arg | 限制连接点匹配参数为指定类型的执行方法 |
| @args() | 限制连接点匹配参数为指定注解的执行方法 |
| execution() | 用于匹配时连接点的执行方法 |
| this() | 限制连接点匹配AOP代理的bean引用为指定类型的类 |
| target | 限制连接点匹配目标对象为指定类型的类 |
| @target() | 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解 |
| within() | 限制连接点匹配指定的类型 |
| @within() | 限制连接点匹配指定注解所标注的类型 |
| @annotation | 限制连接点匹配带有指定注解的连接点 |
1. execution(* concert.Performance.perform(..))
* 为返回任意类型
concert.Performance为方法所属类
perform 方法
(..) 任意参数
2. execution(* concert.Performance.perform(..) &&(||、!) within(concert.*))
可以使用与或非和其他关系关联
四、Spring-面向切面编程的更多相关文章
- 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧
Spring面向切面编程(AOP)是企业级应用的基石,可以这样说,如果大家要升级到高级程序员,这部分的知识必不可少. 这里我们将结合一些具体的案例来讲述这部分的知识,并且还将给出AOP部分的一些常见面 ...
- Spring 面向切面编程(AOP)
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
- Spring——面向切面编程(AOP)详解
声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...
- Spring面向切面编程(AOP)
1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...
- 再学习之Spring(面向切面编程)
一.概念 1.理论 把横切关注点和业务逻辑相分离是面向切面编程所要解决的问题.如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或 组成(delegation).但是,如果在 ...
- Spring面向切面编程
在使用面向切面编程时,我们可以在一个地方定义通用的共鞥,但是可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类.横切关注点可以被模块化为特殊的类,这些类被称为切面.这样的优点是 ...
- 详解Spring面向切面编程(AOP)三种实现
一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...
- Spring面向切面编程(AOP,Aspect Oriented Programming)
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- spring面向切面编程示例(xml配置形式vs@注解形式)
一.xml配置形式 1.在Spring配置文件中增加面向切面配置当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法 ...
- JAVA Spring 面向切面编程 基本案例(AOP)
< 1 > 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...
随机推荐
- POJ 1330 Nearest Common Ancestors(裸LCA)
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39596 Accept ...
- IIS 搭网站(一)
搭建类型win+IIs+asp+access(一) 第一步首先保证虚拟机的系统软盘是连接状态,如下图状态即可 第二步: 第三步: 第四步: 第五步: 第六步:这个时候就会自动搜索软盘里面的数据自动安装 ...
- ubuntu16 安装redis
ubuntu16 安装redis并开机自启 1.redis-3.2.5.tar.gz解压到/usr/local下 tar -xvf redis-3.2.5.tar.gz 2.进入源码包/usr/loc ...
- golang 容器的学习与实践
golang 提供了几个简单的容器供我们使用,本文在介绍几种Golang 容器的基础上,实现一个基于Golang 容器的LRU算法. 容器介绍 Golang 容器位于 container 包下,提供了 ...
- 对已经创建的docker container设置开机自启动
首先显示出所有的容器 docker ps -a #显示所有容器 设置已经建立的容器的开机自启动方法 docker update --restart=always <container ID 根据 ...
- python学习之变量以及变量/标识符/关键字
Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言,代码简洁,功能强大,是使程序员能够专注于解决问题而不是研究语言本身.接下来我们先从它的语法开始学起 1.首先要懂得python ...
- STM32学习笔记——GPIO
单片机型号STM32F407VET6. 概述 GPIO的分类: 可接受5V输入的(FT),绝大多数引脚都是: 只能接受3.3V输入的(TTa),只有PA4和PA5,就是DAC输出的两个引脚: 其他,包 ...
- JDBC04 PreparedStatement
PreparedStatement类 存在预编译,用占位符去填参数(参数索引从1开始算),可以防止SQL注入 try { Class.forName("com.mysql.cj.jdbc.D ...
- Luogu P5603 小C与桌游【贪心+拓扑排序】
[Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...
- docer run 、docker attach 与 docker exec的区别
进入容器的方式有以下三种: 使用ssh登陆进容器 使用nsenter.nsinit等第三方工具 使用Docker本身提供的工具 最佳方案为使用Docker本身提供的工具 docker run:创建和启 ...