十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
今天就跟大家聊聊有關(guān)Spring中如何向容器注冊(cè)Bean,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
首先我們需要了解一下是什么是Ioc。
Ioc是Spring的核心技術(shù)之一,全稱是Inversion of Control(控制反轉(zhuǎn))。最原始的創(chuàng)建對(duì)象的方法就是通過(guò)new來(lái)實(shí)現(xiàn)(手動(dòng)的編寫代碼實(shí)現(xiàn)):
new Hollow();
而Spring提供了Ioc容器用于對(duì)象的創(chuàng)建以及配置、管理、銷毀等。
控制:容器進(jìn)行組件代碼的控制和管理
反轉(zhuǎn):組件代碼的控制權(quán)由外部代碼轉(zhuǎn)移到了內(nèi)部容器 (程序員到容器)
當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象,這樣做降低了類之間的耦合程度。不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。
那么到底什么是容器?
從程序的角度,容器實(shí)際上就是某些特定接口的實(shí)現(xiàn)類的實(shí)例。
Spring提供了兩種不同的類型的容器:
Spring BeanFactory容器: 最簡(jiǎn)單的容器,給依賴注入提供了基本的支持
ApplicationContext容器: ApplicationContext 容器繼承自BeanFactory,它包括 BeanFactory 容器的所有功能,并對(duì)其功能進(jìn)行了擴(kuò)展。
Spring BeanFactory 容器
org.springframework.beans.factory.BeanFactor 接口
BeanFacotry是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory無(wú)法支持spring的許多插件,如AOP功能、Web應(yīng)用等。
ApplicationContext接口,它由BeanFactory接口派生而來(lái),ApplicationContext包含BeanFactory的所有功能,通常建議比BeanFactory優(yōu)先。
代碼:
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String var1) throws BeansException;T getBean(String var1, Class var2) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; T getBean(Class var1) throws BeansException; T getBean(Class var1, Object... var2) throws BeansException; ObjectProvider getBeanProvider(Class var1); ObjectProvider getBeanProvider(ResolvableType var1); boolean containsBean(String var1); boolean isSingleton(String var1) throws NoSuchBeanDefinitionException; boolean isPrototype(String var1) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, Class> var2) throws NoSuchBeanDefinitionException; @Nullable Class> getType(String var1) throws NoSuchBeanDefinitionException; String[] getAliases(String var1); }
getBean方法:從容器中獲取Bean對(duì)象
is方法:?jiǎn)卫?原型,bean類型的判斷
get方法:獲取Bean類型和別名
ApplicationContext 的主要實(shí)現(xiàn)類
ClassPathXmlApplicationContext:從 類路徑下加載配置文件
FileSystemXmlApplicationContext: 從文件系統(tǒng)中加載配置文件
ConfigurableApplicationContext:擴(kuò)展于 ApplicationContext,新增加兩個(gè)主要方法:refresh() 和 close(), 讓 ApplicationContext 具有啟動(dòng)、刷新和關(guān)閉上下文的能力
ApplicationContext:在初始化上下文時(shí)就實(shí)例化所有單例的 Bean。
WebApplicationContext: 是專門為 WEB 應(yīng)用而準(zhǔn)備的,它允許從相對(duì)于 WEB 根目錄的路徑中完成初始化工作
1、Bean配置信息(xml配置文件、配置類、注解)定義了Bean的實(shí)現(xiàn)及依賴關(guān)系,即Bean的配置信息
2、Spring容器根據(jù)各種形式的Bean配置信息在容器內(nèi)部建立Bean定義注冊(cè)表
3、容器根據(jù)注冊(cè)表加載、實(shí)例化Bean,并建立Bean和Bean的依賴關(guān)系,最后將這些準(zhǔn)備就緒的Bean放到Bean緩存池中,以供外層的應(yīng)用程序進(jìn)行調(diào)用
一、XML配置文件(使用類的無(wú)參構(gòu)造函數(shù))
配置文件
配置文件位置、名稱不固定,建議命名為applicationContext.xml
id:創(chuàng)建的對(duì)象名稱
class:需要進(jìn)行注冊(cè)的Bean全路徑
使用靜態(tài)工廠創(chuàng)建和使用實(shí)例工廠創(chuàng)建與使用類的無(wú)參構(gòu)造函數(shù)相似,不再介紹
測(cè)試方法
public void classBeanConfiguration() { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("config/applicationContext.xml"); System.out.println("從容器獲取Bean"+applicationContext.getBean("hollow")); }
二、java配置類
配置類
@Configuration public class SpringConfiguration { @Bean public HollowController hollowController(){ return new HollowController(); } }
測(cè)試類
@Test public void xmlBeanConfiguration1() { ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfiguration.class); System.out.println("從容器獲取Bean: "+applicationContext.getBean("hollowController")); }
三、注解
添加注解
@Controller public class AnnotationController { public AnnotationController() { System.out.println("annotationController創(chuàng)建了"); } }
開(kāi)啟掃描
@ComponentScan(value="com.example.bean_configuration.configuration.controller") @Configuration public class SpringConfiguration { }
或者
測(cè)試方法
@Test public void xmlBeanConfiguration1() { ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfiguration.class); System.out.println("從容器獲取Bean: "+applicationContext.getBean("annotationController")); }
注意:@Controller注解僅僅其標(biāo)記作用,開(kāi)啟注解掃描@ComponentScan后才會(huì)注冊(cè)Bean
看完上述內(nèi)容,你們對(duì)Spring中如何向容器注冊(cè)Bean有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。