Spring原理详解
树图思维导图提供 Spring-AOP-03 在线思维导图免费制作,点击“编辑”按钮,可对 Spring-AOP-03 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:68ecb1cc9cc080557af7ab9936b40051
Spring-AOP-03思维导图模板大纲
AOP全程位Aspect Oriented Programming(面向切面编程) OOP——————面向对象编程 POP——————面向过程编程
OOP语言提供了类与类之间纵向的关系(继承,接口), 而AOP补充了横向的关系
AOP是一种编程思想,也是一种设计模式,是面向对象编程的一种补充。 面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
其实就是spring中引入了AOP的思想 springaop一般用于在项目中实现 日志记录,用户操作行为日志记录,权限控制,事务管理等操作。
3.1SpringAOP和AspectJ的渊源 AspectJ是一个专门主打面向切面编程的框架。 使用一种特殊的语言来编写切面代码,后缀是.aj格式。 SpringAOP底层也是使用了AspectJ的方案,但是在上层做了很多封装层面的工作,可以让开发 人员直接使用Java代码来编写切面
AOP的术语
目标对象 Target
被代理的对象
代理 (Proxy)
一个类被AOP织入增强后,就产生了一个结果代理类。
链接点(Join Pointer)
连接点有很多种,比如方法执行期间(开始执行,执行结束,抛出异常) ,字段修饰符,字段制备更改...等等
理论上所有可能被切入的地方都可以称之为链接带你,————及被拦截的带你。 其实 就是目标对象的方法
在Spring AOP种支支持方法链接点 因为Spring AOP底层是通过动态代理实现的。
连接点 与切入点 的关系可以简单理解为: 切入点一定是连接点,但连接点不一定是切入点。
切入点 ——(Pointcut)
选择切入某个连接点的操作,将切面代码织入进去。 这个连接点就叫做切入点
在SpringAOP中需要使用切点表达式来定义切入点 切点表达式支持以下几种类型(仅需要了解execution表达式即可)!!!
切入点表达式格式: execution( [修饰符] 返回值类型 com.lanou..Target.方法名(参数)) eg:execution( * com.lanou.Target.save(..))
1:访问修饰符可以省略 2:返回值类型、报名、类名、方法名可以使用*代表任意 3:包名与类名之间一个点,代表当前包下的类,两个带你..表示当前包及其子包下的类 4:参数列表可以使用两个点 . . 表示任意个数,任意类型的参数列表
切入点表达式与或非
切入点表达式也支持逻辑运算: &&、||、!
通知————(Advice)
通知决定了切面代码织入到目标代码中后,运行的时机 (比如实在目标方法执行前,还是执行后),可以理解为 就是增强的操作,也就是共性的操作
SpringAOP中提供了五种通知类型:
前置通知(before) 权限控制,日志记录)
在目标方法调用前面,通知切脉你,什么参数都无法获取。 也不能终止目标方法执行
后置(返回值)通知(after returning)(日志记录)
只有在目标方法 正常 执行结束后才会通知,在通知方法中可以获取到方法的返回值
环绕通知(around)
在目标方法执行前, 后被通知, 可以获取链接点对象(ProceedingloinPoint,该对象可以获取被拦截方法的签名,参数,返回值,包括调用与否
该方法的返回值,既代表了真正业务逻辑代码的返回值
可以选择终止或正常执行目标方法
异常通知(after throwing) (记录运行产生的异常信息到服务日志文件中)
只有在目标方法 出现异常 才会通知 , 在通知方法中可以获取到抛出的异常信息
最终通知 ——(after)
在目标方法执行结束后通知切面,什么参数也无法获取, 无论目标方法是正常执行结束,还是抛出异常终止,都会被通知。
切面————(Aspect)
简单来所,切面就是我们遥望目标代码中插入进去的代码 是 切点 和 通知 的结合
织入————(Weaving)
织入的过程其实就是 SpringAOP帮我们把切面中的代码织入到目标代码中的过程。 创建代理对象的过程
想象,在开发中多个模块间有某段重复的代码,应该如何处理? 其实就是将冗余的代码(相同的代码)抽取到代理类中,减少了代码量 多个地方具有相同的特性提取出来,这就是AOP的解决方向,比较节省资源。
在目标对象实现类添加注解@Component
在通知类添加注解 标识我的切面
配置applicationxml文件
编写aop context命名空间
注解支持,包扫描
aop注解支持
测试类 SpringTest
添加依赖
创建com.lanou软件包
创建aop软件包
在aop中创建 目标接口 TargetInterface
public interface TargetInterface { public String save(); }
创建目标接口实现类 TargetInterfaceImpl
public class TargetInterfaceImpl implements TargetInterface{ @Override public String save() {//连接点 System.out.println("目标对象的连接点...save执行了..."); return "保存完成"; } }
创建aspect切面软件包
创建通知类 MyAspect
前置通知
后置通知
环绕通知
异常通知
最终通知
创建test测试软件包
SpringTest
在resources资源文件中 新建application.xml配置文件
需要在配置文件的beans配置 xml命名空间
xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
配置目标对象
配置通知类
配置aop 代理 织入 切入 通知 切面
在xml和注解的基础上不需要application.xml配置文件 只需要编写配置类SprignConfiguration
声明该类位 注解配置类
注解组件扫描包 目录
开启aop注解支持
测试类 SpringTestFullAnno
Spring AOP底层支持两种动态代理实现
JDK原生的动态代理,基于接口的代理方式(工作几乎不可能用,仅了解)
Cglib动态代理,继承的代理方式 (代理类 继承 被代理类) 有接口没接口都支持
Spring在创建代理对象是,会自动选择要使用哪种代理方案,如果被代理的类实现类接口,就用JDK动态代理 反之(代理类继承了被代理类)使用Cglib动态代理
JDK原生动态代理
区别 静态代理 每代理一个类就需要创建一个专门的代理类, 动态代理 就只需要一个通用的代理类,即可代理所有实现类接口的类
子主题 1
Cglib动态代理
树图思维导图提供 埃隆·马斯克的商业版图 在线思维导图免费制作,点击“编辑”按钮,可对 埃隆·马斯克的商业版图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:7464362ac911e8a334867bb3fc7a2346
树图思维导图提供 决策的实施与调整 在线思维导图免费制作,点击“编辑”按钮,可对 决策的实施与调整 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:82f679a5e663571a391e0d03a40486e7