Spring的IOC容器
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
,则将调用BeanPostProcessor
的Object 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
,则将调用BeanPostProcessor
的Object 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的第一步之前加一步:调用BeanFactoryPostProcesseor
的postProcessBeanFactory
方法对工厂定义信息进行后处理;
在4.1对第七步下面加一步:调用ApplicationContextAware
的setApplicationContext()
方法。
上一篇: maven 命令,不定期更新
下一篇: Spring中的Bean
推荐阅读
-
Docker搭建简单的应用栈与容器Hello World访问详解
-
Centos7下安装与卸载docker应用容器引擎的方法
-
Spring 使用JavaConfig实现配置的方法步骤
-
Spring boot @ModelAttribute标注的实现
-
通过实例解析spring bean之间的关系
-
spring AOP的After增强实现方法实例分析
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库
-
Spring中@Import的各种用法以及ImportAware接口
-
docker run启动的容器挂掉了,数据怎么办