Spring IoC和Spring AOP
1.Spring IoC
控制反转(Inversion of Control,IoC),是Spring框架的核心,用来减少程序的耦合性。
那什么是控制反转呢,从字面上理解的话,将自己拥有的控制权给了对方,这就是控制反转。
具体的内容可以用下面的例子来理解
以前没有微信付款以及支付宝,人们进行交易就必须面对面拿出现金进行交易还常常涉及到找零等等
而现在有了支付软件这个第三方平台,人们可以不再需要现金交易,这就大大降低了人与人之间的联系。
到了现在刷脸支付甚至可以直接不再需要商家看管,只需要定期换货就可以了。
那在项目中,各个功能模块就相当于例子中的人,解耦的含义其实就是各个项目模块之间不再需要复杂的依赖,从而避免了因为某一个模块发生问题导致整个项目宕机。有了Spring IoC之后,对象的实例不再由调用者创建,而是交给框架来实现,也就是把控制权从调用者转移到了Spring容器中,这就是控制反转
当然,控制反转也有另一种说法,也可以叫依赖注入(Dependency Injection,DI),这其实是一个问题的两个角度。上面是从调用者角度出发,所以是控制反转;那么从Spring容器的角度出发呢,它负责将所依赖的对象赋值给调用者使用,相当于为调用者注入所需要的依赖实例,所以也可以叫做依赖注入。
我们可以这样概括二者 在Spring中实现控制反转的是IoC容器,实现方法是依赖注入
2.Spring AOP
Spring AOP是Spring框架体系结构中非常重要的功能模块之一,该模块提供了面向切面编程。
2.1 Spring AOP的基本概念
AOP(Aspect-Oriented Programming),即面向切面编程,它与面向对象编程相辅相成。在面向对象中,我们都是以类作为程序的基本单元。熟悉Java的都知道,它就是一门面向对象的语言,因为它就是从类的角度出发。而AOP中的基本单元是切面(Aspect),由于在面向对象中,我们在代码重用时都是通过封装或者继承等等方式,但是还是有同样的代码分散到各个方法的现象。AOP的思想就是将这些重复的代码提取出来,在程序编译或者运行的时候,再将这些抽取出来的代码应用到需要执行的地方。
2.2 AOP的术语
- 切面
切面是指封装横切到系统系统功能的类 - 连接点
连接点是指程序运行中的一些时间点,如方法调用或异常抛出 - 切入点
切入点是指那些需要处理的连接点,所有的方法执行都是连接点,通过切入点确定哪些连接点需要处理 - 通知(增强处理)
通知是切面的具体实现,在定义好的切入点处所要执行的程序代码 - 引入
引入允许在现有的实现类中添加自定义的方法和属性 - 目标对象
目标对象是指所有被通知的对象;如果AOP框架使用运行时代理的方式(动态AOP)来实现切面,那么通知对象总是一个代理对象。 - 代理
代理是通知应用到目标对象后被动态创建的对象 - 织入织入是将切面代码插入到目标对象上,从而生成代理对象的过程。AOP的织入有三种方式
- 编译器织入: 需要特殊的编译器
- 类装载器织入:需要特殊的类装载器
- 动态代理织入:在运行期为目标类添加通知生成子类的方式
通知类型:
- 前置通知(Before advice):在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。
- 后置通知(After returning advice):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
- 异常通知(After throwing advice):在方法抛出异常退出时执行的通知。
- 最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
- 环绕通知(Around Advice):包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
环绕通知是最常用的通知类型。和AspectJ一样,Spring提供所有类型的通知,推荐使用尽可能简单的通知类型来实现需要的功能。例如,如果你只是需要一个方法的返回值来更新缓存,最好使用后置通知而不是环绕通知,尽管环绕通知也能完成同样的事情。用最合适的通知类型可以使得编程模型变得简单,并且能够避免很多潜在的错误。