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

2024-02-20 19:04

本文主要是介绍Spring源码笔记之SpringIOC--(3)什么是BeanFactory?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是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本身而不是由其创建的beanString FACTORY_BEAN_PREFIX = "&";// 指定名字getBeanObject 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的名称管理

这篇关于Spring源码笔记之SpringIOC--(3)什么是BeanFactory?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729233

相关文章

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException