最近挺忙的,又偷懒没更新了…
建议先看:https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html
今天看到一篇关于spring原理的文章,是关于spring中ioc和aop具体实现的。
结果发现我已经完全忘掉spring这两大特性的原理了,赶紧复习一下。
一、spring ioc
spring ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。
- 资源集中管理,实现资源的可配置和易管理。
- 降低了使用资源双方的依赖程度,也就是我们说的耦合度。
明确一点,spring ioc很大程度上是根据java的反射特性来实现的。
至于反射,可以参照我以前的文章:
http://xie4ever.com/2016/09/01/java-%e5%8f%8d%e5%b0%84/
我个人是这样理解的:我们把需要使用的类放进第三方容器中,需要用到了,就用反射把这个类加载出来(依赖注入di),使用类中的方法。整个这样的流程称为控制反转(ioc)。
二、spring aop
spring aop是面向切面,以前的文章中有提到为什么需要使用spring aop:
首先明确一点,spring aop很大程度上是根据java的动态代理来实现的。
原来我们使用动态代理,需要写很多相关代码,并且要有比较深的了解,对开发人员的要求水平较高。现在spring帮我们包装了aop,只要设定运行时点,写逻辑就好,方便了很多。
spring aop的实现原理一般有两种,不详细展开讨论(参考:https://www.jianshu.com/p/010f9c0b3e2f):
- java原生实现。默认的策略是如果目标类是接口,则使用JDK动态代理技术(通过接口实现)。否则使用Cglib来生成代理(通过继承实现)。
- 借助Aspectj实现。采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码。
三、总结
记录一下。