Spring实战(二)Spring容器和bean的生命周期
引入问题:
在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了?
Spring容器——框架核心
1、什么是Spring容器?它的功能是什么?
在基于Spring的应用中,你的应用对象生存于Spring容器中。
Spring容器负责创建对象、装配对象、配置对象并管理它们的整个生命周期,from birth to death!!(也可以是new到finalize())
Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
2、Spring自带了多个容器实现,可以归为哪两种不同的类型?
- BeanFactory:最简单的容器,提供基本的DI支持(对多数应用很低级);
- 应用上下文:基于BeanFactory构建,提供框架级别的服务。
3、上一节提到,Spring中自带了多种Application Context的实现,他们的主要区别在于如何加载配置。罗列出常用的加载ApplicationContext的方式。
-
FileSystemXmlApplicationContext ---从文件系统下的一个或者多个XML配置文件架子啊上下文定义。在这里,您需要将XML bean配置文件的完整路径提供给构造函数。
-
ClassPathXmlApplicationContext---这个容器从一个XML文件中加载bean的定义。这里你不需要提供XML文件的完整路径,但是你需要正确设置CLASSPATH,这里把应用上下文的定义文件作为类资源。
-
WebXmlApplicationContext---该容器从Web应用下的一个或者多个XML配置文件加载上下文定义。
- AnnotationConfigApplicationContext---从基于Java的配置类中加载Spring应用上下文;
- AnnotationConfigWebApplicationContext---从基于Java的配置类中加载Spring Web应用上下文
4、使用文件系统和类路径加载ApplicationContext的代码差不多:
ApplicationContext context=new FileSystemXmlAplicaitonContext("c:/spring-mvc.xml");
ApplicaitonContext context=new ClassPathXmlApplicationContext("spring-mcv.xml");
(classpath就是存放.class等编译后文件的路径。)
5、从Java配置中加载ApplicationContext,把配置类的全路径作为参数。
ApplicationContext context=new AnnotationConfigApplicationContext(con.biguo.SpringConfig.class);
6、加载应用上下文后,怎么获取bean?
使用ApplicationContext对象的的getBean(xxx.class)方法从Spring容器中获取bean。
Spring中bean的生命周期
7、传统Java应用bean的声明周期:
new进行实例化后便可以使用bean,再由Java自动进行垃圾回收。
8、Spring中bean的生命周期很复杂,在bean准备就绪之前,bean工厂执行了多个启动步骤(调用了各种方法)。这些步骤也是Spring提供的扩展点,让开发者自定义bean 的创建过程。流如下:
- Spring对bean实例化;
- Spring将值和bean的引用注入到bean对应的属性;
- 如果bean实现了BeanNameAware接口,Spring将beande ID传递给setBeanName()方法;
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
- 如果bean实现了ApplicationContextAware接口,Spring将调用set Application Context()方法,将bean所在的应用上下文的引用传入进来;
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
- 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似的,如果bean使用了init-method声明了初始化方法,该方法也会被调用
- 调用自定义的初始化方法;
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
- bean准备就绪,可以使用了。它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
- 容器关闭
- 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用了destroy-method声明了销毁方法,该方法也会被调用。
这一节了解了如何创建和加载一个(空的)Spring容器,接下来会探讨如何将应用对象装配进Spring容器。