Spring技术内幕笔记(1):IoC和AOP

独角龙
• 阅读 1989

IoC容器的实现

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

依赖反转是什么

依赖反转在Spring中的体现是依赖注入。

类通过引用来进行合作,这种引用形成了类之间的依赖,如果这种依赖关系需要对象自己管理,那么代码会产生高度的耦合,导致开发和测试上的困难。如果这种依赖的管理交给框架来做,将简化面向对象系统的复杂性,这就是依赖的反转。

Spring中的容器是什么

容器用来管理应用中的对象和其之间的依赖关系。BeanFactory是对容器的一种抽象,ApplicationContext是其高级实现。

IoC的初始化过程

整体过程分三步:

  1. Resourece定位,也就是定位定义Bean资源的位置。Resourece的位置是多样的,使用比较多的是FileSystemResourece。
  2. BeanDefinition载入。读取定义的内容,将用户定义的Bean表示成BeanDefinition,BeanDefinition是在容器中对POJO的抽象,记录了配置的bean信息。
  3. 向IoC容器注册BeanDefinition,IoC用HashMap结构来维护注册的BeanDefinition。

注意这里只是有Bean的载入,而不是依赖注入,依赖注入发生在第一次通过getBean向容器获取Bean的时候。

依赖注入过程

在发起getBean方法时,才会进行依赖注入,创建响应的bean。

依赖注入过程如下:

  1. 判断单例bean是否已经创建,创建过的无需重复创建。
  2. 递归创建依赖的bean。
  3. 最后创建目标bean实例。

    • 实例化Java对象。采用了CGLIB或者JVM反射机制来生成对象。CGLIB可以在运行期动态的生成新的class。
    • 注入属性依赖。

Bean的生命周期

在IoC初始化后,Bean并没有被实际的创建。在getBean后,才会有bean的实例化,bean的生命周期如下:

创建bean实例->设置bean的属性->调用bean的初始化方法(initialization)->应用可以使用bean->容器关闭,销毁bean

Bean的lazy init

上述可知,bean会在使用时才会真正的创建,这防止了创建大量用不到的bean实例。

当然,可以通过设置参数,让bean在IoC容器初始化完毕后就创建。

IoC感知的Bean

Bean一般情况下不需要知道IoC容器的存在,有时候则需要。Bean可以实现一些aware接口来获得想要的容器属性。

如ApplicationContextAware,可以在Bean中获得上下文,从而在Bean中使用上下文。

AOP的实现

AOP的作用

分离关注点使解决特定领域问题的代码从业务逻辑中独立出来。

基本概念

Advice通知:描述方法调用注入的切面行为。
Pointcut切点:用来描述需要增强的方法集合。
Advisor通知器:将Advice和Pointcut结合起来。

JVM的动态代理

在代理模式中,会设计一个和目标对象有着一致接口的代理对象Proxy,客户端对目标对象的请求都会发送给代理对象,而客户端对此毫无察觉。
Spring技术内幕笔记(1):IoC和AOP

该模式使得Proxy有机会对原始的对象的行为进行一定的修改,可以在执行前和执行后分别执行一定的动作,从而增强原始行为。

AopProxy的实现原理

首先需要定义一些Advisor,这些Advisor定义了需要织入的增强功能,也就是涵盖了通知的内容。然后定义ProxyFactoryBean,它将会生成目标的代理对象。在配置中,ProxyFactoryBean需要知道其代理的目标是谁,代理的接口是哪个,有哪些Advisor需要添加。

ProxyFactoryBean生成AopProxy过程:

  1. 初始化通知器链。通过getBean获取通知器的bean,然后加入。ProxyFactoryBean只在第一次获得AopProxy时初始化。
  2. 生成代理对象。

    • JDK生成,需要设置ClassLoader和代理接口。
    • CGLIB生成。

AopProxy工作过程:

  1. 当目标对象被调用时,会触发Proxy的回调函数进行拦截。
  2. 首先获取拦截器。从上述中初始化的通知器链中,遍历并获取匹配目标方法的通知器,然后获取通知器对应的拦截器,该结果会被缓存。
  3. 调用器会依次迭代调用拦截器(interceptor)进行增强,最后调用目标方法。

