Spring(二)容器

基于Spring的应用中你的应用对象生存与Spring容器中,Spring容器负责创建对象,装配他们的并管理他们整个声明周期,从生存到死亡
 容器使用依赖注入管理构成应用的组建,他会创建相互协作的组件之间的关联。
 Spring容器并不是只有一个,Spring自带了多个容器的实现,可以归为两种不同的类型:
        bean工厂(org.springframework.beans.factory.eanFactory)是最简单的容器,提供基本的DI支持
        ApplicationContext(org.springframework.context.ApplicationContext)基于Beanactory构建,并提供应用框架级别的服务,例如:从配置文件解析文本信息以及发布应用事件给感兴趣的事件监听者
        ApplicationContext使用比较多
ApplicationContext的实现
* AnnotationConfigApplicationContext:从一个或多个基于java配置类中加载Spring应用上下文。
 * AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载SpringWeb应用上下文
 * ClassPathXmlApplicationContext:从类路径下加载一个或者多个XML配置文件
 * FileSystemXmlApplicationContext:从文件系统下加载一个或者多个XML配置文件
 * XmlWebApplicationContext:从Web应用下加载一个或者多个XML配置文件

 无论是从文件系统装载应用为上下文还是从类路径下装载应用上下文,将bean加载到bean工厂的过程都是相似的。
ApplicationContext context = new FilSystemXmlApplicationContext("c:/knight.xml");
      ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");
使用FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别在与
 FileSystenXmlApplicationContext在指定的文件系统路径下找茬knight.xml文件
 ClassPathXmlApplicationContext是在所有的类路径下找茬knight.xml

 ApplicationContext准备完毕后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean
bean的声明周期
在传统的java应用中对象的声明周期很简单,使用java关键字new进行对象的示例化,然后该对对象就可以使用了
 一旦对象不再被使用,则由java自动进行垃圾回收。

 相比之下,Spring容器中的bean的声明周期就显得很复杂:
 实例化-->填充属性-->调用BeanameAware的seteaname()的方法-->调用BeanactoryAware的setBeanFactory()方法
 -->调用ApplicationContextAware的setApplicationContext()方法-->调用BeanPostProcessor的预初始化
 -->调用InitializingBean的afterPropertiesSet()方法-->调用自定义初始化方法-->调用BeanPostProcessor的初始化后的方法
 -->bean可以使用了
 -->容器关闭-->调用DisposableBean的destroy()方法-->调用自定义的销毁方法

详细步骤
1、Spring对bean进行实例化
2、Spring将值和bean的引用注入到bean对应的属性中
3、如果bean实现了Beanameware接口,Spring将bean的ID传递给setBeanName方法
4、如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
5、如果bean实现了ApplicationContextAware接口,Spring将调用他们的postProcessBeforeInitialization()方法
6、如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
7、如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法
类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
8、如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-
ProcessAfterInitialization()方法;
9、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10、如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法
该方法也会被调用。