程序開發(fā)-17ioc工具說明_第1頁
程序開發(fā)-17ioc工具說明_第2頁
程序開發(fā)-17ioc工具說明_第3頁
程序開發(fā)-17ioc工具說明_第4頁
程序開發(fā)-17ioc工具說明_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

jBeanBox是一個微形但功能較齊全的IOC/AOP工具,利用了Java的初始化塊實現(xiàn)的Java配置代替XML,比目前Spring或Guice的Java配置更簡單。jBeanBox采用ApacheLicense2.0開源協(xié)議。Spring,HiveMind及其他一些利用XML作為配置文件的IOC/AOP框架:XML不支持類名稱拼寫檢查和IDE重構(gòu),很難在運行時更改配置。(從Spring3.0Java的配置來取代XMLJava作為一個IOC/AOP工具來說,Spring過于復雜了。)強,對無源碼的第庫支持不佳,IOC/AOP工具不應該完全依賴于源碼。簡單,很少的源碼(不到3000行)實現(xiàn)了所有的IOC/AOP功能,沒有XML,只有1個注解(InjectBox)。學習曲線低、易、易擴充和移植。2)使用Java來代替XML,其實現(xiàn)比Spring或Guice的Java配置更簡單實用,上,Spring的一些服務如式事務可以抽取出來在jBeanBox上使用。中全部或部分取代SpringIoC/AOP內(nèi)核,其主要功能有:*以JavaJava(第一種配置方式)來代替XML*以Java方法回調(diào)為基礎(chǔ)的JavaJava型安全和IDE重構(gòu)支持。于學習。以上三種配置各有特點,甚至可以在同一個配置中混合使用。*單例/多例支持,默認情況下所有實例為單例(Spring);*內(nèi)置AOP和AspectJSpring傳統(tǒng)XML拉式注入:利用@InjectBox注解(與GuiceSpring),支*以約定方式尋找配置,這是jBeanBoxSpring中創(chuàng)建多個ApplicationContext實例)*Bean(postConstruction和preDestory比較新,缺少足夠的測試。設置AOP時,目標類不能是finalCGLIB)在pom.xml個是標準AOP接口),如果使用Maven將自動這兩個jar包,jBeanBox了CGLIB及ASM庫,為了防止可能發(fā)生的與其它CGLIB版本,已將這兩個庫打包到jBeanBox并變更命名空間。jBeanBox不依賴于commonlog或Log4j,但是如果在類路徑中找到它們的配置,將自動采用它們jBeanBox項目導入JDK6以上版本、Gitbash、Maven,git cdmvnEclipse,按"import"->"ExistingProjectsintoWorkspace",選中jBeanBox,即可將項目導入,注意導入時不要勾選“Copytoproject示例1-oWorld第一個IOC注入演下面這個簡單程序演示了jBeanBox1+Box)尋找配置2JavapublicoWorldprivateStringpublicstatic oWorldBoxextendsBeanBox{o}}publicstaticvoidmain(String[]args)oWorldh=o}}2-基礎(chǔ)jBeanBoxpublicpublicclassOrder//orderprivateCompany//getters&setter}publicclassCompanyCompanyprivateString//getters&setters}publicclassOrderBoxextendsBeanBoxOrderBoxBeanBox子類,這是一個配{ setProperty("companyCompanyBox.class設定要注入的對象,可以是目標類,也可以是一個BeanBox配置類}publicpublicstaticclassCompanyBox1extendsBeanBox{setProperty("name","PetStore1");}}{//{}}}publicclassTesterpublicstaticvoidmain(String[]args)System.out.println("OrderbeanisaSingleTon?"+(order==}}為節(jié)省篇幅,一些java類以及靜態(tài)工廠、實例工廠演示未在此說明中列出,請詳見jbeanbox-eaxmple項目源碼,下同。3:AOP&AspectjSpring兼容,此項目已集成了AOP接口和Aspectj接口支持,但是切點只支持Java正則表達式式。("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)無侵入的推式注入??梢钥闯?,注解的引入可簡化源詳見jbeanbox-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)核實現(xiàn)無XML的式事式事務是AOP的典型運用場合,基本原理是利用線程局部變量來管理連接,AOP的特點就是服務和內(nèi)核是插拔式設計,內(nèi)核和服務可以單獨使用。SpringIOC/AOP使用,如果抽取不出來,說明它綁死在Spring是不符的。本著不重新發(fā)明的原則,此示例將Spring中的式事務服務抽取出來,與jBeanBox整合,也就是說這一次的整合只利用了Spring的事務服務,而不使用它的IOC/AOP內(nèi)核,很詭異的組合,但目的很明確:取消XML配置。以下是jBeanBox整合了c3p0數(shù)據(jù)池+JDBCTemplate+Spring式事務的一個例子,實測通過","insert\\w*",newTxInterceptorBox(),}同{ setProperty("driverClass","com.mysql.jdbc.Driver");//yourjdbcdrivername}}staticclassTxManagerBoxextendsBeanBoxSpring中{setProperty("dataSource",DSPoolBeanBox.class);}}{Propertiesprops=newProperties();}}}publicstaticclassJdbcTemplateBoxextendsBeanBoxJdbcTemplate模板配置,可換成dbUtils等{}}}publicclassTester測試類publicvoidinsertUser()dao.execute("insertintousersvaluesUser1')");inti=1/0;//拋出運行期錯誤,導致事務回滾dao.execute("insertintousersvaluesUser2')");}publicstaticvoidmain(String[]args)TestertesterBeanBox.getBean(Tester.class);//從默認上下文獲取類實例}}此示例中需要額外用到C3P0、MysqlMySQL示例7:利用Java方法來手工生成實例。這種方式和Spring的Java配置類jBeanBox入屬性,(如運行在JAVA8下,強制類型轉(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有三種配置方式,初始塊、Java活,可完全替代XML,但不支持方法名重構(gòu),Java方法回調(diào)是類型安全但靈充。參數(shù)用代號加數(shù)字指定,從0開始,如s0表示第一個String參數(shù),i1表示第二個Integer參數(shù),box2表示第三個BeanBox參數(shù)publicpublicclass{StringString@InjectBox(s0="name3")Stringname3;AAa4,@InjectBox(s0=publicTester(Stringname1AAa4{//a4將自動找到配置類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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論