剖析Bean工厂接口,源码理解不复杂

剖析Bean工厂接口,源码理解并不难

前日在研习Spring框架的相关内容时,接触到了IOC部分,可彼时实在难以领会其内涵,虽说有提及源码方面的讲解,但并未完全弄通透,于是心想不妨自己去研读源码。

这是我绘制的Bean Factory大致关系图,为了便于理解,已删去了bean别名管理接口(AliasRegistry)和bean定义接口(BeanDefinitionRegistry)。

BeanFactory具备三个子类,分别是ListableBeanFactoryHierarchicalBeanFactoryConfigurableBeanFactory以及AutowireCapableBeanFactory

我们先来看BeanFactory,它仅仅实现了IOC容器的基本行为规范,就好比是让需求方提出对目标的诉求。

public interface BeanFactory {
    //用于区分由FactoryBean创建的bean,若指定名称的bean是FactoryBean,那么获取时返回的将是Factory本身,而非Factory所创建的实例。
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

ListableBeanFactory定义了工厂Bean的可列举特性,适用于对bean进行批量操作的情形。

public interface ListableBeanFactory extends BeanFactory {
    boolean containsBeanDefinition(String var1);

    int getBeanDefinitionCount();

    String[] getBeanDefinitionNames();

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1, boolean var2);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1, boolean var2);

    String[] getBeanNamesForType(ResolvableType var1);

    String[] getBeanNamesForType(ResolvableType var1, boolean var2, boolean var3);

    String[] getBeanNamesForType(@Nullable Class<?> var1);

    String[] getBeanNamesForType(@Nullable Class<?> var1, boolean var2, boolean var3);

    <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;

    <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1, boolean var2, boolean var3) throws BeansException;

    String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1);

    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException;

    @Nullable
    <A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    <A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2, boolean var3) throws NoSuchBeanDefinitionException;
}

HierarchicalBeanFactory定义了Bean Factory的分层能力,之前还不了解Bean Factory可以有父子容器之分,这有点像继承关系,子类能够调用父类的方法,但父类无法调用子类的方法。

在Spring MVC中存在这样的分层:根上下文(由ContextLoaderListener或者Spring Boot创建)作为父容器,用于放置服务层、数据访问层以及基础设施bean(如DataSource);而DispatcherServlet的上下文作为子容器,用来定义Web层特定的bean,像控制器、HandlerMapping等。

public interface HierarchicalBeanFactory extends BeanFactory {
    @Nullable
    BeanFactory getParentBeanFactory();

    boolean containsLocalBean(String var1);
}

ConfigurableBeanFactory定义了自定义Bean工厂的能力,能够进行自定义类加载器的设置、bean定义的管理、作用域的配置以及依赖关系的处理等。

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
    // 自定义类加载器
    void setBeanClassLoader(@Nullable ClassLoader var1);
    @Nullable
    ClassLoader getBeanClassLoader();
    void setTempClassLoader(@Nullable ClassLoader var1);
    @Nullable
    ClassLoader getTempClassLoader();

    // bean 定义
    void setCacheBeanMetadata(boolean var1);
    boolean isCacheBeanMetadata();
    BeanDefinition getMergedBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
    boolean isFactoryBean(String var1) throws NoSuchBeanDefinitionException;

    // 作用域
    void registerScope(String var1, Scope var2);
    String[] getRegisteredScopeNames();
    @Nullable
    Scope getRegisteredScope(String var1);

    // 依赖关系
    void registerDependentBean(String var1, String var2);
    String[] getDependentBeans(String var1);
    String[] getDependenciesForBean(String var1);

    ......
    ......
}

