Spring源码笔记之SpringIOC--(3)什么是BeanFactory?

举报
早点下班 发表于 2024/02/02 17:49:42 2024/02/02
【摘要】 什么是BeanFactory?BeanFactory是SpringIOC的最顶层接口,涵盖了IOC容器最基本的操作。ListableBeanFactory、ConfigurableBeanFactory提供了IOC容器获取所有Bean、配置Bean的额外能力。所有BeanFactory的实现类持有所有Bean的定义BeanDefinition,用一个唯一的字符串(即Bean的名字)区分。B...

什么是BeanFactory?

BeanFactory是SpringIOC的最顶层接口,涵盖了IOC容器最基本的操作。ListableBeanFactoryConfigurableBeanFactory提供了IOC容器获取所有Bean、配置Bean的额外能力。所有BeanFactory的实现类持有所有Bean的定义BeanDefinition,用一个唯一的字符串(即Bean的名字)区分。BeanFactory提供单例Bean(singleton scope)与多例Bean的能力(prototype scope),自从Spring2.0后Bean的作用范围不单单局限于单例与多例,还具有提供请求(request)与对话(session)级别的范围。BeanFactory是IOC容器注册Bean的入口,也是Bean配置中心。

Spring官方推荐使用构造器注入或者Setter注入(push模式)而不是依赖Spring查找bean的注入模式(pull模式)下面是Spring原文

/* Note that it is generally better to rely on Dependency Injection
 * ("push" configuration) to configure application objects through setters
 * or constructors, rather than use any form of "pull" configuration like a
 * BeanFactory lookup. Spring's Dependency Injection functionality is
 * implemented using this BeanFactory interface and its subinterfaces.
 */

~以上内容来自BeanFactory的代码注释与总结~

查看BeanFactory源码

public interface BeanFactory {
    // 前缀表示,用于解引用FactoryBean,获取FactoryBean本身而不是由其创建的bean
    String FACTORY_BEAN_PREFIX = "&";
    
    // 指定名字getBean
    Object getBean(String name) throws BeansException;
    
    // 指定名字和类型getBean
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    
    // 指定名字getBean,args可以指定bean的构造器或者工厂方法的入参
    Object getBean(String name, Object... args) throws BeansException;
    
    // 指定类型getBean
    <T> T getBean(Class<T> requiredType) throws BeansException;
    
    // 指定类型getBean
    <T> T getBean(Class<T> requiredType) throws BeansException;
    
    // 指定类型获取bean的Provider,用于按需加载、懒加载等场景
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
    
    // 指定类型获取bean的Provider,ResolvableType作为通用类型入参,不支持bean的集合
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
    
    // 判断是否包含指定名称的bean 	
    boolean containsBean(String name);
    
    // 判断指定名称的bean是否是单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    
    // 判断指定名称的bean是否是多例
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    
    // 判断bean的名称与类型是否匹配
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    
    // 判断bean的名称与类型是否匹配
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    
    // 获取指定名称bean的类型
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    
    // 获取指定名称bean的类型,是否允许其初始化是为了获取FactoryBean生成的类型
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    
    // 获取bean的别名
    String[] getAliases(String name);
}

看完上述代码后可能会有几个问题:

  • 什么是FactoryBean?

FactoryBean是一个接口,用于定义实现工厂模式的Bean。它允许我们自定义Bean的实例化逻辑,从而对Bean的创建过程进行更多的控制。FactoryBean可以使得我们在Spring容器中使用非标准的Bean对象。

  • getBean(String name)getBean(String name, Class<T> requiredType)的区别?

getBean(String name, Class<T> requiredType)getBean(String name)能力基础上加了类型校验,保证获取的bean是期望的类型。如果类型不一致会抛出BeanNotOfRequiredTypeException

BeanFactory首先提供了多个getBean的方法,这也是IOC容器对外的核心能力。其次对Bean的作用范围(单例or多例)、Bean的类型、Bean的懒加载等提供了能力。

BeanFactory
获取Bean示例
获取Bean的provider
Bean作用范围
获取Bean的类型
Bean的名称管理
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。