Spring 的 IOC

1. 什么是IOC IOC的好处

IOC的思想是将需要的对象通过外部传入进来,而不是自己创建。这样的设计方式更加灵活。在Spring中对象之间的依赖关系也是由IOC容器来维护(类与类之间的依赖关系,使用与被使用)。

IOC的设计也是根据设计模式原则中依赖倒置原则。

IOC 控制反转。通过DI依赖注入可以实现控制反转。IOC与DI的关系如下图所示。

DL 依赖查找,已经被抛弃。实现思路大概为将service放在map中,然后从map中通过service名字作为key获取指定的service。

2. Spring 框架中是如何做IOC的

Spring通过控制反转容器管理bean的生命周期,控制bean的依赖注入。Spring的IOC容器避免在各处使用new来创建类,并且统一维护。在你需要一个实例时,由容器提供给你。

Spring IOC 容器工作流如下图所示。

Spring源码分析IOC :

Spring IOC 核心:依赖注入和自动装配

核心接口:BeanFactory 和 ApplicationContext

BeanFactory : 能够管理和装配Bean,获取Bean实例

BeanDefinition: 用于描述Bean的定义

BeanDefinitionRegistry: 提供向ioc容器注册BeanDefinition对象的方法(registerBeanDefinition)。注册到BeanDefinitionMap中(key:String的BeanName value:BeanDefinition)。

ApplicationContext:BeanFactory子接口。面向开发者使用,有更多的功能。继承BeanFactory,也能管理装配Bean。RousorcePatternResolver能够加载资源文件。

3. Spring 有什么缺点

Spring像一个胶水,将框架黏在一起,后面拆分的话就不容易拆分了。

Spring 和Spring MVC的区别

Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。Spring 作为胶水 连接Mybatis 和Spring MVC 构成SSM框架。

早期的SSH框架:Struts2 : Web层框架。Spring : 容器框架。
Hibernate : 持久层框架。

4. Spring Bean 的五种作用域

  1. singleton:Spring的默认作用域 容器里拥有唯一实例(针对无状态的Bean)
  2. prototype: 针对每个getBean请求,容器都会创建一个实例(针对有状态的Bean)

web 容器下
3. ruquest:会为每一个Http请求创建一个Bean实例
4. session:会为每个session创建一个Bean实例
5. globalSession:会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效。

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。

5. Spring Bean 的生命周期

由Spring容器来管理的,主要是 创建 ,销毁。

创建:

  1. 实例化Bean
    • BeanFactory 通过createBean 进行实例化一个未初始化的Bean
  2. 设置对象属性(依赖注入)
    • 实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。
    • 紧接着,Spring根据BeanDefinition中的信息进行依赖注入。
    • 并且通过BeanWrapper提供的设置属性的接口完成依赖注入。
  3. 注入Aware接口
    • Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean。aware接口声明了依赖关系
  4. BeanPostProcessor
    • 当经过上述几个步骤后,bean对象已经被正确构造,但如果你想要对象被使用前再进行一些自定义的处理,就可以通过BeanPostProcessor接口实现。
  5. InitializingBean与init-method
    • 当BeanPostProcessor的前置处理完成后就会进入本阶段。

销毁:

若实现了DisposableBean接口,则会调用destroy方法

若配置了destroy-method属性,则会调用其配置的销毁方法

原文地址:https://www.cnblogs.com/wei57960/p/12623321.html