播客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頁
免費(fèi)預(yù)覽已結(jié)束,剩余31頁可下載查看

下載本文檔

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

文檔簡介

Spring基開發(fā)應(yīng)用時(shí)的一些問問題一:依publicpublicclassUserServiceImplprivateUserDaouserDao=new//}以上代碼是有問題的,即“在Service中的具體的實(shí)現(xiàn)類,這樣就和具體的實(shí)現(xiàn)類耦合在了一起,如果要更換(OracleUserDaoImpl,就需要修改源代碼。怎么樣才能不依賴實(shí)現(xiàn)類呢可以使用工廠模式,讓UserDao的實(shí)現(xiàn)在在工廠中生成,而工廠是可以配置的,如下////publicclassObjectFactory//privatestaticPropertiesstatic 配置文件}//publicstaticObjectcreateInstance(Stringname)//StringimplClassName=//return}}//#UserDao=cn. #UserDao=cn. UserDao=cn. //publicclassUserServiceImplprivateUserDaouserDao=(UserDao)//再想問題二:事務(wù)控對于事務(wù),可以使用Filter或是Struts2的器實(shí)現(xiàn),但這樣有一些不好的地方12action3也可以使用的方式實(shí)現(xiàn)(如JDK的動態(tài)。概念:控制反轉(zhuǎn)(IOC,Inversionofpublic ServiceBean Dao= publicvoid }}DaoBean是在應(yīng)用創(chuàng)建及的。所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對象的創(chuàng)建及控制反轉(zhuǎn)即IoC(InversionofControl),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交Lookup容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和ApacheAvalon都使用這種方式。<2>依賴注入InjectionIoC類型。概念:依賴注入(DI,Dependency當(dāng)我們把依賴對象交給外部容器負(fù)責(zé)創(chuàng)建,那 ServiceBean類可以改成如下public ServiceBean Daogetter//通過構(gòu)造器參數(shù),讓容器把創(chuàng)建好的依賴對象注入 //當(dāng)然也可以使用setter方法進(jìn)行注入 }publicvoid }}概念面向切面編(AOPAspectOrientedAOPAspectOrientedProgramming的縮寫,意為:面向切面編程(也叫面向方面日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。使用JDK的動態(tài)可以實(shí)現(xiàn)AOP,如下圖Spring簡也可以配置每個(gè)bean是只有一個(gè)實(shí)例,還是每次需要時(shí)都生成一個(gè)新的實(shí)例,以及它們是如何相互關(guān)聯(lián)Spring提供了很多基礎(chǔ)的與業(yè)務(wù)邏輯無關(guān)的功能,比如:事務(wù)管理、持久化框架集成等等Spring的模塊圖如下所示Spring。Spring是一個(gè)輕量級容器架構(gòu)。怎么區(qū)爭一個(gè)框架是屬于輕量級框架還是屬于重量框架呢?其實(shí)劃spring就需要指明使用該服務(wù)如果應(yīng)用使用的服務(wù)很少如:只使用了spring服務(wù)那么我們可以認(rèn)為springEJBEJB規(guī)范中所有的功能,所以它屬于重量級。Spring框架的主頁:Spring有什么好在項(xiàng)目中引入spring立即可以帶來下面的好降低組件之間的耦合度,實(shí)現(xiàn)軟件各層之間的解耦開發(fā)就不再需要手工控制事務(wù).也不需處理復(fù)雜的事務(wù)。容器提供單例模式支持,開發(fā)不再需要自己編寫實(shí)現(xiàn)代碼容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限、運(yùn)行期等功能容器提供的眾多輔作類,使用這些類能夠加快應(yīng)用的開發(fā),如:JdbcTemplateHibernateTemplate一、如果使用Spring,我們就不再需要手工控制事使用Spring后,代碼變?yōu)镻ublicvoidsave(){}二、如果使用spring,我們也不需要處理復(fù)雜的事務(wù)行publicvoidpayment(){}如果我們不使用Spring,針對下面這兩種業(yè)務(wù)需求,我們該如何做第1種可能的業(yè)務(wù)需求:要求Bean1.update()和Bean2.save()在同一個(gè)事務(wù)中執(zhí)行第2種可能的業(yè)務(wù)需求:要求不管Bean1.update()的事務(wù)是否成功,都需要記錄操作日志publicclassBean1publicvoidupdate(){//注意:下面省略了一些代碼Connectionconn=null;“updateaccountsetamount=?where}}publicclassBean2publicvoidsave(){//Connectionconn=“insertintoLog(content)values}}使用Spring,我們只需要通過式的事務(wù)屬性配置就可以輕松地實(shí)現(xiàn)這兩種業(yè)務(wù)需要求Bean1.update()和Bean2.save()的在同一個(gè)事務(wù)中執(zhí)要求不管Bean1.update()的事務(wù)是否成功,都需要記錄日志publicvoidpayment(){Bean1.update();//更新金B(yǎng)ean2.save();//記錄日}publicclassBean1{publicvoidupdate(){executeUpdate(“updateaccountsetamount=?where}}publicclassBean2{publicvoidsave(){executeUpdate(“insertintoLog(content)values}}Spring3.0Spring2.5支持JDK1.4。不支持泛型。必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換Spring3.0Jdk1.5BeanIDBean1Spring程序準(zhǔn)備開發(fā)環(huán)jardist/spring.jar(包mons-logging.jar(日志如果使用了切面編程(AOP),還需要下列jar文件:如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,還需要下列jar文件:lib\j2ee\common-annotations.jar(如果使用的是JavaEE5.0就不需要引入這個(gè)jar了,JavaEE5.0中已經(jīng)包含了)注:JSR(Java規(guī)范請求)JCP(JavaCommunityProcess)提出新增一個(gè)標(biāo)準(zhǔn)化技術(shù)規(guī)范的正式請求人都可以提交JSR(Java規(guī)范請求)以向Java平臺增添新的API和服務(wù)JSR已成為Java準(zhǔn)備配置文配置文件的模版可以從spring的參考手冊或spring的例子中得到。配置文件的取名可以任意,文 下,但一般的的用法是放在類路徑下,取名為applicationContext.xml。附配置文件<?<?xmlversion="1.0"encoding="UTF-<beans"""這里寫bean編寫spring配置文件時(shí),不能出現(xiàn)幫助信方法一:讓機(jī)器上網(wǎng),eclipse會自動從網(wǎng)絡(luò)上schema文件并緩存在硬盤上。方法二:schema文件,方法如下:1windwos→preferences→myeclipse→filesandeditors→xml→xmlcatalog。2"add"KeyTypeURIlocation中選"Filesystem",然后在spring解 的 中選擇spring-beans-2.5.xsd3,回到設(shè)置窗不要急著關(guān)閉窗口,應(yīng)把窗口中的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()指定一個(gè)配置文件,推薦寫絕對路徑,applicationContext_dao.xml在根ApplicationContextac=newFileSystemXmlApplicationContext(String[]names=ac.getBeanDefinitionNames();}publicvoidtestFileSystemXmlApplicationContext_2()ApplicationContextac=newnewString[]{"c:/applicationContext_dao.xml",//String[]names=ac.getBeanDefinitionNames();publicvoidXmlWebApplicationContextacnewXmlWebApplicationContext()這時(shí)并沒有初始化容器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//指定一個(gè)相對于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= }三種實(shí)例化bean的方使用類構(gòu)造器實(shí)使用類構(gòu)造器實(shí)例化,class<bean 使用靜態(tài)工廠方法實(shí)例一、配置文<bean 二、工廠類publicpublicclassStaticDaoFactory//方法必 publicstaticObjectcreateUserDaoInstance(){returnnewUserDaoImpl();}}使用實(shí)例化的工廠對象中的方法實(shí)例化一、配置文使用實(shí)例化工廠對象中的方法實(shí)例化<bean <bean二、工廠類publicpublicclassSimpleDaoFactory//方法不 publicstaticObjectcreateUserDaoInstance(){returnnewUserDaoImpl();}}Bean的作用singleton(單例,默認(rèn)值回顧單例模單例模式的意思就是只有一個(gè)實(shí)例,分為餓漢式(加載類時(shí)就初始化實(shí)例)懶漢式(第一次調(diào)用getInstance()時(shí)才生成實(shí)例)兩種實(shí)現(xiàn)方案SpringIoCbean默認(rèn)只有一個(gè)實(shí)例(單例的,且默認(rèn)情況下會在容器啟動時(shí)初,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(相等,即同一個(gè)實(shí)例)}四、對所有bean都應(yīng)用延遲初始化方法是在根節(jié)點(diǎn)beans中設(shè)置屬性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接口中沒有方法,需要強(qiáng)轉(zhuǎn)為具體的實(shí)現(xiàn)類才可以調(diào)用依賴注入——手工裝配(XML方式依賴注入的方通過spring構(gòu)造實(shí)例對象的時(shí)候,對象中的屬性賦值的方式有如下幾一、通過setter方法注入:類中一定要提供相應(yīng)的setXX方法,才能執(zhí)行成通過setter<beanid="userDao1"<propertyname="jdbcUrl"<propertyname="driverClass"<propertyname="username"<propertyname="password"二、通過構(gòu)造器注入:類中要提供帶參數(shù)的構(gòu)造方法,并且下面參數(shù)是有順序<beanid="userDao2" 或是通過構(gòu)造方法注入,會與指定的索引匹配,第1個(gè)索引為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注入依賴的對方式一定義一個(gè)bean<beanid="userDao"<!--<bean <propertyname="userDao"說明bean時(shí)不分先后,Spring方式二:使用bean,因?yàn)闆]有id或name,所以該bean不能被其他bean使用,如果你試圖去獲取<<!--在property中直接定義一個(gè)bean,不需要指定id或name,指定了也無效<beanid="userService2"<property<beanid="userDao2".j_di_bean.UserDaoImpl"<propertyname=”dataSource”注入集合屬一、創(chuàng)建類publicpublicclassUserprivateString//集合最好指定強(qiáng)類型,以便 <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=""""<!--設(shè)置為自動掃描與裝配bean,掃描指定包及其所有下級包中的類,可以寫多個(gè),之間用英文的逗號隔開 ponent-scanbase- 依賴注入——手工裝配(注解方式說明一般是bean和bean直接的依賴關(guān)系的時(shí)候用比較使用注解方式時(shí),也支持給Field注入值(在XML中不可以給Field注入@Resource注解在spring安 的lib\j2ee\common-準(zhǔn)java代碼中使用@Resourcexml配置文件中配置以下信息:context的話,先preferenc》xml中,dist、resource中添xsd然后add進(jìn)去1、引入context命名空間、在配置文件中添 ponent-scan。多個(gè)包的時(shí)候,可以用逗號隔applicationContext.xml配置文件如下在類中使用——定義spring2.5spring2.5為我們引入了組件自動掃描機(jī)制,它可以在類路 尋找標(biāo)注了@Component@Service、@Controller、@Repository注解的類,并把這些類納入進(jìn)spring容器中管理。它的用和在xml文件中使用bean節(jié)點(diǎn)配置組件是一樣的功能介紹@Service用于標(biāo)注業(yè)務(wù)層組件@Repository用于標(biāo)注數(shù) 組件,即DAO組件@Controller用于@Repository用于標(biāo)注數(shù) 組件,即DAO組件@Scopebeanprototypesingleton。在類中使用——注這需要通過@Resource注解實(shí)現(xiàn),@Resource注解可以標(biāo)注在字段或?qū)傩缘膕etter方法上,但它默認(rèn)按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當(dāng)注解標(biāo)注在字段上,即默認(rèn)取字段的名稱作為bean名稱尋找依賴對象,當(dāng)注解標(biāo)注在屬性的setter方法上,即默認(rèn)bean名稱尋找依賴對象。@Resource默認(rèn)按名稱裝配,當(dāng)找不到與名稱匹配的bean才會按類型裝配。如果沒有指定name屬性,并且按照默認(rèn)的名稱找不到依賴對象時(shí),@Resource注解會回退到按類型裝配。但一旦指定了name publicvoid Dao)set Dao }后一種相當(dāng)于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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論