Spring AOP/IOC实现原理
Spring
正文核心介绍:Spring的内容,一起跟随小编看看吧!
AOP
什么是AOP
通俗的讲就是当你想要实现对象增强,就可以使用AOP。
不然的话还需要自己创建代理,AOP就是为了解决 非业务代码抽取 的问题。
它的底层技术实现是动态代理,在Spring内实现依赖的是BeanPostProcessor。
AOP在Spring中的几种实现方式
一共有4种方式:
- 注解
- XML
- JavaConfig
- 基于Groovy DSL配置
一般在实际应用中,主要是注解、XML,少部分会用JavaConfig。
比如常见的业务代码使用注解定义各种对象,责任链这种一般有的会配置定义在XML。
注解解决不了的就会用JavaConfig。
不同版本Spring的AOP执行顺序
Spring AOP常用的注解:
- @Before 前置通知:目标方法之前执行
- @After 后置通知:目标方法之后执行
- @AfterReturning 返回后通知:执行方法结束前执行(异常不执行)
- @AfterThrowing 异常通知:出现异常时执行
- @Around 环绕通知:环绕目标方法执行
Spring4 下AOP的执行顺序:
正常情况:@Before前置通知 -> @After后置通知 -> @AfterReturning正常返回 异常情况:@Before前置通知 -> @After后置通知 -> @AfterThrowing方法异常
Spring5 下AOP的执行顺序:
正常情况:@Before前置通知 -> @AfterReturning正常返回 -> @After后置通知 异常情况:@Before前置通知 -> @AfterThrowing异常通知 -> @After后置通知
Spring AOP实现原理
Spring AOP是通过代理模式实现的。
具体有两种实现方式,一种是基于Java原生的动态代理,一种是基于cglig的动态代理。
对应的代码实现分别是:CglibAopProxy和JdkDynamicAopProxy
- 同时Spring AOP默认使用的是JDK动态代理进行AOP代理。这使得任何接口都可以被代理。但是JDK动态代理有一个缺点,就是不能代理没有接口的类。所以Spring AOP使用CGLIB代理没有接口的类
- 但是要注意Spring Boot在2.x版本后默认使用的是CGLIB动态代理了。具体原因是为了解决使用JDK代理可能导致的类型转化异常而使用CGLIB。当然也可以通过参数
spring.aop.proxy-target-class=false进行修改
为什么SpringBoot默认使用CGLIB作为代理的实现方式呢?
我觉得可以从两个切入点聊一聊这个事:一是兼容性,另外就是性能。
- 兼容性:
CGLIB动态代理可以适用于任何类型的目标类,无论它是否实现了接口。
而JDK动态代理只能适用于实现了接口的目标类。
相关阅读
-
二阶段提交的优缺点有哪些? 二阶段提交的利弊分析
这些知识你了解吗?二阶段提交的优缺点有哪些的电脑方面的小经验,接下来小编为网友介绍。 二阶段提交协议(Two-phase commit protocol),简称 2PC。 两阶段提交是一种强一致性事务协议,它分
-
SSL协议是什么 SSL协议是什么协议
你是不是想知道SSL协议是什么的相关知识,SSL协议是一种加密网络通信安全协议,是Web浏览器与Web服务器之间安全交换信息的协议,具有数据加密、完整性校验及身份验证功能,保障网络数据传
-
OSPF协议有哪些基本特征 什么是OSPF协议
IT袋网网小编为你介绍OSPF协议有哪些基本特征的内容,下面来一起了解一下吧。 OSPF(Open Shortest Path First,开发最短链路优先)作为一种内部网关协议(Interior Gateway Protocl,IGP),用于在同一个自
-
线程的五种状态 五种线程状态:了解并管理线程的状态转换
为大家介绍的是线程的五种状态的电脑小知识,接下来IT袋网小编就来介绍。 五种状态的说法来自于操作系统层面的划分 运行态 :分到 cpu 时间,能真正执行线程内代码的 就绪态 :有资格分


