SpringIOC

SpringIOC

一、IOC原理

通过配置文件描述Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean,并建立Bean之间的依赖关系。

Spring启动时读取应用程序提供的Bean配置信息,Spring容器中生成一份相应的Bean配置注册表。根据注册表实例化Bean

Bean缓存池为HashMap实现。

二、IOC的实现

IOC的实现是BeanFactory用了工厂设计模式思想,当时BeanFactory面向的是Spring本身,我们实际开发中,直接使用ApplicationContext。

三、Spring Bean作用域

Bean定义了5种作用域分别为singleton(单例)、prototype(原型)、request、session和global session

在spring中使用xml文件配置

<bean id="userDao" class="com.ioc.UserDaoImpl" scope="singleton"/>、
在sprigboot中使用@scope注解改变。

  1、singleton:单例模式,Spring IOC容器中只会存在一个共享的bean实例,无论多少个Bean引用他,始终指向同一个对象。该模式在多线程下是不安全的。在

  2、prototype:原型模式,每次使用是创建。

每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。 

  3、Request:一次 request 一个实例
在一次 Http 请求中,容器会返回该 Bean 的同一实例。而对不同的 Http 请求则会产生新的 Bean,而且该 bean 仅在当前 Http Request 内有效,当前 Http 请求结束,该 bean实例也将会被销毁。

  4、session

在一次 Http Session 中,容器会返回该 Bean 的同一实例。而对不同的 Session 请求则会创建新的实例,该 bean 实例仅在当前 Session 内有效。同 Http 请求相同,每一次session 请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的 session 请求内有效,请求结束,则实例将被销毁

  5、global Session
在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例,仅在使用 portlet context 时有效。
  五种作用域中,request、session和global session三种作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

四、IOC 依赖注入

按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。

五、spring上下文

可以简单的理解成就是将你需要Spring帮你管理的对象放入容器的一种容器对象——是的,应用上下文即是Spring容器的一种抽象化表述

六、Bean实例生命周期的执行过程如下:

  • Spring对bean进行实例化,默认bean是单例;

  • Spring对bean进行依赖注入;

  • 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;

  • 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;

  • 如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;

  • 如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;

  • 如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;

  • 如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;

  • 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;

  • 若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;

原文地址:https://www.cnblogs.com/gushiye/p/13983704.html