BeanFactory
是SpringIOC的最頂層接口,涵蓋了IOC容器最基本的操作。ListableBeanFactory
、ConfigurableBeanFactory
提供了IOC容器獲取所有Bean、配置Bean的額外能力。所有BeanFactory
的實現(xiàn)類持有所有Bean的定義BeanDefinition
,用一個唯一的字符串(即Bean的名字)區(qū)分。BeanFactory
提供單例Bean(singleton scope)與多例Bean的能力(prototype scope),自從Spring2.0后Bean的作用范圍不單單局限于單例與多例,還具有提供請求(request)與對話(session)級別的范圍。BeanFactory
是IOC容器注冊Bean的入口,也是Bean配置中心。
Spring官方推薦使用構(gòu)造器注入或者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.
*/
以上內(nèi)容來自BeanFactory的代碼注釋與總結(jié)
查看BeanFactory
源碼
public interface BeanFactory {
// 前綴表示,用于解引用FactoryBean,獲取FactoryBean本身而不是由其創(chuàng)建的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的構(gòu)造器或者工廠方法的入?yún)?/span>
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作為通用類型入?yún)ⅲ恢С謆ean的集合
<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是一個接口,用于定義實現(xiàn)工廠模式的Bean。它允許我們自定義Bean的實例化邏輯,從而對Bean的創(chuàng)建過程進行更多的控制。FactoryBean可以使得我們在Spring容器中使用非標準的Bean對象。
getBean(String name)
與getBean(String name, Class<T> requiredType)
的區(qū)別?getBean(String name, Class<T> requiredType)
在getBean(String name)
能力基礎(chǔ)上加了類型校驗,保證獲取的bean是期望的類型。如果類型不一致會拋出BeanNotOfRequiredTypeException
BeanFactory
首先提供了多個getBean
的方法,這也是IOC容器對外的核心能力。其次對Bean的作用范圍(單例or多例)、Bean的類型、Bean的懶加載等提供了能力。
因篇幅問題不能全部顯示,請點此查看更多更全內(nèi)容
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號-2
違法及侵權(quán)請聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬商天勤律師事務所王興未律師提供法律服務