在Spring中,含有两个重要的Container,用于管理这些javabean他们是BeanFactory和ApplicationContext。其中ApplicationContext继承了BeanFactory的所有功能,还提供了i18n、统一载入资源、事件分发等功能。
在BeanFactory中,所有的bean对象的创建都是lazy的,包括那些singleton bean。只有javabean对象必须被使用的时候,才会创建该对象,才会正式的解析相应的xml标记,解析该bean的property等。但是在ApplicationContext,它可以预先载入sigleton bean,而不是直到使用时才创建。
BeanFactory最常用的实现是XmlBeanFactory,载入“定位xml”文件:
BeanFactory factory = new XmlBeanFactory(new FileInputStream("beans.xml"));
ApplicationContext有三种实现:ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext。其中前两者也是基于路径的,和BeanFactory的xml文件定位方式一致。
ApplicationContext context =new FileSystemXmlApplicationContext("c:/foo.xml");
ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");
BeanFactory管理Bean对象的生命周期:
1、 使用构造函数创建Bean对象
2、 Bean对象autowire被执行
3、 Bean对象调用各项setXXX方法
4、 如果该Bean实现了BeanNameAware接口,则调用该对象的setBeanName()方法,设置其ID(已经在xml配置文件中写好了)
5、 如果该Bean实现了BeanFactoryAware接口,则调用该对象的setBeanFactory()方法,传入BeanFactory对象自身
6、 如果已经配置了BeanPostProcessor,那么调用BeanPostProcessors的pre-
ProcessBeforeInitialization()方法,对该Bean对象进行处理;
7、 如果该bean自定义了init()方法,那么调用此方法
8、 如果已经配置了BeanPostProcessor,那么调用该BeanPostProcessors的post
ProcessBeforeInitialization()方法,对该Bean对象进行处理
9、 正常使用
10、 系统销毁,如果该bean对象实现了DisposableBean接口,则调用其destory()方法,
11、 最后调用用户在配置文件中编写的destroy-method