成都定制网站建设服,网站建设的一般流程是,网站建设是否需要源代码,凡科网商城充值什么是BeanFactory#xff1f;
BeanFactory是SpringIOC的最顶层接口#xff0c;涵盖了IOC容器最基本的操作。ListableBeanFactory、ConfigurableBeanFactory提供了IOC容器获取所有Bean、配置Bean的额外能力。所有BeanFactory的实现类持有所有Bean的定义BeanDefinition#…什么是BeanFactory
BeanFactory是SpringIOC的最顶层接口涵盖了IOC容器最基本的操作。ListableBeanFactory、ConfigurableBeanFactory提供了IOC容器获取所有Bean、配置Bean的额外能力。所有BeanFactory的实现类持有所有Bean的定义BeanDefinition用一个唯一的字符串即Bean的名字区分。BeanFactory提供单例Beansingleton 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. Springs 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;// 指定名字和类型getBeanT T getBean(String name, ClassT requiredType) throws BeansException;// 指定名字getBeanargs可以指定bean的构造器或者工厂方法的入参Object getBean(String name, Object... args) throws BeansException;// 指定类型getBeanT T getBean(ClassT requiredType) throws BeansException;// 指定类型getBeanT T getBean(ClassT requiredType) throws BeansException;// 指定类型获取bean的Provider用于按需加载、懒加载等场景T ObjectProviderT getBeanProvider(ClassT requiredType);// 指定类型获取bean的ProviderResolvableType作为通用类型入参不支持bean的集合T ObjectProviderT 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, ClassT requiredType)的区别?
getBean(String name, ClassT requiredType)在getBean(String name)能力基础上加了类型校验保证获取的bean是期望的类型。如果类型不一致会抛出BeanNotOfRequiredTypeException
BeanFactory首先提供了多个getBean的方法这也是IOC容器对外的核心能力。其次对Bean的作用范围单例or多例、Bean的类型、Bean的懒加载等提供了能力。 #mermaid-svg-STXq3pgMnnqD1cGI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .error-icon{fill:#552222;}#mermaid-svg-STXq3pgMnnqD1cGI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-STXq3pgMnnqD1cGI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-STXq3pgMnnqD1cGI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-STXq3pgMnnqD1cGI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-STXq3pgMnnqD1cGI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-STXq3pgMnnqD1cGI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-STXq3pgMnnqD1cGI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-STXq3pgMnnqD1cGI .marker.cross{stroke:#333333;}#mermaid-svg-STXq3pgMnnqD1cGI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-STXq3pgMnnqD1cGI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .cluster-label text{fill:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .cluster-label span{color:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .label text,#mermaid-svg-STXq3pgMnnqD1cGI span{fill:#333;color:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .node rect,#mermaid-svg-STXq3pgMnnqD1cGI .node circle,#mermaid-svg-STXq3pgMnnqD1cGI .node ellipse,#mermaid-svg-STXq3pgMnnqD1cGI .node polygon,#mermaid-svg-STXq3pgMnnqD1cGI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-STXq3pgMnnqD1cGI .node .label{text-align:center;}#mermaid-svg-STXq3pgMnnqD1cGI .node.clickable{cursor:pointer;}#mermaid-svg-STXq3pgMnnqD1cGI .arrowheadPath{fill:#333333;}#mermaid-svg-STXq3pgMnnqD1cGI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-STXq3pgMnnqD1cGI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-STXq3pgMnnqD1cGI .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-STXq3pgMnnqD1cGI .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-STXq3pgMnnqD1cGI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-STXq3pgMnnqD1cGI .cluster text{fill:#333;}#mermaid-svg-STXq3pgMnnqD1cGI .cluster span{color:#333;}#mermaid-svg-STXq3pgMnnqD1cGI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-STXq3pgMnnqD1cGI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} BeanFactory 获取Bean示例 获取Bean的provider Bean作用范围 获取Bean的类型 Bean的名称管理