所谓装配(wiring),就是将组件状态到Spring容器中,并且在这些组件建立联系。
(一)BeanFactory vs ApplicationContext
Spring有两种容器:BeanFactory,ApplicationContext.其中ApplicationContext是BeanFactory的子接口。
BeanFactory使用工厂模式,用来创建和分配bean,它面向简单应用,常常用到的XmlBeanFactory是BeanFactory的一个重要实现,它应用于使用xml文件进行配置bean的应用。另外BeanFactory也参与Bean的生命周期,包含调用初始化和消亡相关的方法。
相关的方法举例:
BeanFactory beanFactory = new XmlBeanFactory(new FileInputStream("hello.xml"));
AClass aObject = (AClass)beanFactory.getBean("aId");
这样,aId对应的bean在Spring容器中的生命周期就开始了。
而ApplicationContext和BeanFactory类似,它有3个常用的实现:ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext
而ApplicationContext和BeanFactory的区别在于
1.BeanFactory中,当创建对应的BeanFactory时,bean并不会被构造,它们只会在需要时才会被构造出来;而ApplicationContext会在开始时对所有的单例(Singleton)bean进行预装载。
2.ApplicationContext还提供了其他的服务,例如,提供解决文本消息的方法,包含对这些方法的国际化;提供装载文件资源的generic方法;可以给bean发布事件,它具有更强大的功能,因此,在实际应用中使用更多。
(二)bean的生命周期
bean在可用之前,经过的步骤:
1.容器找到bean并进行实例化
2.利用依赖注入,Spring会设置bean的属性
3.如果Bean实现了BeanNameAware接口,那么容器会调用对应setBeanName()方法
4.如果bean实现了BeanFactoryAware(/ApplicationContextAware)接口,那么会调用对应的setBeanFactory()(setApplicationContext())方法
5.如果这个bean于任何BeanPostProcessor相关,那么调用对应的postProcessorBeforeInitialization()方法
6.如果init-method被指定,那么对应方法会被调用
7.如果bean与任何BeanPostProcessor相关,则调用对应的postProcessorAfterInitialization方法会被调用
经过这7个步骤后,bean就可以用了
当容器关闭时
1.如果bean实现了DisposableBean,那么对应的destroy()方法将被调用
2.如果destroy-method被指定,那么对应方法将被调用
经过这两步,bean就被销毁了