AutowireCapableBeanFactory学习

简介

AutowireCapableBeanFactory 是 Spring 框架中的一个核心接口,它位于 org.springframework.beans.factory.config 包中。这个接口的主要职责是控制 bean 的自动装配(autowiring)过程。自动装配是 Spring 容器中管理 bean 的一种方式,允许 Spring 容器自动地将一个 bean 的依赖关系注入到另一个 bean 中,而无需在 bean 的配置文件中显式地声明这些依赖关系。

AutowireCapableBeanFactory 接口中定义了一些重要的方法,包括:

  • autowireBean(Object existingBean, int autowireMode):根据给定的自动装配模式,为现有的 bean 进行自动装配。
  • autowireBeanProperties(Object existingBean, int autowireMode, boolean override):根据给定的自动装配模式和是否覆盖现有属性的设置,为现有的 bean 的属性进行自动装配。
  • applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName):在 bean 初始化后,应用所有的 BeanPostProcessor。
  • initializeBean(Object existingBean, String beanName):初始化给定的 bean,包括应用 BeanPostProcessor 和执行任何自定义的初始化方法。
  • convertIfNecessary(Object oldValue, Class requiredType):如果必要,将给定的旧值转换为所需的类型。

在 Spring 的自动装配过程中,AutowireCapableBeanFactory 扮演着非常重要的角色。当 Spring 容器创建一个 bean 时,它首先会检查是否有任何依赖项需要注入。如果有,Spring 会尝试使用 AutowireCapableBeanFactory 来自动装配这些依赖项。

此外,AutowireCapableBeanFactory 还允许开发者在运行时动态地更改 bean 的自动装配模式和属性。这使得开发者能够更灵活地控制 bean 的装配过程,以满足特定的需求。

源码

public interface AutowireCapableBeanFactory extends BeanFactory {
 
    /**
     * 常量,用于标识外部自动装配功能是否可用。但是此标识不影响正常的(基于注解的等)自动装配功能的使用
     */
    int AUTOWIRE_NO = 0;
 
    /**
     * 标识按名装配的常量
     */
    int AUTOWIRE_BY_NAME = 1;
 
    /**
     * 标识按类型自动装配的常量
     */
    int AUTOWIRE_BY_TYPE = 2;
 
    /**
     * 标识按照贪婪策略匹配出的最符合的构造方法来自动装配的常量
     */
    int AUTOWIRE_CONSTRUCTOR = 3;
 
    /**
     * 标识自动识别一种装配策略来实现自动装配的常量
     */
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;
 
    /**
     * 创建一个给定Class的实例。
     * 执行此Bean所有的关于Bean生命周期的接口方法如BeanPostProcessor
     * 此方法用于创建一个新实例,它会处理各种带有注解的域和方法,并且会调用所有Bean初始化时所需要调用的回调函数
     * 此方法并不意味着by-name或者by-type方式的自动装配,如果需要使用这写功能,可以使用其重载方法
     */
    <T> T createBean(Class<T> beanClass) throws BeansException;
 
    /**
     * Populate the given bean instance through applying after-instantiation callbacks
     * 通过调用给定Bean的after-instantiation及post-processing接口,对bean进行配置。
     * 此方法主要是用于处理Bean中带有注解的域和方法。
     * 此方法并不意味着by-name或者by-type方式的自动装配,如果需要使用这写功能,可以使用其重载方法autowireBeanProperties
     */
    void autowireBean(Object existingBean) throws BeansException;
 
    /**
     * Configure the given raw bean: autowiring bean properties, applying
     * 配置参数中指定的bean,包括自动装配其域,对其应用如setBeanName功能的回调函数。
     * 并且会调用其所有注册的post processor.
     * 此方法提供的功能是initializeBean方法的超集,会应用所有注册在bean definenition中的操作。
     * 不过需要BeanFactory 中有参数中指定名字的BeanDefinition。
     */
    Object configureBean(Object existingBean, String beanName) throws BeansException;
 
 
    /**
     * 创建一个指定class的实例,通过参数可以指定其自动装配模式(by-name or by-type).
     * 会执行所有注册在此class上用以初始化bean的方法,如BeanPostProcessors等
     */
    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
 
    /**
     * 通过指定的自动装配策略来初始化一个Bean。
     * 此方法不会调用Bean上注册的诸如BeanPostProcessors的回调方法
     */
    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
 
    /**
     * 通过指定的自动装配方式来对给定的Bean进行自动装配。
     * 不过会调用指定Bean注册的BeanPostProcessors等回调函数来初始化Bean。
     * 如果指定装配方式为AUTOWIRE_NO的话,不会自动装配属性,但是依然会调用BeanPiostProcesser等回调方法。
     */
    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
            throws BeansException;
 
    /**
     * 将参数中指定了那么的Bean,注入给定实例当中
     * 此方法不会自动注入Bean的属性,它仅仅会应用在显式定义的属性之上。如果需要自动注入Bean属性,使用
     * autowireBeanProperties方法。
     * 此方法需要BeanFactory中存在指定名字的Bean。除了InstantiationAwareBeanPostProcessor的回调方法外,
     * 此方法不会在Bean上应用其它的例如BeanPostProcessors
     * 等回调方法。不过可以调用其他诸如initializeBean等方法来达到目的。
     */
    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
 
    /**
     * 初始化参数中指定的Bean,调用任何其注册的回调函数如setBeanName、setBeanFactory等。
     * 另外还会调用此Bean上的所有postProcessors 方法
     */
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
 
    /**
     * 调用参数中指定Bean的postProcessBeforeInitialization方法
     */
    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
            throws BeansException;
 
    /**
     * 调用参数中指定Bean的postProcessAfterInitialization方法
     */
    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException;
 
    /**
     * 销毁参数中指定的Bean,同时调用此Bean上的DisposableBean和DestructionAwareBeanPostProcessors方法
     * 在销毁途中,任何的异常情况都只应该被直接捕获和记录,而不应该向外抛出。
     */
    void destroyBean(Object existingBean);
 
 
    /**
     * 查找唯一符合指定类的实例,如果有,则返回实例的名字和实例本身
     * 和BeanFactory中的getBean(Class)方法类似,只不过多加了一个bean的名字
     */
    <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
 
    /**
     * 解析出在Factory中与指定Bean有指定依赖关系的Bean
     * 参数建下一个方法
     */
    Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException;
 
    /**
     * 解析指定Bean在Factory中的依赖关系
     * @param descriptor 依赖描述 (field/method/constructor)
     * @param requestingBeanName 依赖描述所属的Bean
     * @param autowiredBeanNames 与指定Bean有依赖关系的Bean
     * @param typeConverter 用以转换数组和连表的转换器
     * @return the 解析结果,可能为null
     */
    Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName,
            Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
}
  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值