spring应用中,应用对象生存与容器(container)中,spring负责创建对象并装配它们,配置它们并管理它们的整个生命周期,从生存到死亡——new到finalize()
spring容器可归为两类
-
bean工厂(org.springframework.beans.factory.BeanFactory) 提供简单DI支持
-
应用上下文(org.springframework.context.ApplicationContext)基于BeanFactory构建,并提供框架服务,如配置解析
主流使用的是功能更加强大的应用上下文(ApplicationContext)
五种最常见的应用上下文加载:
AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载spring应用上下文
AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文
ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载应用上下文
FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文
XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义
直白一点,就是五种常见加载方式 Application context = new 某种Context(参数传资源位置) 如"a.b.c.class" / "F:/config.xml" / "config.xml" 等等
bean的生命周期
在传统Java中 bean的生命周期就是 new() ,当不再使用时,由gc自动进行垃圾回收
相比spring容器 bean的生命周期会复杂许多,理解bean生命周期非常重要,你可能需要利用spring提供的扩展接口自定义bean的创建过程
bean装载到spring应用上下文的生命周期过程如下:
实例化---->填充属性---->调用BeanNameAware setBeanName()---->调用BeanFactoryAware setBeanFactory()---->调用ApplicationContextAware setApplicationContext()---->调用BeanPostProcessor的预初始化方法---->调用InitializingBean的afterPropertiesSet()方法---->调用自定义的初始化方法---->调用BeanPostProcessor的初始化后方法
至此bean已经可以使用
当容器关闭 ——>调用DisposableBean的destroy()方法——>调用自定义销毁方法——>bean销毁
1.Spring首先对bean进行实例化、
2.Spring将值和bean的引用注入到bean对应的属性当中
3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFacotry容器实例传入
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
6.如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessBeforeInitialization()
7.如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法
8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()
9.Bean准备就绪,驻留在spring应用上下文
10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()方法,同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用