AutowireCapableBeanFactory实现了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 */
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;
    String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";

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

    void autowireBean(Object var1) throws BeansException;

    Object configureBean(Object var1, String var2) throws BeansException;

    Object createBean(Class<?> var1, int var2, boolean var3) throws BeansException;

    Object autowire(Class<?> var1, int var2, boolean var3) throws BeansException;

    void autowireBeanProperties(Object var1, int var2, boolean var3) throws BeansException;

    void applyBeanPropertyValues(Object var1, String var2) throws BeansException;

    Object initializeBean(Object var1, String var2) throws BeansException;

    Object applyBeanPostProcessorsBeforeInitialization(Object var1, String var2) throws BeansException;

    Object applyBeanPostProcessorsAfterInitialization(Object var1, String var2) throws BeansException;

    void destroyBean(Object var1);

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

    Object resolveBeanByName(String var1, DependencyDescriptor var2) throws BeansException;

    @Nullable
    Object resolveDependency(DependencyDescriptor var1, @Nullable String var2) throws BeansException;

    @Nullable
    Object resolveDependency(DependencyDescriptor var1, @Nullable String var2, @Nullable Set<String> var3, @Nullable TypeConverter var4) throws BeansException;
}

在看完这些接口类和接口方法后,对IOC容器有了更为拓展的认识。其实源码并没有那么难以理解,通常可以先通过一个类向上找到其基类,然后再往下深入查看详细的接口类以及实现类,从而对其形成全局的认知。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12857.html

(0)
LomuLomu
上一篇 2025 年 7 月 10 日
下一篇 2025 年 7 月 15 日

相关推荐

  • 2025年最新DataGrip激活码分享 | 永久破解DataGrip全攻略(支持2099年)

    本方法适用于Jetbrains全家桶,包括DataGrip、PyCharm、IDEA、Goland等所有产品! 先给大家展示最新DataGrip版本成功破解的截图,可以看到已经完美激活到2099年,非常稳定可靠! 下面我将用详细的图文教程,手把手教你如何将DataGrip永久激活至2099年。这个方法不仅适用于最新版本,对之前的旧版本也同样有效! 支持Win…

    DataGrip激活码 2025 年 7 月 7 日
    43200
  • 永久pycharm激活码配合最新pycharm破解激活指南

    重要提示:本篇文章所涉及的PyCharm破解补丁与激活码均来源于网络收集,严禁用于商业用途,仅限个人学习研究使用。若内容存在侵权问题,请联系我进行删除。经济条件允许的话,强烈建议支持官方正版!话不多说,先来看看PyCharm 2025.2.1版本破解成功的实例截图,如图所示,激活期限已直达2099年,效果非常理想! 若您觉得破解过程过于繁琐,也可选择购买官方…

    PyCharm激活码 2026 年 3 月 19 日
    15000
  • 2025年最新DataGrip激活码与永久破解教程(支持2099年)

    本方法适用于JetBrains全家桶,包括DataGrip、IDEA、PyCharm、Goland等所有产品! 先展示最新DataGrip版本成功破解的截图,可以看到已经完美激活到2099年,运行非常稳定! 下面通过详细的图文教程,一步步教你如何将DataGrip永久激活至2099年。 这个方法不仅适用于最新版本,之前的旧版本也同样有效! 兼容所有操作系统:…

    DataGrip激活码 2025 年 8 月 30 日
    35200
  • IntelliJ IDEA 激活码使用后未生效,排查步骤详解

    重要声明:本教程所涉及的IntelliJ IDEA破解补丁及激活码均来源于网络收集,仅限个人学习研究使用,严禁用于商业用途。如有侵权问题,请联系作者删除。条件允许的情况下,强烈建议购买官方正版授权! 话不多说,先给大家展示一下 IDEA 2025.2.1 版本破解成功的界面截图,可以看到激活有效期已经到2099年了,非常稳定! 下面将通过图文详解的方式,手把…

    IDEA破解教程 2026 年 4 月 10 日
    5400
  • chatgpt付费版怎么开通先定目标

    想弄清 chatgpt付费版怎么开通,先别急着找入口或支付方式。真正更重要的是,你未来一周到底准备用它完成什么任务:是每天都要写内容、整理资料、做翻译,还是只是临时体验两三次。把使用目标写具体,后面判断 chatgpt plus订阅 是否值得、什么时候开、开通后要不要续费,才不会只盯着“开通”这一步。 如果你已经准备好开通或续费,下面这个入口更省时间,也更适…

    ChatGPT 2026 年 4 月 24 日
    5300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信