spring学习----BeanFactory

 

Spring的IOC容器就是一个实现了BeanFactory接口的可实例化类。

    BeanFactory从名字上都可以看出,采用了工厂模式。应用程序将Bean的创建交给Beanfactory,然后从BeanFactory获取Bean并使用它们,流程图如下:


 

Bean初始化流程:

(1)容器根据XML配置文件中Bean的定义实例化一个Bean,并传入必要的构造方法参数。

(2)容器根据XML配置文件使用设置Bean的属性

(3)如果Bean实现了BeanNameAware接口,调用其setBeanName()方法

(4)如果Bean实现了BeanClassLoaderAware接口,调用其setBeanClassLoader()方法

(5)如果Bean实现了BeanFactoryAware接口,调用其setBeanFactory()方法

(6)如果使用ApplicationContext并且Bean实现了ResourceLoaderAware接口,调用其setResourceLoader()方法

(7)如果使用ApplicationContext并且Bean实现了ApplicationEventPublisherAware接口,调用其setApplicationEventPublisher()方法

(8)如果使用ApplicationContext并且Bean实现了MessageSourceAware接口,调用其setMessageSource()方法

(9)如果使用ApplicationContext并且Bean实现了ApplicationContextAware接口,调用其setApplicationContext()方法

(10)如果使用WebApplicationContext并且Bean实现了ServletContextAware接口,调用其setServletContext()方法,仅对Web应用程序有效

(11)如果关联了BeanPostProcessor,调用BeanPostProcessor的postProcessBeforeInitialization()方法

(12)如果实现了InitializingBean接口,调用其afterPropertiesSet()方法执行一些初始化工作

(13)如果Bean定义了init-method方法,调用这个方法执行一些初始化工作

(14)如果关联了BeanPostProcessor,调用BeanPostProcessor的postProcessAfterInitialization()方法

执行完上述步骤,Bean就处于就绪状态,可以从spring容器中获取了

 

Bean的销毁流程:

(1)如果Bean实现了DisposableBean接口,调用其destroy()方法执行资源清理等工作

(2)如果Bean定义了destroy-method方法,调用这个方法执行资源清理等工作

 

Bean的流程可以从BeanFactory源代码注释中完全看出来:

 

/* <p>Bean factory implementations should support the standard bean lifecycle interfaces
 * as far as possible. The full set of initialization methods and their standard order is:<br>
 * 1. BeanNameAware's <code>setBeanName</code><br>
 * 2. BeanClassLoaderAware's <code>setBeanClassLoader</code><br>
 * 3. BeanFactoryAware's <code>setBeanFactory</code><br>
 * 4. ResourceLoaderAware's <code>setResourceLoader</code>
 * (only applicable when running in an application context)<br>
 * 5. ApplicationEventPublisherAware's <code>setApplicationEventPublisher</code>
 * (only applicable when running in an application context)<br>
 * 6. MessageSourceAware's <code>setMessageSource</code>
 * (only applicable when running in an application context)<br>
 * 7. ApplicationContextAware's <code>setApplicationContext</code>
 * (only applicable when running in an application context)<br>
 * 8. ServletContextAware's <code>setServletContext</code>
 * (only applicable when running in a web application context)<br>
 * 9. <code>postProcessBeforeInitialization</code> methods of BeanPostProcessors<br>
 * 10. InitializingBean's <code>afterPropertiesSet</code><br>
 * 11. a custom init-method definition<br>
 * 12. <code>postProcessAfterInitialization</code> methods of BeanPostProcessors
 *
 * <p>On shutdown of a bean factory, the following lifecycle methods apply:<br>
 * 1. DisposableBean's <code>destroy</code><br>
 * 2. a custom destroy-method definition
 *
 */
public interface BeanFactory {...}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值