欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring的IOC容器

程序员文章站 2022-05-23 10:20:16
...

Spring 的IOC容器

一、IOC的概念(和DI表达的是一个意思)

IOC(Inverse of Control)包括两方面内容:控制、反转。

对软件来说,即某一接口的实现类的选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借由Bean配置来进行控制。

IOC的概念太难理解,后来就有人起了另一个名——DI(Dependency Injection)依赖注入。

二、BeanFactory和ApplicationContext

BeanFactory使管理不同类型的Java对象成为可能。ApplicationContext(应用上下文)是建立在BeanFactory之上,提供了更多面向应用的功能。

一般称BeanFactory为IOC容器,而称ApplicationContext为应用上下文。有时我们也称ApplicationContext称为Spring容器。

BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者。

几乎所有的场合都可以直接使用ApplicationContext,而非底层的BeanFactory。

代码示例:

三、WebApplicationContext

web 应用和普通应用的区别:Web应用,通过浏览器就可以访问。

WEB容器在启动的时候,会为每个WEB应用程序创建一个ServletContext,它代表了当前的WEB应用。

WebApplicationContext 是专门为Web应用准备的,它允许从相对于Web根目录的路径中装配文件完成初始化工作。

WebApplicationContext 扩展了 ApplicationContext。

3.1 WebApplicationContext的初始化

因为WebApplicationContext需要ServletContext实例,所以它必须在拥有Web容器的前提下才能完成启动工作。

可以在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助二者中的任何一个,就可以完成WebApplicationContext的初始化。

(1)通过配置Servlet来启动WebApplicationContext

<!--    声明Web容器的监听器, 用于启动 WebApplicationContext -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

(2)通过配置监听器来启动WebApplicationContext

<servlet>
        <servlet-name>springContextLoaderServlet</servlet-name>
        <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
</servlet>

四、Bean的声明周期

4.1 BeanFactory中Bean的生命周期

开始:通过getBean()调用某一个Bean

实例化:

(1)如果容器注册了InstantiationAwareBeanPostProcessor,在实例化Bean之前,调用postProcessBeforeInstantiation()方法;

(2)根据配置情况调用Bean的构造函数或工厂方法实例化Bean;

(3)如果容器注册了InstantiationAwareBeanPostProcessor,在实例化Bean之后,调用postProcessAfterInstantiation()方法;

设置属性

(4)如果Bean配置了属性,那么容器将配置值设置到Bean对应的属性中,不过在设置每个属性之前将先调用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues()方法;

(5)调用Bean的属性设置方法设置属性值;

(6)如果Bean实现了org.springframework.beans.factory.BeanNameAware接口,则将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中;

(7)如果Bean实现了org.springframework.beans.factory.BeanFactoryAware接口,则将调用setBeanFactory()接口方法,将配置文件中该Bean对应的名称设置到Bean中;

**(8)**如果BeanFactory装配了BeanPostProcessor,则将调用BeanPostProcessorObject postProcessBeforeInitialization(Object bean, String beanName)接口方法对Bean进行操作。

其中入参bean是当前正在处理的Bean,而beanName是当前Bean的配置名,返回的对象为加工处理后的Bean。

BeanPostProcessor在Spring框架中占有重要的地位,为容器提供对Bean进行后续加工处理的切入点。Spring容器所提供的各种“神奇功能”(如AOP、动态代理等)都通过BeanPostProcessor实施。

(9)如果Bean实现了InitializingBean接口,则将带哦用接口的afterPropertiesSet()方法;

(10)如果在<bean>中通过init-method属性定义了初始化方法,则将执行这个方法;

**(11)**如果BeanFactory装配了BeanPostProcessor,则将调用BeanPostProcessorObject postProcessAfterInitialization(Object bean, String beanName)接口方法;

(12)如果在<bean>中指定Bean的作用范围为scope="prototype",则将Bean返回给调用者,调用者负责Bean后续生命的管理;如果作用范围为scope="singleton",则将Bean放入SpringIOC容器的缓存池中,并将Bean引用返回给调用者,Spring继续对这些Bean进行后续的生命管理;

(13)对于scope="singleton"的Bean(默认情况),当容器关闭时,将触发Spring对Bean后续生命周期的管理工作。如果Bean实现了DisposableBean接口,则将调用接口的destory()方法;

(14)对于scope="singleton"的Bean,如果通过<bean>destory-method属性指定了Bean的销毁方法,那么Spring将执行Bean的这个方法。

4.2 ApplicationContext中Bean的生命周期

和BeanFactory的生命周期比较类似,不同的地方:

在4.1的第一步之前加一步:调用BeanFactoryPostProcesseorpostProcessBeanFactory方法对工厂定义信息进行后处理;

在4.1对第七步下面加一步:调用ApplicationContextAwaresetApplicationContext()方法。