第三章 spring-bean之AutowireCapableBeanFactory(6)

前言

AutowireCapableBeanFactory接口的实现类是AbstractAutowireCapableBeanFactory。AutowireCapableBeanFactory接口的作用是通过多种方式创建bean,执行bean的生命周期,bean处理,依赖解决等。AutowireCapableBeanFactory提供的功能实在用得太少了,实在不重要。整个设计,实现比较复杂。但是AbstractAutowireCapableBeanFactory里面一些方法确实整个BeanFactory核心,重要的处理流程。

AutowireCapableBeanFactory详解

public interface AutowireCapableBeanFactory extends BeanFactory {

	<T> T createBean(Class<T> beanClass) throws BeansException;

	Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

	Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

	void autowireBean(Object existingBean) throws BeansException;

	Object configureBean(Object existingBean, String beanName) throws BeansException;

	void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
			throws BeansException;

	void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

	Object initializeBean(Object existingBean, String beanName) throws BeansException;

	Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;

	Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;

	void destroyBean(Object existingBean);


	<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

	Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException;

	Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;

}

从上面的接口声明的方法看AutowireCapableBeanFactory主要有如下功能

  • 手动创建bean
  • 手动初始化bean
  • 手动销毁bean
  • 手动执行BeanPostProcessor对bean的助理
  • 通过class获得class对应的beanNaem(详情请看:resolveNamedBean方法的实现)
创建bean

| | 实例化 | 初始化 | 依赖解决 | 完整bean处理流程 | ------------ | ------------ | | autowireBean | 否 | 否 | 是 | 否 | | autowireClass | 是 | 否 | 是 | 否 | | configureBean | 否 | 是 | 是 | 否 | | createBead(Class ) | 是 | 是 | 是| 是|

细节如下

  • 如果传递的是object对象,那么就不需要实例化对象了,
  • 完整bean处理流程请看第五章 spring-connet之bean生命周期与bean监控 。如果标记为“否”表示只会经历InstantiationAwareBeanPostProcessor接口的对bean的处理。详细请看populateBean方法
  • 注意上面所有的方法产生的对象都是非单列对象(所有方法里面有一行这样的代码 bd.setScope(BeanDefinition.SCOPE_PROTOTYPE) ),同时不会进行任何的缓存。
  • autowireClass与createBead重载方法中有dependencyCheck是否进行依赖检查,autowireMode形参是表示自动装配模式。dependencyCheck为true表示检查autowireMode模式下的依赖关系
  • 注意手动调用容器销毁bean,可能会把依赖的bean也会摧毁

AbstractAutowireCapableBeanFactory

回顾下bean的生命周期与bean监控

  1. 开始创建bean ,调用createBean()方法
  2. 执行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(被resolveBeforeInstantiation方法调用)
    1. 如果有过有对象返回,
  3. doCreateBean开始其他流程
    1. createBeanInstance实例化bean操作,
      1. 调用determineConstructorsFromBeanPostProcessors方法(该方法会调用SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors方法)
      2. 实例化bean(实例化方式有两种)
        1. autowireConstructor()
        2. instantiateBean()
    2. applyMergedBeanDefinitionPostProcessors( 方法里面执行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition)
    3. populateBean
      1. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
      2. InstantiationAwareBeanPostProcessor.postProcessPropertyValues
    4. initializeBean
      1. invokeAwareMethods( 注入aware子接口)
      2. applyBeanPostProcessorsBeforeInitialization(里面调用BeanPostProcessor.postProcessBeforeInitialization)
      3. invokeInitMethods(初始化spring bean)
      4. applyBeanPostProcessorsAfterInitialization(里面调用beanProcessor.postProcessAfterInitialization)
    5. registerDisposableBeanIfNecessary (检查bean是否需要执行销毁流程)

在这鸟菜啊说句:抱歉。这么复杂的源码流程,实在没有办法用一种比较可读,流利的文字给描述出来,大家可以按照文字表示的流程,逐步观看。多看几次,就可以看懂了。

总结

AbstractAutowireCapableBeanFactory就做了两件事

  • 手动获得spring bean。主要是解决依赖关系。
  • 完整的spring bean生命周期与 spring bean的监控

转载于:https://my.oschina.net/u/1261452/blog/1922668

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值