版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
IOC之基于Java類的配置Bean基于Java配置選項(xiàng),可以編寫大多數(shù)的spring不用配置XML,但有幾個(gè)基于Java的注釋的幫助下解釋。從Spring3.0開始支持使用java代碼來代替XML來配置Spring,基于Java配置Spring依靠Spring的JavaConfig項(xiàng)目提供的很多優(yōu)點(diǎn)。通過使用@Configuration,@Bean,@Importand,@DependsOnannotations來實(shí)現(xiàn)Java的配置Spring.本文工程下載@Configuration&@Bean注解:在Spring的新的Java-Configuration的中間產(chǎn)物是基于類的@Configuration的注解和基于方法的@Bean注解。@Bean注解是用來指明方法的實(shí)例化,配置和初始化一個(gè)對(duì)象是通過Spring的IoC容器來管理的。對(duì)于那些熟悉使用以XML配置Spring的<beans/>標(biāo)簽,@Bean注解和<bean/>標(biāo)簽是起相同作用的。你能和Spring的@Component注解的組件一起使用@Bean注解方法,然而,這些@Bean注解的方法通常是和@Configuration的Bean。@Configuration注解的類指明該類主要是作為一個(gè)bean的來源定義。此外,@Configurationd定義的classes允許在同一個(gè)類中使用@Bean定義的方法來定義依賴的bean注釋類與@Configuration表示這個(gè)類可以使用SpringIoC容器為bean定義的來源。在@Bean注解告訴Spring的注解為@Bean的一個(gè)方法將返回應(yīng)注冊(cè)為在Spring應(yīng)用程序上下文中的bean對(duì)象。最簡單可行的@Configuration類將如下所示:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片@ConfigurationpublicclassCompanyConfig{@BeanpublicEmployeeemployee(){returnnewEmployee();}}上面的代碼將等同于下面的XML配置:[html]viewplaincopy在CODE上查看代碼片派生到我的代碼片<beanid="companyConfig"class="com.mucfc.anno.CompanyConfig"/>下面注解為@Bean的方法名稱作為工作bean的id,它創(chuàng)建并返回實(shí)際的bean。配置類可以有聲明多個(gè)@Bean。一旦配置類定義,可以加載和提供他們使用AnnotationConfigApplicationContext如下,以Spring容器:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片publicstaticvoidmain(String[]args){ApplicationContextctx=newAnnotationConfigApplicationContext(CompanyConfig.class);Employeeemployee=ctx.getBean(Employee.class);employee.setName("笨笨");employee.setId(2012);System.out.println(employee);}也可以這樣寫:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.mucfc.anno;importorg.springframework.context.ApplicationContext;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassTest{publicstaticvoidmain(String[]args){AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext();ctx.register(CompanyConfig.class);ctx.refresh();Employeeemployee1=ctx.getBean(Employee.class);Employeeemployee2=ctx.getBean(Employee.class);employee1.setName("笨笨");employee1.setId(2012);employee2.setName("狂人");employee2.setId(34546);System.out.println("exployee1"+employee1);System.out.println("exployee2"+employee2);System.out.print("employee1==employee2?:");System.out.print(employee1==employee2);}}把上面的@Bean加個(gè)@scope[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.mucfc.anno;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Scope;@ConfigurationpublicclassCompanyConfig{@Bean@Scope("singleton")publicEmployeeemployee(){returnnewEmployee();}}其它不變。運(yùn)行結(jié)果:說明默認(rèn)返回的是singleton類型,這里改成了prototpye這么做有什么好處呢?1.使用純java代碼,不在需要xml2.在配置中也可享受OO帶來的好處3.類型安全對(duì)重構(gòu)也能提供良好的支持4.依舊能享受到所有springIoC容器提供的功能ApplicationContext接口的最常用的實(shí)現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,以及面向Portlet的XmlPortletApplicationContext和面向web的XmlWebApplicationContext,它們都是面向XML的。Spring3.0新增了另外兩個(gè)實(shí)現(xiàn)類:AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext。從名字便可以看出,它們是為注解而生,直接依賴于注解作為容器配置信息來源的IoC容器初始化類。由于AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的web版本,其用法與后者相比幾乎沒有什么差別,因此本文將以AnnotationConfigApplicationContext為例進(jìn)行講解。AnnotationConfigApplicationContext搭配上@Configuration和@Bean注解,自此,XML配置方式不再是SpringIoC容器的唯一配置方式。兩者在一定范圍內(nèi)存在著競(jìng)爭(zhēng)的關(guān)系,但是它們?cè)诖蠖鄶?shù)情況下還是相互協(xié)作的關(guān)系,兩者的結(jié)合使得SpringIoC容器的配置更簡單,更強(qiáng)大。之前,我們將配置信息集中寫在XML中,如今使用注解,配置信息的載體由XML文件轉(zhuǎn)移到了Java類中。我們通常將用于存放配置信息的類的類名以“Config”結(jié)尾,比如AppDaoConfig.java、AppServiceConfig.java等等。我們需要在用于指定配置信息的類上加上@Configuration注解,以明確指出該類是Bean配置的信息源。注意:Spring對(duì)標(biāo)注Configuration的類有如下要求配置類不能是final的;配置類不能是本地化的,亦即不能將配置類定義在其他類的方法內(nèi)部;配置類必須有一個(gè)無參構(gòu)造函數(shù)。AnnotationConfigApplicationContext將配置類中標(biāo)注了@Bean的方法的返回值識(shí)別為SpringBean,并注冊(cè)到容器中,受IoC容器管理。@Bean的作用等價(jià)于XML配置中的標(biāo)簽。@Bean具有以下四個(gè)屬性:name--指定一個(gè)或者多個(gè)Bean的名字。這等價(jià)于XML配置中的name屬性。initMethod--容器在初始化完Bean之后,會(huì)調(diào)用該屬性指定的方法。這等價(jià)于XML配置中的init-method屬性。destroyMethod--該屬性與initMethod功能相似,在容器銷毀Bean之前,會(huì)調(diào)用該屬性指定的方法。這等價(jià)于XML配置中的destroy-method屬性。autowire--指定Bean屬性的自動(dòng)裝配策略,取值是Autowire類型的三個(gè)靜態(tài)屬性。Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。與XML配置中的autowire屬性的取值相比,這里少了constructor,這是因?yàn)閏onstructor在這里已經(jīng)沒有意義了。@Bean沒有直接提供指定作用域的屬性,可以通過@Scope來實(shí)現(xiàn)該功能。由于@configureation注解類本身已經(jīng)標(biāo)注了@component注解,所以任何標(biāo)注了@configuration的類,本身也相當(dāng)于標(biāo)注了@component,即它們可以像普通的bean一樣被注入到其它bean中去。如下面:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片packagecom.mucfc.anno;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassCompany{@Autowired//自動(dòng)裝配Configuration定義好的CompanyConfigprivateCompanyConfigcompanyConfig;publicCompanyConfiggetCompanyConfig(){returncompanyConfig;}publicvoidsetCompanyConfig(CompanyConfigcompanyConfig){panyConfig=companyConfig;}}使用:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片ctx.register(CompanyConfig.class);ctx.register(Company.class);ctx.refresh();[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片Employeeemployee3=ctx.getBean(Company.class).getCompanyConfig().employee();employee3.setName("紅色革命");employee3.setId(2342);System.out.println("exployee3"+employee3);輸出結(jié)果:exployee3員工姓名:紅色革命員工編號(hào):2342使用基于java類的配置信息啟動(dòng)Spring容器:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片/*AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext();ctx.register(CompanyConfig.class);ctx.register(Company.class);ctx.refresh();*/ApplicationContextctx=newAnnotationConfigApplicationContext(CompanyConfig.class);其中注釋的代碼和不注釋的代碼可以看成是相同的,運(yùn)行后結(jié)果不@Import注解:@import的注解允許加載@Bean從另一個(gè)配置類定義。考慮一個(gè)配置類,如下所示:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片@ConfigurationpublicclassConfigA{@BeanpublicAa(){returnnewA();}}您可以在另一個(gè)bean聲明導(dǎo)入上述bean聲明如下[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片@Configuration@Import(ConfigA.class)publicclassConfigB{@BeanpublicBa(){returnnewA();}}現(xiàn)在,不需要實(shí)例化的前提下,當(dāng)同時(shí)指定配置A.class和配置B.class,只有ConfigB類需要如下提供:[java]viewplaincopy在CODE上查看代碼片派生到我的代碼片publicstaticvoidmain(String[]args){ApplicationContextctx=newAnnotationConfigApplicationContext(ConfigB.class);//nowboth
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 預(yù)制管莊施工方案(3篇)
- 2026年證券從業(yè)資格考試知識(shí)點(diǎn)全解析題集
- 石筍序列與古氣候事件關(guān)聯(lián)
- 2026年瑜伽體位法身姿塑造與柔韌性訓(xùn)練題庫
- 2026年外語類考試綜合應(yīng)用能力測(cè)試題目集
- 中國家庭養(yǎng)老功能弱化背景下的社會(huì)化替代方案
- 中國咖啡連鎖行業(yè)市場(chǎng)深度調(diào)研及競(jìng)爭(zhēng)格局與投資價(jià)值評(píng)估報(bào)告
- 中國咖啡禮盒市場(chǎng)細(xì)分與產(chǎn)品差異化競(jìng)爭(zhēng)策略報(bào)告
- 中國咖啡消費(fèi)市場(chǎng)品牌格局與渠道變革趨勢(shì)報(bào)告
- 中國可拆卸式展覽館綠色會(huì)展理念對(duì)采購決策影響調(diào)研報(bào)告
- 《ETF相關(guān)知識(shí)培訓(xùn)》課件
- (一模)烏魯木齊地區(qū)2025年高三年級(jí)第一次質(zhì)量英語試卷(含答案)
- 2025年云南省普洱市事業(yè)單位招聘考試(833人)高頻重點(diǎn)提升(共500題)附帶答案詳解
- DB15-T 3677-2024 大興安嶺林區(qū)白樺樹汁采集技術(shù)規(guī)程
- 2024年《13464電腦動(dòng)畫》自考復(fù)習(xí)題庫(含答案)
- 義務(wù)教育階段學(xué)生語文核心素養(yǎng)培養(yǎng)的思考與實(shí)踐
- 綜合利用1噸APT渣項(xiàng)目研究報(bào)告樣本
- JT-T 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程專項(xiàng)施工方案編制審查規(guī)程
- 圓錐曲線壓軸題30題2023
- 浙江省杭州市2022-2023學(xué)年四年級(jí)上學(xué)期語文期末試卷(含答案)2
- 試模報(bào)告模板
評(píng)論
0/150
提交評(píng)論