在Spring框架沒有出現(xiàn)之前,在Java語言中,程序員們創(chuàng)建對象一般都是通過關(guān)鍵字new來完成,那時流行一句話“萬物即可new,包括女朋友”。但是這種創(chuàng)建對象的方式維護成本很高,而且對于類之間的相互關(guān)聯(lián)關(guān)系很不友好。鑒于這種情況,Spring框架應(yīng)運而生,Spring框架絕對是一款偉大、設(shè)計優(yōu)秀的框架,它的底層設(shè)計思想和應(yīng)用策略使它一直火熱到現(xiàn)在,并逐漸發(fā)展成為Spring生態(tài)。本篇內(nèi)容就為大家來介紹下Spring框架中IOC容器相關(guān)的接口和API解析。
一、IOC思想介紹
IOC,其實是Inversion of Control單詞的縮寫,中文的意思是控制反轉(zhuǎn),也被稱為依賴注入(DI)。這是一個過程,就是翻轉(zhuǎn)資源獲取的方向。把我們自己創(chuàng)建資源、向環(huán)境索取資源變成環(huán)境將資源準(zhǔn)備好,我們享受資源注入。
IOC容器介紹
在Spring框架提供的功能模塊中有一個功能叫做核心容器(Core Container)功能,這個核心容器的作用就是在Spring環(huán)境下使用任何功能都必須基于IOC容器。而這里的IOC容器主要包含管理組件對象的生命周期、實例化組件對象、管理組件對象之間的依賴關(guān)系等。該容器的設(shè)計替程序員屏蔽了組件創(chuàng)建過程中的大量細節(jié),極大的降低了使用門檻,大幅度提高了開發(fā)效率。
該容器的主要實現(xiàn)依賴于工廠模式(BeanFactory)+反射。
IOC容器類型
上述IOC容器介紹中說到,IOC容器主要是依賴于工廠模式+反射,在Spring框架中,其實也確實為我們提供了一個頂層接口:BeanFactory工廠接口。該接口是頂層接口,其內(nèi)部提供了能夠管理任何類型對象的高級配置機制(API)。
API介紹如下:
public interface BeanFactory {
/**
* 用于取消引用FactoryBean實例,并將其與FactoryBean創(chuàng)建的bean區(qū)分開來。
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 返回指定bean的實例,該實例可以是共享的或獨立的。此方法允許Spring BeanFactory用作Singleton或Prototype設(shè)計模式的替代。* 在Singleton bean的情況下,調(diào)用者可以保留對返回對象的引用。將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。
* @param 命名要檢索的bean的名稱
* @return bean的一個實例
* @throws 如果沒有具有指定名稱的bean,拋出
NoSuchBeanDefinitionException
* @throws 如果無法獲取bean,拋出BeansException
*/
Object getBean(String name) throws BeansException;
/**
* 返回指定bean的實例,該實例可以是共享的或獨立的。
* 與getBean(String)的行為相同,但如果bean不是所需類型,則通過拋出
BeanNotOfRequiredTypeException來提供類型安全性的度量。
* 這意味著在轉(zhuǎn)換結(jié)果正確時不能拋出ClassCastException,就像#getBean(String)一樣。將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。將詢問父工廠是否在此工廠實例中找不到bean。
* @param 命名要檢索的bean的名稱
* @param bean要匹配的類型,可以是接口或是超類
* @return 一個bean實例
* @throws 如果沒有具有指定名稱的bean,拋出
NoSuchBeanDefinitionException
* @throws 如果bean不是要求的類型,拋出
BeanNotOfRequiredTypeException
* @throws 如果bean不能創(chuàng)建,拋出BeansException
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
/**
* 返回指定bean的實例,該實例可以是共享的或獨立的。
* 允許指定顯式構(gòu)造函數(shù)參數(shù)/工廠方法參數(shù),覆蓋bean定義中指定的默認參數(shù)(如果有)。
* @param 命名要檢索的bean的名稱
* @param args 使用顯式參數(shù)創(chuàng)建bean實例時使用的參數(shù)(僅在創(chuàng)建新實例時應(yīng)用,而不是在檢索現(xiàn)有實例時應(yīng)用)
* @return 一個bean實例
* @throws 如果沒有具有指定名稱的bean,拋出
NoSuchBeanDefinitionException
* @throws 如果已經(jīng)給出了參數(shù)但受影響的bean不是Prototype,拋出
BeanDefinitionStoreException
* @throws 如果bean不能創(chuàng)建,拋出BeansException
*/
Object getBean(String name, Object... args) throws BeansException;
/**
* 返回唯一匹配給定對象類型的bean實例(如果有)。此方法進入ListableBeanFactory按類型查找區(qū)域,但也可以根據(jù)給定類型的名稱轉(zhuǎn)換為常規(guī)的按名稱查找。
* @param bean要匹配的類型,可以是接口或是超類
* @return 匹配所需類型的單個bean的實例
* @throws 如果沒有找到給定類型的bean,拋出
NoSuchBeanDefinitionException
* @throws 如果找到多個給定類型的bean,拋出
NoUniqueBeanDefinitionException
* @throws 如果無法創(chuàng)建bean,拋出BeansException
*/
<T> T getBean(Class<T> requiredType) throws BeansException;
/**
* 返回指定bean的實例,該實例可以是共享的或獨立的。
* 允許指定顯式構(gòu)造函數(shù)參數(shù)/工廠方法參數(shù),覆蓋bean定義中指定的默認參數(shù)(如果有)。此方法進入ListableBeanFactory按類型查找區(qū)域,但也可以轉(zhuǎn)換為傳統(tǒng)的按名稱查找 基于給定類型的名稱。
* @param requiredType bean要匹配的類型,可以是接口或是超類
* @param args 使用顯式參數(shù)創(chuàng)建bean實例時使用的參數(shù)(僅在創(chuàng)建新實例時應(yīng)用,而不是在檢索現(xiàn)有實例時應(yīng)用)
* @return 一個bean實例
* @throws 如果沒有找到給定類型的bean,拋出
NoSuchBeanDefinitionException
* @throws 如果已經(jīng)給出了參數(shù)但受影響的bean不是Prototype,拋出
BeanDefinitionStoreException
* @throws 如果無法創(chuàng)建bean,拋出BeansException
* @since 4.1
*/
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
/**
* 返回指定bean的提供程序,允許對實例進行惰性按需檢索,包括可用性和唯一性選項。
* @param requiredType bean要匹配的類型,可以是接口或是超類
* @return 相應(yīng)的提供者句柄
*/
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
/**
* 返回指定bean的提供程序,允許對實例進行惰性按需檢索,包括可用性和唯一性選項。
* @param requiredType bean要匹配的類型。可以是泛型類型聲明。請注意,此處不支持集合類型,與反射注入點相反。* 要以編程方式檢索與特定類型匹配的bean列表,請在此處將實際bean類型指定為參數(shù),然后使用
ObjectProvider.orderedStream()或其延遲流/迭代選項。
* @return 相應(yīng)的提供者句柄
*/
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
/**
* 此bean工廠是否包含bean定義或具有給定名稱的外部注冊的bean的singleton實例
* 如果給定的名稱是別名,它將被轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。
* 如果此工廠是分層的,將詢問任何父工廠是否在這個工廠實例中找不到bean。如果找到匹配給定名稱的bean定義或單例實例,則此方法將返回true。
* 無論命名bean定義是具體的還是抽象的,lazy還是eager的,作用域與否。因此,請注意此方法的true返回值不一定表示getBean將能夠獲取同名的實例。
* @param name 查詢的bean的名稱
* @return 給定名稱的bean是否存在
*/
boolean containsBean(String name);
/**
* 該Bean是否是共享的單例? 也就是說, getBean()方法總是返回相同的實例
* 注意:返回false的此方法不能清楚地表明是獨立的實例。它表示非單例實例,也可以對應(yīng)于作用域的bean。
* 使用isPrototype操作顯式檢查是否是獨立的實例。將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 查詢的bean的名稱
* @return 該bean是否有單例實例
* @throws 如果沒有給定名稱的Bean,拋出
NoSuchBeanDefinitionException
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 該bean是否是Prototype? 也就是說,getBean總會返回獨立實例嗎
* 注意:返回false的此方法不能清楚地指示單個對象。它表示非獨立實例,也可以對應(yīng)于范圍內(nèi)的bean。
* 使用isSingleton操作顯式檢查共享單例實例。將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 查詢的bean的名稱
* @return 這個bean是否總是提供獨立的實例
* @throws 如果沒有給定名稱的Bean,拋出
NoSuchBeanDefinitionException
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 檢查具有給定名稱的bean是否與指定的類型匹配。更具體地說,檢查對給定名稱的getBean調(diào)用是否將返回可分配給指定目標(biāo)類型的對象。
* 將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean的名稱.將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 查詢bean的名稱
* @param typeToMatch 要匹配的類型
* @return 如果Bean類型匹配,返回true;如果bean類型不匹配或不確定,返回false。
* @throws 如果沒有給定名稱的Bean,拋出
NoSuchBeanDefinitionException
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 檢查具有給定名稱的bean是否與指定的類型匹配。更具體地說,檢查對給定名稱的getBean調(diào)用是否將返回可分配給指定目標(biāo)類型的對象。
* 將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean的名稱.將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 查詢bean的名稱
* @param typeToMatch 要匹配的類型
* @return 如果Bean類型匹配,返回true;如果bean類型不匹配或不確定,返回false。
* @throws 如果沒有給定名稱的Bean,拋出
NoSuchBeanDefinitionException
*/
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 確定給定名稱的bean的類型。進一步來說,確定getBean方法為給定bean名稱返回的對象類型。對于FactoryBean,返回FactoryBean創(chuàng)建的對象類型,由FactoryBean.getObjectType()公開。
* 將別名轉(zhuǎn)換回相應(yīng)的規(guī)范bean名稱。將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 查詢的bean的名稱
* @return bean的類型, 或者不可確定返回null。
* @throws 如果沒有給定名稱的Bean,拋出
NoSuchBeanDefinitionException
*/
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 返回給定bean名稱的別名(如果有)。所有這些別名在getBean調(diào)用中使用時指向同一個bean。
* 如果給定名稱是別名,則對應(yīng)原始bean名稱和其他別名( 如果有的話)將返回,原始bean名稱是數(shù)組中的第一個元素。將詢問父工廠是否在此工廠實例中找不到bean。
* @param name 用于檢查別名的bean名稱
* @return 別名,如果沒有,則為空數(shù)組
*/
String[] getAliases(String name);
}
BeanFactory頂層接口內(nèi)部設(shè)計了上述API方法,所以它需要具體的實現(xiàn)類來實現(xiàn)這些方法,說到具體的實現(xiàn)類,那么我們就需要查看下該接口的子接口和相關(guān)實現(xiàn)類。我們借助開發(fā)工具IDEA來查看BeanFactory頂層接口的子接口和具體實現(xiàn)。
圖解:
我們可以看到,BeanFactory有三大派生的直屬接口,分別是:ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory。其中
(1)ListableBeanFactory子接口:提供容器中bean迭代的功能。如返回所有Bean的名字、容器中Bean的數(shù)量等。
(2)HierarchicalBeanFactory子接口:提供父容器的訪問功能,可通過 ConfigurableBeanFactory的setParentBeanFactory方法設(shè)置父容器,主要是為了實現(xiàn)Bean工廠的分層。
其中子容器可通過接口方法訪問父容器;通過 HierarchicalBeanFactory 接口, Spring 的 IOC 容器可以建立父子層級關(guān)聯(lián)的容器體系,子容器可以訪問父容器中的Bean,但父容器不能訪問子容器的Bean。
Spring 使用父子容器實現(xiàn)了很多功能,比如在 Spring MVC 中,展現(xiàn)層Bean位于一個子容器中,而業(yè)務(wù)層和持久層的Bean位于父容器中。這樣,展現(xiàn)層Bean就可引用業(yè)務(wù)層和持久層的Bean,而業(yè)務(wù)層和持久層的 Bean 則看不到展現(xiàn)層的Bean。
(3)AutowireCapableBeanFactory子接口:為 Spring 容器之外的Bean ,也就是處理未交由Spring管理的Bean ,提供依賴注入的功能。
二、接口具體分析
HierarchicalBeanFactory接口分析
// 繼承BeanFactory接口,父子級聯(lián)IOC容器的接口
public interface HierarchicalBeanFactory extends BeanFactory {
// 返回父Bean工廠,如果沒有,則返回null
@Nullable BeanFactory getParentBeanFactory();
/** 返回本地bean工廠, * 判斷是否包含給定名稱的bean,忽略父Bean工廠中定義的bean。這是containsBean的替代方案,忽略來自父bean工廠的給定名稱的bean。 */
boolean containsLocalBean(String name);}
ListableBeanFactory接口分析
//擴展了BeanFactory接口,提供了對bean的枚舉能力,
//即可以返回bean的實例集合,而不用像BeanFactory只能返回單個bean的實例
//注意:如果存在父容器的話該接口不會考慮父容器中的bean,只會返回當(dāng)前容器中的
beanpublic interface ListableBeanFactory extends BeanFactory {
// 根據(jù)Bean的名稱,判斷容器中是否包含bean的描述信息
boolean containsBeanDefinition(String beanName);
// 獲取容器中對應(yīng)組件對象Bean的描述信息數(shù)量
int getBeanDefinitionCount();
// 獲取容器中所有組件對象的Bean的描述信息
String[] getBeanDefinitionNames();
// 根據(jù)類型獲取容器中所有組件對象的bean名稱
String[] getBeanNamesForType(ResolvableType type);
String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);
String[] getBeanNamesForType(@Nullable Class<?> type);
String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
// 根據(jù)類型 獲取容器中的Bean對象
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;
// 根據(jù)注解類型,獲取容器中Bean組件對象的名稱
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
@Nullable <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException;}
AutowireCapableBeanFactory接口分析
//擴展了BeanFactory,主要提供了自動裝配能力,包含了bean的創(chuàng)建、注入配置、屬性配置、依賴解析、后置處理器前后的實例化、bean的實例化、bean的銷毀登
public interface AutowireCapableBeanFactory extends BeanFactory {
//無自動裝配
int AUTOWIRE_NO = 0;
//by-name裝配
int AUTOWIRE_BY_NAME = 1;
//by-type裝配
int AUTOWIRE_BY_TYPE = 2;
//constructor構(gòu)造函數(shù)裝配
int AUTOWIRE_CONSTRUCTOR = 3;
//自動裝配,已被標(biāo)記為過時
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
// 用給定的class創(chuàng)建一個Bean實例,完整經(jīng)歷一個Bean創(chuàng)建過程的生命周期節(jié)點回調(diào),但不執(zhí)行傳統(tǒng)的autowiring
<T> T createBean(Class<T> beanClass) throws BeansException;
// 用于(再次)填充指定Bean被注解的元素或方法(如@Resource @Autowired),不執(zhí)行傳統(tǒng)的autowiring
void autowireBean(Object existingBean) throws BeansException;
// 配置Bean
Object configureBean(Object existingBean, String beanName) throws BeansException;
// 用于細粒度控制bean生命周期的方法
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
// 將傳入的第一個參數(shù)按照spring中按name或者按type裝備的方法將傳入的Bean的各個properties給裝配上
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
// 初始化容器中的Bean
Object initializeBean(Object existingBean, String beanName) throws BeansException;
// 對Bean初始化前后應(yīng)用邏輯處理器
// 執(zhí)行BeanPostProcessor前置處理邏輯
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;
// 執(zhí)行BeanPostProcessor后置處理邏輯
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;
// 銷毀容器中的Bean
void destroyBean(Object existingBean);
// 根據(jù)傳入的類型,從Spring容器(包括父子容器)中查找出指定類型下唯一的Bean,并將beanName與beanInstance包裝成NamedBeanHolder對象返回
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
// 解析Bean需要的依賴
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames,@Nullable TypeConverter typeConverter) throws BeansException;
}
SimpleJndiBeanFactory實現(xiàn)類分析
該實現(xiàn)類是基于JndiLocatorSupport的BeanFactory實現(xiàn),并使用HashMap進行緩存處理。
這里需要注意的是SimpleJndiBeanFactory不支持枚舉的Bean定義,因此沒有實現(xiàn)ListableBeanFactory,而是直接實現(xiàn)的BeanFactory。
ApplicationContext接口分析
通過上述BeanFactory接口層級圖,我們可以看到,在HierarchicalBeanFactory接口下,有一子接口叫做ApplicationContext。
這里我們也說一下為什么單獨將該接口進行說明。
ApplicationContext隸屬于org.springframework.context,它在繼承BeanFactory接口的同時,同時還繼承了如下接口:
EnvironmentCapable, ListableBeanFactory,HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver
使ApplicationContext接口包含了IOC完整實現(xiàn)的同時,還在其基礎(chǔ)上擴展了許多功能。比如資源訪問、事件機制、國際化(il8n)等。而我們一般都稱ApplicationContext接口的具體實現(xiàn)類對象為ApplicationContext上下文,它為我們程序員良好運用Spring框架提供了很好的支持。
ApplicationContext接口源碼解析:
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
// 返回此應(yīng)用程序上下文的唯一id。返回:上下文的唯一id,如果沒有則返回null @Nullable String getId(); // 返回此上下文所屬的已部署應(yīng)用程序的名稱。返回:已部署應(yīng)用程序的名稱,默認情況下為空
String String getApplicationName();
// 返回此上下文的友好名稱。返回:該上下文的顯示名稱(從不為空)
String getDisplayName();
// 返回第一次加載此上下文時的時間戳。返回:該上下文第一次加載時的時間戳(毫秒)
getStartupDate();
// 返回父上下文,如果沒有父上下文并且這是上下文層次結(jié)構(gòu)的根,則返回null。返回:父上下文,如果沒有父上下文則返回null
@Nullable
ApplicationContext getParent();
/**
* 為此上下文公開
AutowireCapableBeanFactory功能。
* 除了初始化位于應(yīng)用程序上下文之外的bean實例,將Spring bean生命周期(全部或部分)應(yīng)用于它們之外,應(yīng)用程序代碼通常不使用它。
*/
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
接下來我們分析一下ApplicationContext繼承的接口,分析一下這些接口的作用及各自接口內(nèi)API方法的意義。
EnvironmentCapable接口分析
// EnvironmentCapable提供了getEnvironment方法,獲取當(dāng)前Spring的配置信息(環(huán)境變量、application.properties等)
public interface EnvironmentCapable {
// 讀取配置資源
Environment getEnvironment();
}
ApplicationEventPublisher接口分析
// 封裝事件發(fā)布功能的接口
@FunctionalInterfacepublic interface ApplicationEventPublisher {
// 將應(yīng)用程序事件通知與此應(yīng)用程序注冊的所有匹配偵聽器。事件可以是框架事件(例如ContextRefreshedEvent)或特定于應(yīng)用程序的事件
default void publishEvent(ApplicationEvent event) {
publishEvent((Object) event);
}
// 通知所有與此應(yīng)用程序注冊的事件匹配的偵聽器。如果指定的事件不是一個ApplicationEvent,它將被包裝在一個PayloadApplicationEvent中
// 這樣的事件發(fā)布步驟實際上是一個多播程序的交接,并不意味著同步或異步執(zhí)行,甚至根本不意味著立即執(zhí)行。我們鼓勵事件偵聽器盡可能高效,單獨使用異步執(zhí)行來進行長時間運行和可能阻塞的操作。
void publishEvent(Object event);
}
MessageSource接口分析
// 用于解析消息的策略接口,支持此類消息的參數(shù)化和國際化
public interface MessageSource {
// 嘗試解析該消息。如果沒有找到消息,則返回默認消息
@Nullable
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
// 嘗試解析該消息。如果無法找到該消息,則將其視為錯誤
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
// 嘗試使用傳入的MessageSourceResolvable參數(shù)中包含的所有屬性來解析消息。
// 注意:我們必須在此方法上拋出NoSuchMessageException,因為在調(diào)用此方法時,我們無法確定可解析對象的defaultMessage屬性是否為null。
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;}
ResourcePatternResolver接口分析
/**
* 根據(jù)路徑或者通配符獲取多個資源,用于將位置模式解析為Resource對象的策略接口。
* 可以用于任何類型的位置模式,該接口還建議為類路徑中的所有匹配資源添加一個新的資源前綴“classpath:”。
*/
public interface ResourcePatternResolver extends ResourceLoader {
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
// 用于讀取(指定位置下的)配置文件
Resource[] getResources(String locationPattern) throws IOException;
}
總結(jié)文章來源:http://www.zghlxwxcb.cn/news/detail-614394.html
上述內(nèi)容,為大家介紹了BeanFactory頂層接口下其相關(guān)子接口具體的作用以及接口提供的抽象api的作用。幫助大家在源碼層面理解Spring框架底層結(jié)構(gòu)設(shè)計。我們在知曉底層設(shè)計結(jié)構(gòu)之后,重點關(guān)注應(yīng)是在ApplicationContext接口及其實現(xiàn)上。文章來源地址http://www.zghlxwxcb.cn/news/detail-614394.html
到了這里,關(guān)于Spring中IOC容器常用的接口和具體的實現(xiàn)類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!