播客javaandroid就業(yè)-湯陽光spring2.5課程一_第1頁
播客javaandroid就業(yè)-湯陽光spring2.5課程一_第2頁
播客javaandroid就業(yè)-湯陽光spring2.5課程一_第3頁
播客javaandroid就業(yè)-湯陽光spring2.5課程一_第4頁
播客javaandroid就業(yè)-湯陽光spring2.5課程一_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Spring基開發(fā)應用時的一些問問題一:依publicpublicclassUserServiceImplprivateUserDaouserDao=new//}以上代碼是有問題的,即“在Service中的具體的實現(xiàn)類,這樣就和具體的實現(xiàn)類耦合在了一起,如果要更換(OracleUserDaoImpl,就需要修改源代碼。怎么樣才能不依賴實現(xiàn)類呢可以使用工廠模式,讓UserDao的實現(xiàn)在在工廠中生成,而工廠是可以配置的,如下////publicclassObjectFactory//privatestaticPropertiesstatic 配置文件}//publicstaticObjectcreateInstance(Stringname)//StringimplClassName=//return}}//#UserDao=cn. #UserDao=cn. UserDao=cn. //publicclassUserServiceImplprivateUserDaouserDao=(UserDao)//再想問題二:事務控對于事務,可以使用Filter或是Struts2的器實現(xiàn),但這樣有一些不好的地方12action3也可以使用的方式實現(xiàn)(如JDK的動態(tài)。概念:控制反轉(zhuǎn)(IOC,Inversionofpublic ServiceBean Dao= publicvoid }}DaoBean是在應用創(chuàng)建及的。所謂控制反轉(zhuǎn)就是應用本身不負責依賴對象的創(chuàng)建及控制反轉(zhuǎn)即IoC(InversionofControl),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交Lookup容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和ApacheAvalon都使用這種方式。<2>依賴注入InjectionIoC類型。概念:依賴注入(DI,Dependency當我們把依賴對象交給外部容器負責創(chuàng)建,那 ServiceBean類可以改成如下public ServiceBean Daogetter//通過構(gòu)造器參數(shù),讓容器把創(chuàng)建好的依賴對象注入 //當然也可以使用setter方法進行注入 }publicvoid }}概念面向切面編(AOPAspectOrientedAOPAspectOrientedProgramming的縮寫,意為:面向切面編程(也叫面向方面日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等等。使用JDK的動態(tài)可以實現(xiàn)AOP,如下圖Spring簡也可以配置每個bean是只有一個實例,還是每次需要時都生成一個新的實例,以及它們是如何相互關(guān)聯(lián)Spring提供了很多基礎(chǔ)的與業(yè)務邏輯無關(guān)的功能,比如:事務管理、持久化框架集成等等Spring的模塊圖如下所示Spring。Spring是一個輕量級容器架構(gòu)。怎么區(qū)爭一個框架是屬于輕量級框架還是屬于重量框架呢?其實劃spring就需要指明使用該服務如果應用使用的服務很少如:只使用了spring服務那么我們可以認為springEJBEJB規(guī)范中所有的功能,所以它屬于重量級。Spring框架的主頁:Spring有什么好在項目中引入spring立即可以帶來下面的好降低組件之間的耦合度,實現(xiàn)軟件各層之間的解耦開發(fā)就不再需要手工控制事務.也不需處理復雜的事務。容器提供單例模式支持,開發(fā)不再需要自己編寫實現(xiàn)代碼容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限、運行期等功能容器提供的眾多輔作類,使用這些類能夠加快應用的開發(fā),如:JdbcTemplateHibernateTemplate一、如果使用Spring,我們就不再需要手工控制事使用Spring后,代碼變?yōu)镻ublicvoidsave(){}二、如果使用spring,我們也不需要處理復雜的事務行publicvoidpayment(){}如果我們不使用Spring,針對下面這兩種業(yè)務需求,我們該如何做第1種可能的業(yè)務需求:要求Bean1.update()和Bean2.save()在同一個事務中執(zhí)行第2種可能的業(yè)務需求:要求不管Bean1.update()的事務是否成功,都需要記錄操作日志publicclassBean1publicvoidupdate(){//注意:下面省略了一些代碼Connectionconn=null;“updateaccountsetamount=?where}}publicclassBean2publicvoidsave(){//Connectionconn=“insertintoLog(content)values}}使用Spring,我們只需要通過式的事務屬性配置就可以輕松地實現(xiàn)這兩種業(yè)務需要求Bean1.update()和Bean2.save()的在同一個事務中執(zhí)要求不管Bean1.update()的事務是否成功,都需要記錄日志publicvoidpayment(){Bean1.update();//更新金B(yǎng)ean2.save();//記錄日}publicclassBean1{publicvoidupdate(){executeUpdate(“updateaccountsetamount=?where}}publicclassBean2{publicvoidsave(){executeUpdate(“insertintoLog(content)values}}Spring3.0Spring2.5支持JDK1.4。不支持泛型。必須進行強制類型轉(zhuǎn)換Spring3.0Jdk1.5BeanIDBean1Spring程序準備開發(fā)環(huán)jardist/spring.jar(包mons-logging.jar(日志如果使用了切面編程(AOP),還需要下列jar文件:如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,還需要下列jar文件:lib\j2ee\common-annotations.jar(如果使用的是JavaEE5.0就不需要引入這個jar了,JavaEE5.0中已經(jīng)包含了)注:JSR(Java規(guī)范請求)JCP(JavaCommunityProcess)提出新增一個標準化技術(shù)規(guī)范的正式請求人都可以提交JSR(Java規(guī)范請求)以向Java平臺增添新的API和服務JSR已成為Java準備配置文配置文件的模版可以從spring的參考手冊或spring的例子中得到。配置文件的取名可以任意,文 下,但一般的的用法是放在類路徑下,取名為applicationContext.xml。附配置文件<?<?xmlversion="1.0"encoding="UTF-<beans"""這里寫bean編寫spring配置文件時,不能出現(xiàn)幫助信方法一:讓機器上網(wǎng),eclipse會自動從網(wǎng)絡上schema文件并緩存在硬盤上。方法二:schema文件,方法如下:1windwos→preferences→myeclipse→filesandeditors→xml→xmlcatalog。2"add"KeyTypeURIlocation中選"Filesystem",然后在spring解 的 中選擇spring-beans-2.5.xsd3,回到設置窗不要急著關(guān)閉窗口,應把窗口中的KeyType改為Schemalocation,Key改oWorld程創(chuàng)建類1,Dao層一、DaopublicinterfaceUserDaovoid}二、DaopublicclassUserDaoImplimplementsUserDaoprivateStringjdbcUrl;privateStringdriverClass;privateStringusername;privateStringpassword;publicvoidprintInfo(){System.out.println("jdbcUrl="+jdbcUrl);System.out.println("driverClass="+driverClass);System.out.println("username="+username);System.out.println("password="+password);}gettersetter}2,Service層publicpublicclassUserServiceImplprivateUserDaopublicUserDaogetUserDao(){returnuserDao;}publicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}Spring的配置<?<?xmlversion="1.0"encoding="UTF-<beans"""配置Dao<beanid="userDao"<propertyname="jdbcUrl"<propertyname="driverClass"<propertyname="username"<propertyname="password"配置Service<propertyname="userDao"測試代碼(主程序publicpublicoWorldpublicvoidtestBeanFactory()Resourceresource=new BeanFactorybeanFactory=newUserServiceImpluserServiceImpl=(UserServiceImpl)beanFactory.getBean(System.out.println(userServiceImpl)可以得到;//;//System.out.println("--end--}}以上是使用Spring的ObjectFactory,還可以使用他的子類ApplicationContext獲取Bean,后者有的功publicvoidtestApplicationContext()ApplicationContextapplicationContext=new UserServiceImpluserServiceImpl=(UserServiceImpl)System.out.println(userServiceImpl);//可以得到UserServiceImplSystem.out.println(userServiceImpl.getUserDao())可以得到被注入的UserDao;//System.out.println("--end--}IOC容ObjectFactoryObjectFactoryApplicationContextBeanFactoryBeanFactoryBean容器,ApplicationContext可以識別自動的的類、可以識別用于Bean創(chuàng)建的類等。ApplicationContextApplicationContext1,ClassPathXmlApplicationContext2,ClassPathXmlApplicationContext(classpath中的資源publicvoidtestClassPathXmlApplicationContext_1() ApplicationContextapplicationContext=newClassPathXmlApplicationContext(// String[namesapplicationContext.getBeanDefinitionNames()獲取所有定義的bean}publicvoidtestClassPathXmlApplicationContext_2() ApplicationContextapplicationContext=newnewString[] /c_applicationcontextSubclass/applicationContext_service.xml"}String[namesapplicationContext.getBeanDefinitionNames()獲取所有定義的bean}publicvoidtestClassPathXmlApplicationContext_3()ApplicationContextapplicationContext=newClassPathXmlApplicationContext(//String[namesapplicationContext.getBeanDefinitionNames()獲取所有定義的bean}publicvoidtestClassPathXmlApplicationContext_4()ApplicationContextapplicationContext=newnewString[]{String[namesapplicationContext.getBeanDefinitionNames()獲取所有定義的bean}FileSystemXmlApplicationContext(指定路徑的資源publicvoidtestFileSystemXmlApplicationContext_1()指定一個配置文件,推薦寫絕對路徑,applicationContext_dao.xml在根ApplicationContextac=newFileSystemXmlApplicationContext(String[]names=ac.getBeanDefinitionNames();}publicvoidtestFileSystemXmlApplicationContext_2()ApplicationContextac=newnewString[]{"c:/applicationContext_dao.xml",//String[]names=ac.getBeanDefinitionNames();publicvoidXmlWebApplicationContextacnewXmlWebApplicationContext()這時并沒有初始化容器ac.setServletContext(servletContext);//需要指定ServletContext對象ac.setConfigLocation("/WEB-INF/applicationContext.xml"指定配置文件路徑,開頭的斜ac.refresh()String[namesac.getBeanDefinitionNames()獲取所有定義的bean}Resource(Spring中的資源定義說1,ClassPathResource 從classpath中2,F(xiàn)ileSystemResource 3, 從指定URL4ServletContextResourcewebpublicvoidtestClassPathResource_1()throwsException//指定一個相對于classpath Resourceresource=new }publicvoidtestClassPathResource_2()throwsException}publicvoidtestFileSystemResource_1()throwsExceptionResourceresource=newFileSystemResource("c:/applicationContext.xml");}publicvoidtestUrlResource()throwsException//Resourceresource=newUrlResource("file://c:/applicationContext.xml");}注:要在WebpublicvoidStringpath="/WEB-Resourceresource=newServletContextResource(servletContext,path);}使用特定格式的字符串表示各種類型的一、格式說二、測試代publicvoidtestResourceString()throwsExceptionApplicationContextac=newClassPathXmlApplicationContext(//"applicationContext.xml",getClass());//Resourceresource1="http:///Resourceresource2=//Resourceresource3= }三種實例化bean的方使用類構(gòu)造器實使用類構(gòu)造器實例化,class<bean 使用靜態(tài)工廠方法實例一、配置文<bean 二、工廠類publicpublicclassStaticDaoFactory//方法必 publicstaticObjectcreateUserDaoInstance(){returnnewUserDaoImpl();}}使用實例化的工廠對象中的方法實例化一、配置文使用實例化工廠對象中的方法實例化<bean <bean二、工廠類publicpublicclassSimpleDaoFactory//方法不 publicstaticObjectcreateUserDaoInstance(){returnnewUserDaoImpl();}}Bean的作用singleton(單例,默認值回顧單例模單例模式的意思就是只有一個實例,分為餓漢式(加載類時就初始化實例)懶漢式(第一次調(diào)用getInstance()時才生成實例)兩種實現(xiàn)方案SpringIoCbean默認只有一個實例(單例的,且默認情況下會在容器啟動時初,beanbean。如:一、創(chuàng)建類publicpublicclassUserDaoImplimplementsUserDaopublicUserDaoImpl()}}二、配置<<beanid="userDao" <<bean<<beanid="userDao" 三、測試代publicvoidtest1()ApplicationContextac=newClassPathXmlApplicationContext("applicationContext.xml",getClass());System.out.println(還未執(zhí)行獲取beanObjectdao1=ac.getBean("userDao");Objectdao2=System.out.println(dao1!=null);//true(不為null)System.out.println(dao1dao2)true(相等,即同一個實例)}四、對所有bean都應用延遲初始化方法是在根節(jié)點beans中設置屬性default-lazy-init=“true“,如下所示<<beansdefault-lazy-init="true"prototype(原型,表示每次獲取的都是新對象<bean每次從容<bean其他指定Bean的初始化方法和銷毀方一、創(chuàng)建類publicpublicclassUserDaoImplimplementsUserDaopublicvoidinit(){}publicvoiddestroy(){}}二、配置<<beanid="userDao"scope="singleton" 三、測試代publicvoidtest1()ClassPathXmlApplicationContextac=newClassPathXmlApplicationContext("applicationContext.xml",getClass());Objectdao=ac.getBean("userDao");ac.close()一定要關(guān)閉才會執(zhí)行destroy-method(bean的scope也不能是}四、注意1scopeprototypespring緩存的控制,destory方法也將不會執(zhí)(scopesingleton2,要調(diào)用ApplicationContextclose()方法才會執(zhí)行destory(ApplicationContext接口中沒有方法,需要強轉(zhuǎn)為具體的實現(xiàn)類才可以調(diào)用依賴注入——手工裝配(XML方式依賴注入的方通過spring構(gòu)造實例對象的時候,對象中的屬性賦值的方式有如下幾一、通過setter方法注入:類中一定要提供相應的setXX方法,才能執(zhí)行成通過setter<beanid="userDao1"<propertyname="jdbcUrl"<propertyname="driverClass"<propertyname="username"<propertyname="password"二、通過構(gòu)造器注入:類中要提供帶參數(shù)的構(gòu)造方法,并且下面參數(shù)是有順序<beanid="userDao2" 或是通過構(gòu)造方法注入,會與指定的索引匹配,第1個索引為0<beanid="userDao3" <constructor-argindex="2"value="root_name22"></constructor-<constructor-argindex="3"value="root_password22"></constructor-注入普通屬性(基本類型或是String型直接寫就可以,SpringpublicclasspublicclassUser{privateStringname;privateintage;privatebooleangender;publicvoidprintInfo(){System.out.println("name="+name);System.out.println("age="+age);System.out.println("gender="+gender);}getter與setter}<<beanid="user"<propertyname="name" <propertyname="age"<propertyname="gender"null注入null<property<null注入依賴的對方式一定義一個bean<beanid="userDao"<!--<bean <propertyname="userDao"說明bean時不分先后,Spring方式二:使用bean,因為沒有id或name,所以該bean不能被其他bean使用,如果你試圖去獲取<<!--在property中直接定義一個bean,不需要指定id或name,指定了也無效<beanid="userService2"<property<beanid="userDao2".j_di_bean.UserDaoImpl"<propertyname=”dataSource”注入集合屬一、創(chuàng)建類publicpublicclassUserprivateString//集合最好指定強類型,以便 <valuetype="java.lang.Integer">10</value>privateSet<String>addressSet=newHashSet<String>();privateSet<Integer>numberSet; ist<String>privateString[]privateMap<String,String>privatePropertiespublicvoidprintInfo(){System.out.println("name="+name);System.out.println("addressSet="+addressSet);System.out.println("numberSet="+numberSet);System.out.println("addressList="+addressList);System.out.println("addressCodeMap="+addressCodeMap);System.out.println("userProperties="+userProperties);}}二、配置<beanid="user" <propertyname="name" Set<propertySet<property<value<valueList類型,數(shù)組類型與List配置完全一樣(具體代碼略)<propertyname="addressList"<value>上地東路27號Map類型,要指定key-value<property<entrykey="上地東路27號value="100085Properties類型,只能是String<property<propkey="firstName" <prop<?<?xmlversion="1.0"encoding="UTF-<beansxmlns=""""<!--設置為自動掃描與裝配bean,掃描指定包及其所有下級包中的類,可以寫多個,之間用英文的逗號隔開 ponent-scanbase- 依賴注入——手工裝配(注解方式說明一般是bean和bean直接的依賴關(guān)系的時候用比較使用注解方式時,也支持給Field注入值(在XML中不可以給Field注入@Resource注解在spring安 的lib\j2ee\common-準java代碼中使用@Resourcexml配置文件中配置以下信息:context的話,先preferenc》xml中,dist、resource中添xsd然后add進去1、引入context命名空間、在配置文件中添 ponent-scan。多個包的時候,可以用逗號隔applicationContext.xml配置文件如下在類中使用——定義spring2.5spring2.5為我們引入了組件自動掃描機制,它可以在類路 尋找標注了@Component@Service、@Controller、@Repository注解的類,并把這些類納入進spring容器中管理。它的用和在xml文件中使用bean節(jié)點配置組件是一樣的功能介紹@Service用于標注業(yè)務層組件@Repository用于標注數(shù) 組件,即DAO組件@Controller用于@Repository用于標注數(shù) 組件,即DAO組件@Scopebeanprototypesingleton。在類中使用——注這需要通過@Resource注解實現(xiàn),@Resource注解可以標注在字段或?qū)傩缘膕etter方法上,但它默認按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當注解標注在字段上,即默認取字段的名稱作為bean名稱尋找依賴對象,當注解標注在屬性的setter方法上,即默認bean名稱尋找依賴對象。@Resource默認按名稱裝配,當找不到與名稱匹配的bean才會按類型裝配。如果沒有指定name屬性,并且按照默認的名稱找不到依賴對象時,@Resource注解會回退到按類型裝配。但一旦指定了name publicvoid Dao)set Dao }后一種相當于xml配置文件中<property Dao" Dao"自動裝配(依賴注入<beanid=“foo”class=“...Foo”autowire=“autowireautowire屬性取值

溫馨提示

  • 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

提交評論