版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
jBeanBox是一個(gè)微形但功能較齊全的IOC/AOP工具,利用了Java的初始化塊實(shí)現(xiàn)的Java配置代替XML,比目前Spring或Guice的Java配置更簡單。jBeanBox采用ApacheLicense2.0開源協(xié)議。Spring,HiveMind及其他一些利用XML作為配置文件的IOC/AOP框架:XML不支持類名稱拼寫檢查和IDE重構(gòu),很難在運(yùn)行時(shí)更改配置。(從Spring3.0Java的配置來取代XMLJava作為一個(gè)IOC/AOP工具來說,Spring過于復(fù)雜了。)強(qiáng),對(duì)無源碼的第庫支持不佳,IOC/AOP工具不應(yīng)該完全依賴于源碼。簡單,很少的源碼(不到3000行)實(shí)現(xiàn)了所有的IOC/AOP功能,沒有XML,只有1個(gè)注解(InjectBox)。學(xué)習(xí)曲線低、易、易擴(kuò)充和移植。2)使用Java來代替XML,其實(shí)現(xiàn)比Spring或Guice的Java配置更簡單實(shí)用,上,Spring的一些服務(wù)如式事務(wù)可以抽取出來在jBeanBox上使用。中全部或部分取代SpringIoC/AOP內(nèi)核,其主要功能有:*以JavaJava(第一種配置方式)來代替XML*以Java方法回調(diào)為基礎(chǔ)的JavaJava型安全和IDE重構(gòu)支持。于學(xué)習(xí)。以上三種配置各有特點(diǎn),甚至可以在同一個(gè)配置中混合使用。*單例/多例支持,默認(rèn)情況下所有實(shí)例為單例(Spring);*內(nèi)置AOP和AspectJSpring傳統(tǒng)XML拉式注入:利用@InjectBox注解(與GuiceSpring),支*以約定方式尋找配置,這是jBeanBoxSpring中創(chuàng)建多個(gè)ApplicationContext實(shí)例)*Bean(postConstruction和preDestory比較新,缺少足夠的測(cè)試。設(shè)置AOP時(shí),目標(biāo)類不能是finalCGLIB)在pom.xml個(gè)是標(biāo)準(zhǔn)AOP接口),如果使用Maven將自動(dòng)這兩個(gè)jar包,jBeanBox了CGLIB及ASM庫,為了防止可能發(fā)生的與其它CGLIB版本,已將這兩個(gè)庫打包到j(luò)BeanBox并變更命名空間。jBeanBox不依賴于commonlog或Log4j,但是如果在類路徑中找到它們的配置,將自動(dòng)采用它們jBeanBox項(xiàng)目導(dǎo)入JDK6以上版本、Gitbash、Maven,git cdmvnEclipse,按"import"->"ExistingProjectsintoWorkspace",選中jBeanBox,即可將項(xiàng)目導(dǎo)入,注意導(dǎo)入時(shí)不要勾選“Copytoproject示例1-oWorld第一個(gè)IOC注入演下面這個(gè)簡單程序演示了jBeanBox1+Box)尋找配置2JavapublicoWorldprivateStringpublicstatic oWorldBoxextendsBeanBox{o}}publicstaticvoidmain(String[]args)oWorldh=o}}2-基礎(chǔ)jBeanBoxpublicpublicclassOrder//orderprivateCompany//getters&setter}publicclassCompanyCompanyprivateString//getters&setters}publicclassOrderBoxextendsBeanBoxOrderBoxBeanBox子類,這是一個(gè)配{ setProperty("companyCompanyBox.class設(shè)定要注入的對(duì)象,可以是目標(biāo)類,也可以是一個(gè)BeanBox配置類}publicpublicstaticclassCompanyBox1extendsBeanBox{setProperty("name","PetStore1");}}{//{}}}publicclassTesterpublicstaticvoidmain(String[]args)System.out.println("OrderbeanisaSingleTon?"+(order==}}為節(jié)省篇幅,一些java類以及靜態(tài)工廠、實(shí)例工廠演示未在此說明中列出,請(qǐng)?jiān)斠妀beanbox-eaxmple項(xiàng)目源碼,下同。3:AOP&AspectjSpring兼容,此項(xiàng)目已集成了AOP接口和Aspectj接口支持,但是切點(diǎn)只支持Java正則表達(dá)式式。("AOPLogAdvice","AspectjLogAdvice"源碼此處略)publicclassTester{privateIitemitem;publicvoidsetItem(Iitemitem){this.item=item;}publicvoiddoPrintItem(){}publicstaticvoidmain(String[]args)BeanBoxadvice=newBeanBox(AOPLogAdvice.class).setProperty("name","AOPLogger");"doPrint\\w*",advice,"doAround");BeanBoxadvice2=newBeanBox(AspectjLogAdvice.class).setProperty("name","AspectJLogger");","doPrint\\w*",advice2,Testert=newBeanBox(Tester.class).setProperty("item",}}入,注入8和9為傳統(tǒng)無侵入的推式注入??梢钥闯觯⒔獾囊肟珊喕丛斠妀beanbox-BeanBoxpublicpublicclass{@InjectBox(A.StrBox.class)Strings1;//UseStrBox.class,Strings2;//UseA.StringBox.class(orA.StringBox2.class,2to8dependscontextsetting)Strings3;//UseCc4;Use Strings5;//Use@InjectBox(required=d6;//UseConfig$DBox.class(or@InjectBox(required=e7;//UseConfig$E7Box.class(orprivateStrings8;//injectedbyfield,notsuitableforProxyprivateStrings9;//injectedbysetterpublicvoidsetS9(Strings9){this.s9=s9;}publicvoidprint(){System.out.println((c4==null)?null:c4.value);System.out.println((d6==null)?null:d6.value);System.out.println((e7==null)?null:e7.value);}publicpublicstaticvoidmain(String[]{Testert=BeanBox.getBean(Tester.class);t.print();BeanBoxContextctx=newTestert3ctx.getBean(Tester.class);}}5Bean(PostConstructor和PreDestorypublicpublicclass{privateStringpublicvoid{name=}publicvoid{System.out.println("Bye"+}publicstaticclassTesterBoxextendsBeanBox{}}}publicstaticvoidmain(String[]{BeanBox.getBean(Tester.class);BeanBox.defaultContext.closeByeSam}}示例6:利用jBeanBox取代Spring內(nèi)核實(shí)現(xiàn)無XML的式事式事務(wù)是AOP的典型運(yùn)用場(chǎng)合,基本原理是利用線程局部變量來管理連接,AOP的特點(diǎn)就是服務(wù)和內(nèi)核是插拔式設(shè)計(jì),內(nèi)核和服務(wù)可以單獨(dú)使用。SpringIOC/AOP使用,如果抽取不出來,說明它綁死在Spring是不符的。本著不重新發(fā)明的原則,此示例將Spring中的式事務(wù)服務(wù)抽取出來,與jBeanBox整合,也就是說這一次的整合只利用了Spring的事務(wù)服務(wù),而不使用它的IOC/AOP內(nèi)核,很詭異的組合,但目的很明確:取消XML配置。以下是jBeanBox整合了c3p0數(shù)據(jù)池+JDBCTemplate+Spring式事務(wù)的一個(gè)例子,實(shí)測(cè)通過","insert\\w*",newTxInterceptorBox(),}同{ setProperty("driverClass","com.mysql.jdbc.Driver");//yourjdbcdrivername}}staticclassTxManagerBoxextendsBeanBoxSpring中{setProperty("dataSource",DSPoolBeanBox.class);}}{Propertiesprops=newProperties();}}}publicstaticclassJdbcTemplateBoxextendsBeanBoxJdbcTemplate模板配置,可換成dbUtils等{}}}publicclassTester測(cè)試類publicvoidinsertUser()dao.execute("insertintousersvaluesUser1')");inti=1/0;//拋出運(yùn)行期錯(cuò)誤,導(dǎo)致事務(wù)回滾dao.execute("insertintousersvaluesUser2')");}publicstaticvoidmain(String[]args)TestertesterBeanBox.getBean(Tester.class);//從默認(rèn)上下文獲取類實(shí)例}}此示例中需要額外用到C3P0、MysqlMySQL示例7:利用Java方法來手工生成實(shí)例。這種方式和Spring的Java配置類jBeanBox入屬性,(如運(yùn)行在JAVA8下,強(qiáng)制類型轉(zhuǎn)換可以省略):publicpublicclassTesterBoxextends{statict\\w*","insert\\w*",newTxInterceptorBox(),}staticclassDSPoolBeanBoxextendsBeanBox{//Type-unsafeandtype-safeconfigurationscanmixeduse.publicDataSourcecreate()ComboPooledDataSourceds=newComboPooledDataSource();return}publicvoidconfig(ComboPooledDataSourceds.setPassword("root888");//changetoyourPWD} }}staticclassTxManagerBoxextendsBeanBox{publicDataSourceTransactionManagercreate(){DataSourceTransactionManagerdm=newreturn}}staticclassTxInterceptorBoxextendsBeanBox{//AdvicepublicTransactionInterceptorcreate(){Propertiesprops=newProperties();returnnewTransactionInterceptor((DataSourceTransactionManager)}}publicstaticclassJdbcTemplateBoxextendsBeanBox{publicJdbcTemplatecreate(){returnreturnnewJdbcTemplate((DataSource)}}}8演示用注解來注入屬性、構(gòu)造函數(shù)參數(shù)和方法參數(shù)。目前jBeanBox有三種配置方式,初始?jí)K、Java活,可完全替代XML,但不支持方法名重構(gòu),Java方法回調(diào)是類型安全但靈充。參數(shù)用代號(hào)加數(shù)字指定,從0開始,如s0表示第一個(gè)String參數(shù),i1表示第二個(gè)Integer參數(shù),box2表示第三個(gè)BeanBox參數(shù)publicpublicclass{StringString@InjectBox(s0="name3")Stringname3;AAa4,@InjectBox(s0=publicTester(Stringname1AAa4{//a4將自動(dòng)找到配置類AAB1=name1;this.a4=}@InjectBox(s0="name2",box1=A5Box.class)publicvoidinjectBymethod(Stringname2,AAa5){2=name2;this.a5=a5;}publicstaticclassAA{publicStringname;}publicstaticclassAABoxextendsBeanBox{}}publicstaticclassA5BoxextendsBeanBox{publicAAcreate(){AAaa=newAA();="name5";returnaa;}}publicstaticvoidmain(String[]args){Testert=BeanBox.getBean(Tester.class);System.out.println("name1="+1);//System.out.println("name2="+2);//name2=name2System.out.println("name3="+3);//name3=name3System.out.println("name4="System.out.println("name2="+2);//name2=name2System.out.println("name3="+3);//name3=name3System.out.p
溫馨提示
- 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è)推廣策略》課件
- 中醫(yī)基礎(chǔ)理論習(xí)題及答案
- 【教育】浙江省高校教師高等教育法規(guī)基礎(chǔ)試題及答案
- 第一周幼兒園營養(yǎng)食譜
- 施工單位技術(shù)負(fù)責(zé)人述職報(bào)告
- 高考新課標(biāo)語文模擬試卷系列之65
- 《特拉華州公司法》課件
- 交通運(yùn)輸行業(yè)安全意識(shí)培訓(xùn)總結(jié)
- 互聯(lián)網(wǎng)行業(yè)客服工作總結(jié)
- 物流行業(yè)安全工作總結(jié)
- 【航空個(gè)性化服務(wù)淺析4700字(論文)】
- 保障農(nóng)民工工資支付條例全文及解讀課件
- 中國移動(dòng)全面預(yù)算管理
- 【部編】小高考:2021年江蘇普通高中學(xué)業(yè)水平測(cè)試歷史試卷
- 公路隧道建設(shè)施工技術(shù)規(guī)范學(xué)習(xí)考試題庫(400道)
- 新人教版七至九年級(jí)英語單詞表 漢譯英(含音標(biāo))
- 淺談事業(yè)單位固定資產(chǎn)的折舊本科學(xué)位論文
- 食堂管理制度大全
- 愛普生機(jī)器人中級(jí)培訓(xùn)資料
- 2020-2021學(xué)年江蘇省徐州市九年級(jí)(上)期末化學(xué)試卷
評(píng)論
0/150
提交評(píng)論