通知器封装为拦截器:

  1. 拦截器默认分为三类:MethodBeforeAdviceIntercepter、AfterReturn...、Throws...。
  2. 一个Advice会可能是MethodBeforeAdvice、AfterReturn...、Throws...其中的一个或者多个。
  3. 根据Advice的种类,适配器AdviceAdapter将其包装为相应的intercepter,intercepter中的invoke方法会根据before、after或者throw将advice的增强行为放置到适当位置。适配器默认是上述的三种,可以自定义adapter注册进来,以生成自己定制的intercepter。
  4. 调用器执行拦截器链的时候,递归过程:process(调用器)->invoke(intercepter)->process(调用器)->invoke(下一个intercepter)...->目标方法。所以intercepter会根据自己的种类在递归调用前或者后执行advice的方法。
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
spring核心思想:IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)
Spring有三大核心思想,分别是控制反转(IOC,InversionOfController),依赖注入(DI,DependencyInjection)和面向切面编程(AOP,AspectOrientedProgramming)。控制反转(IOC,InversionOfController)控制反转不是什么技术,而是一种设计思
Easter79 Easter79
3年前
SpringIOC官方文档解读
IoC容器本章介绍了Spring的控制反转(IoC)容器。1.1。SpringIoC容器和Bean简介本章介绍了反转控制(IoC)原则的Spring框架实现。IoC也称为依赖注入(DI)。在此过程中,对象可以通过①构造函数参数(),②工厂方法的参数③或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依
Stella981 Stella981
3年前
Spring Ioc之BeanFactory
   IoC(InversionofControl),即所谓的控制反转,就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器(BeanFactory)负责的。   Spring通过配置文件(或者注解、JavaConfig)描述Bean和Bean之间的依赖关系,利用反射机制实例化Bean并建立Bean之间的依赖关系。Spr
Easter79 Easter79
3年前
Spring简介,搭建Spring环境——轻量级容器框架(一)
Spring是什么?      Spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程),所以spring既是一个IoC容器,也是一个AOP框架。知道了什么是Spring是学习的开端,下面说一下为什么使用Spring。为什么使用Spring?
Easter79 Easter79
3年前
Spring与Mybatis环境搭建
SH框架的结合几乎家喻户晓,但是一般的中小项目,使用Spring和MyBatis就够了,而且MyBatis轻便好使,易上手,值得大家尝试一次。  开篇简介:  Spring:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。两个重要模块:Spring面向方面编程(AOP)和控制反转(IOC)容器。控制反转模
Easter79 Easter79
3年前
Spring常用知识点总结
1\.Spring有哪些优点?  轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。  控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。  面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来
Wesley13 Wesley13
3年前
JAVA日常记录
11.IOC的优点是什么IOC(InversionofControl)控制反转,将控制权(创建对象和对象之间的依赖关系的权利)交给spring容器。接口驱动设计(InterfaceDrivenDesign)的好处,可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。IOC模式将耦合代
Easter79 Easter79
3年前
Spring概念和Bean管理(配置文件)
Spring概念1.spring是开源的轻量级框架(免费,依赖少,可以直接使用)2.spring核心主要两部分:  (1)aop:面向切面编程,扩展功能不是修改源代码实现  (2)ioc:控制反转,  比如有个类,在类里面有个方法(不是静态方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创
Easter79 Easter79
3年前
Spring源码阅读——3
SpringIoC容器1、IoC容器概述控制反转、IoC容器、依赖注入控制反转:不是什么技术,而是一种设计思想。Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IoC容器:IoC容器控制了对象的
Easter79 Easter79
3年前
Spring知识点提炼
1\.Spring框架的作用清理:Spring是轻量级的,基本的版本大小为2MB控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。面向切面的编程AOP:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。容器:Spring包含并管理应用中对象
小万哥 小万哥
1年前
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
概述在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。什么是控制反转?控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。与传统编程相