Spring实战(九)AOP概念以及Spring AOP
1、横切关注点(cross-cutting concern)
软件开发中,散布于应用中多处的功能被称为横切关注点,如事务、日志、安全。
横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中),而把横切关注点和业务逻辑分离正是AOP要解决的问题。
DI用于应用对象之间的解耦,AOP实现横切关注点与他们所影响的对象之间的解耦。
2、重用通用功能,最常见的技术是继承和委托
继承会导致脆弱的对象体系;委托可能需要对委托对象进行复杂的调用。
所以用切面取而代之。
3、AOP术语
Aspect:切面——把横切关注点模块化为特殊的类,这些类称为切面。
Advice:通知or增强——所要增强or增加的功能,模式有Before、After、After-returning,、After-throwing、Around
Join Point:连接点——应用执行过程中,能够插入切面的所有“点”(时机)
Pointcut:切点——实际运行中,选择插入切面的连接点,即定义了哪些点得到了增强。
Introduction:引入——向现有的类添加新方法和属性。
Weaving:织入——把切面应用到目标对象并创建新的代理对象的过程。(也可以为植入)
4、在目标对象的生命周期中,有多个点可以进行织入:
- 编译期——需要特殊的编译器,AspectJ的织入编译器是以这种方式织入切面。
- 类加载期——切面在目标类加载到JVM时被织入,需要特殊的类加载器(ClassLoader),使目标类被导入应用之前增强该目标类的字节码。
- 运行期——切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP以这种方式织入切面!
5、Spring中提供了4种类型的AOP支持
- 基于代理的经典Spring AOP;
- 纯POJO切面——XML配置
- @AspectJ注解驱动的切面——无需XML配置
- 注入式AspectJ切面
前三种是Spring AOP实现的变体,Spring AOP构建在动态代理基础上,因此,Spring对AOP的支持局限于方法拦截。如果你的AOP需求超过了简单的方法调用,如构造器或者属性拦截,那么你需要考虑使用AspectJ来实现切面
6、Spring创建的通知都是用标准的Java类编写的,定义通知应用的切点可以使用注解或在Spring配置文件中用XML编写。
AspectJ则用特有的AOP语言,可以获得更强大和细粒度的控制。
7、Spring在运行时通知/增强目标对象——动态代理
Spring中的切面由包裹了目标对象的代理类实现。代理类拦截并处理方法的调用,执行额外的切面逻辑,然后再调用目标对象的方法。
那代理对象是什么时候创建的呢?
当应用需要被代理的bean时,Spring才创建代理对象。
被代理的对象(目标对象)又是什么时候创建?
如果使用AppplicationContext,AppplicationContext从BeanFactory中加载所有bean时,Spring创建被代理对象。
8、Spring只支持方法级别的连接点。
AOP中连接点的模型有多种,如字段和构造器接入点。
由于Spring基于动态代理,所以只支持方法连接点,因此无法创建细粒度的通知。
如果需要方法拦截之外的连接点拦截功能,需要利用AspectJ补充Spring AOP。
Spring实战(九)AOP概念以及Spring AOP的更多相关文章
- Spring实战(十一) 在Spring XML中配置AOP
如果你没有源码,不能为通知类添加注解,又不想将AspectJ注解放入到你的代码中,必须选择XML配置了. 1.Spring XML配置文件 解析参考:http://www.cnblogs.com/bi ...
- 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0
最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...
- Spring实战(十二) Spring中注入AspectJ切面
1.Spring AOP与AspectJ Spring AOP与AspectJ相比,是一个功能比较弱的AOP解决方案. AspectJ提供了许多它不能支持的类型切点,如在创建对象时应用通知,构造器切点 ...
- 【Spring实战】----开篇(包含系列目录链接)
[Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...
- spring实战五之Bean的自动检测
在spring实战四中,使用在Spring中增加<context:annotation-config>的方式告诉Spring,我们打算使用基于注解的自动装配,希望Spring特殊对待我们所 ...
- Spring实战 (第3版)——AOP
在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...
- Spring+IOC(DI)+AOP概念及优缺点
Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...
- Spring 3 AOP 概念及完整示例
AOP概念 AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程).其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能.像 ...
- spring学习九 spring aop详解
本文来自于:https://www.cnblogs.com/jingzhishen/p/4980551.html AOP(Aspect-Oriented Programming,面向方面编程),可以说 ...
随机推荐
- elasticsearch Delete (根据条件删除)
之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装插件. bin/plugin install delete-by-query 需 ...
- 【Redis 设置Redis使用LRU算法】
转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...
- 转载 AMI方案和Insyde方案
闲来无事回头看看,自毕业以来一直都在BIOS这个行业打转,目前的各种新闻来看全球的IT行业都似乎不太景气,PC出货量一泻千里,想要有所转机看起来不是一天两天的事情,想来无事来看看做过的几个UEFI B ...
- swoole入门简介
原文:https://www.cnblogs.com/dormscript/p/4811921.html 本文主要记录一下学习swoole的过程.填过的坑以及swoole究竟有多么强大! 首先说一下对 ...
- MySQL 中<=>用法(长知识)
https://www.runoob.com/mysql/mysql-operator.html MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下 ...
- HearthBuddy遇奥秘解决方法
https://tieba.baidu.com/g/5808796816 链接: https://pan.baidu.com/s/1NPQTOfxbN_4alP7J-XWuVw 密码: xfj1
- JAVA字符串处理函数列表一览
JAVA字符串处理函数列表一览 Java中的字符串也是一连串的字符.但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理.将字符串作为内置的对象处 ...
- 中间件 | Nginx实现动静分离
Nginx动静分离基本概述 动静分离,通过中间件将动静分离和静态请求进行分离: 通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同事能减少请求的延时. 通过中间件将动态请求和静态请求分离 ...
- 前端知识点回顾——Javascript篇(二)
JavaScript的解析顺序 第一阶段:编译期 寻找关键字声明的变量.函数声明的变量,同时会对变量进行作用域的绑定 var声明的变量,在编译期会赋一个默认值undefined,变量提升的特性. ES ...
- HelloWorld入门代码
A:定义类 B:写main方法 C:写输出语句 D:Java程序开发运行与工作原理 E:编译和运行程序 class HelloWorld { public static void main(Strin ...