剖析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 日

相关推荐

  • 架构-初识BFF

    引言 晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。 除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。 这是我的架构第一课,听得有些似懂非懂,于是浅浅地整理一下。 BFF 是什么 BFF是服务于前端的后端,全称Backend For Frontend。B…

    2025 年 1 月 1 日
    34100
  • 🚀 2025年最新PyCharm激活码 & 永久破解教程(亲测有效,支持2099年)

    大家好!今天给大家带来一篇超详细的PyCharm破解教程,适用于2025年最新版本,亲测可用,激活后有效期直达2099年!🎉 无论是Windows、Mac还是Linux,无论你用的是PyCharm、IDEA还是其他Jetbrains全家桶,统统适用!💪 废话不多说,先上成功破解的截图,看看这效果👇 📥 下载PyCharm安装包 如果你已经安装好了PyChar…

    2025 年 6 月 6 日
    1.2K00
  • 2025年最新DataGrip激活码永久破解教程(支持2099年)

    本教程适用于Jetbrains全家桶,包括DataGrip、PyCharm、IDEA、Golang等开发工具! 先展示最新DataGrip版本成功破解的截图,有效期直达2099年,彻底解决数据库开发者的后顾之忧! 下面通过详细的图文教程,一步步教你如何永久激活DataGrip至2099年。 此方法不仅适用于最新版本,旧版本同样有效! 全平台兼容:Window…

    DataGrip激活码 2025 年 7 月 31 日
    28200
  • Java的栈与队列以及代码实现

    Java中的栈与队列 栈的基本概念(Stack) 栈的实现方式 栈的代码实现 队列(Queue) 队列的模拟实现(双链表) 循环队列(循环数组实现) 使用队列实现栈 使用栈实现队列 总结 栈的基本概念(Stack) 栈是一种基本的线性数据结构,遵循后进先出(LIFO)的原则。这意味着最后加入的元素将是第一个被移除的。栈的应用非常广泛,包括内存分配、表达式求值…

    2024 年 12 月 27 日
    38100
  • 2024 IDEA最新激活码,IDEA永久免费激活码2025-01-12 更新

    IDEA 2024最新激活码 以下是最新的IDEA激活码,更新时间:2025-01-12 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 IDEA 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 获取最新激活码: 实时更…

    2025 年 1 月 12 日
    96600

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信