學習spring教程Spring框架是一個開源的Java平臺它為容易而快速開發(fā)_第1頁
學習spring教程Spring框架是一個開源的Java平臺它為容易而快速開發(fā)_第2頁
學習spring教程Spring框架是一個開源的Java平臺它為容易而快速開發(fā)_第3頁
學習spring教程Spring框架是一個開源的Java平臺它為容易而快速開發(fā)_第4頁
學習spring教程Spring框架是一個開源的Java平臺它為容易而快速開發(fā)_第5頁
已閱讀5頁,還剩201頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

SpringJavaJava本是基于在2015年3月發(fā)布的Spring框架4.1.6版本編寫的。本是為需要詳細了解Spring框架的體系結(jié)構(gòu)和實際應用的Java程序員設計的。本將帶你達到中級的專在進行本之前,你應該對Java編程語言有一個很好的了解。對EclipseIDE的基本了解也是必須的,因為所有的示例都是使用EclipseIDE進行編譯的。前 第1 概 第1 依賴注入 第2 體系結(jié) 第3 環(huán)境設 第4 oWorld實 第5 IoC容 S的BeanFactory容 Springox容 第6 Bean定 第7 Bean的作用 第8 Bean的生命周 第9 Spring——Bean后置處理 第10 Bean定義繼 依賴注 Spring基于構(gòu)造函數(shù)的依賴注 Spring基于設值函數(shù)的依賴注 第12 注入內(nèi)部 第13 注入集 第14 Beans自動裝 Spring自動裝配 Spring自動裝配 Spring由構(gòu)造函數(shù)自動裝 第15 基于注解的配 Springqe注 Spring@Autowired注 Springl注 SpringJSR-250注 第16 基于Java的配 第17 Spring中 處 第18 Spring中的自定 第19 Spring框架的 Spring中基于AOP的XML架 Spring中基于AOP的 第20 JDBC框架概 SpringJDBC示 第21 事務管 Spring編程式事務管 Spring式事務管 第22 MVC框 SpringMVCoWorld例 SpringMVC表單處理例 Spring頁面重定向例 Spring靜態(tài)頁面例 Spring異常處理例 第23 使用Log4J記錄日 1Spring是最受歡迎的企業(yè)級JavaSpring框架來SpringJavaRodJohnson2003年6當談論到大小和時,Spring是輕量級的。Spring框架的基礎版本是在2MB左右的Spring框架的特性可以用于開發(fā)任何Java應用程序,但是在JavaEE平臺上構(gòu)建web應用程序是需要擴展的。Spring框架的目標是使J2EE開發(fā)變得更容易使用,通過啟用基于POJOSpringSpringSpringPOJOsPOJOsEJB容器產(chǎn)品,比如一個應用程序服務器,但是你可以選擇使用一個健壯的etTomcat或者一Spring在一個單元模式中是有組織的。即使包和類的數(shù)量非常大,你必須并且只需要但是你需要的,而忽略SpringORMJEE、Quartz和JDK計時器,其他視圖技術(shù)。測試一個用Spring編寫的應用程序很容易,因為envinmentdependent代碼被放進了這個框架中。此外,通過使用JavaBean-stylePOJOs,它在使用依賴注入注入測試數(shù)據(jù)時變得更容易。Spring的web框架是一個設計良好的webMVC框架,它為web框架,比如Structs或者其他工程上的或者很少受歡迎的web框架,提供了一個很好的供替代的選擇。了一個方便的API,而這些都是 IOCEJBCPU庫)和擴展成一個全局事務(例如,使用JTA)。1(DI)|11(DI)|Spring最認同的技術(shù)是控制反轉(zhuǎn)的依賴注入(DI)模式。控制反轉(zhuǎn)(IoC)是一個通用的概念,它可以用許多不當編寫一個復雜的Java應用程序時,應用程序類應該盡可能的獨立于其他的Java類來增加這些類可重用額可能性,當進行單元測試時,可以使它們獨立于其他類進試。依賴注入(或者有時被稱為配線)有助于將這些ABBoCA依賴注入可以以向構(gòu)造函數(shù)傳遞參數(shù)的方式發(fā)生,或者通過使用setterpost-construction。由于依賴注入是Spring框架的部分,所以我將在一個單獨的章節(jié)中利用很好的例子去解釋這一概念。面向方面的程序設計Spring框架的一個關(guān)鍵組件是面向方面的程序設計(AOP框架。一個程序中多個點的功能被稱為橫切關(guān)注點志記錄、性事務、安全,和緩存等等。OOPAOPAOPSpring框架的AOP模塊提供了面向方面的程序設計實現(xiàn),允許你定義器方法和切入點,可以實現(xiàn)將應該被分 關(guān)于SpringAOP的概念。2Spring有可能成為所有企業(yè)應用程序的一站式服務點,然而,Spring是模塊化的,允許你挑選和選擇適用于你的模塊,不必要把剩余部分也引入。下面的部分對在Spring框架中所有可用的模塊給出了詳細的介紹。Spring20oCBean模塊提供BeanFactorytionContext接口是上下文模塊的重點。ORMAPI,包括PJ,Hibernate和iBatis,Java消息服務JMS事務模塊為實現(xiàn)特殊接口的類及所有的POJO支持編程式和式事務管理WebWeb,Web-MVC,Web-SocketWeb-PortletWeb模塊提供了基本的面向web的集成功能,例如多個文件上傳的功能和使用srvlet器和面向oCWeb-MVC模塊包含Spring的模型-視圖-控制器(MVC),實現(xiàn)了web應用程序。eb-Socket模塊為WebSocet-bsedwebWeb-Portlet模塊提供了在portlet環(huán)境中實現(xiàn)MVC,并且反映了Web-Sevlet模塊的功能。還有其他一些重要的模塊,像AOP,Aspects,Instrumentation,WebAOP模塊提供了面向方面的編程實現(xiàn),允許你定義方法器和切入點對代碼進行干凈地解耦,它實現(xiàn)了應Aspects模塊提供了與AspectJ的集成,這是一個功能強大且成面向切面編程(AOP)框架mtMessing模塊為STOMPWebSocket子協(xié)議的使用。它也支持一個注解WebSocket客戶端的STOMP信息。測試JUnitTestNGSpring3本將指導你如何準備開發(fā)環(huán)境來使用Spring框架開始你的工作。本還將教你在安裝Spring框架之前如何在你的機器上安裝JDK,TomcatEclipse。第1步:安裝Java開發(fā)工具包你可以從Oracle的JavaJavaSEDownloads wnlods/inde.html)SDK的版本。你會在的文件中找到教你如何安裝JDK的說明,按照給出的說明安裝和配置JDK的設置。最后,設置PATHJAVA_HOME環(huán)境變量,引入包含java和javac的目oset1_WindwsXP/7/8PATHOK在nix(olaris、Linux等等)上,如果在/usr/local/jd6.0_15上安裝SDK,并且使用Cs命令,你將把下面的內(nèi)容添加到.cshrc文件中。usol/jdk160_1/bn:HsetenvJAVA_HOME/usr/loca/d1.6.0_15或者,如果你使用集成開發(fā)環(huán)境(IDE),如Borlandu,nliJIDEA或者SunONEStudio,IDEJava,IDE給定的文檔做正確的設第2步:安裝ApacheCommonsLogging /logging/ApacheCommonsLoggingAPI的版本。一旦你完安裝包,并且解壓二進制的版本到一個方便的位置。例如在windows上的C:\commons-logging-1.1.1中,或在Linux/Unix上的 mons-logging-1.1.1中。該 上正確的設置CLASSPATH變量,否則你將會在運行應用程序時遇到問題3步:安裝Eclipse為了安裝EclipseIDE,從上的Eclipse二進制文件。一旦你下載完安裝包,并且解壓二進制的版本到一個方便的位置。例如在windows上的C:\eclipse中,或在Linux/Unix上的/ur/lcl/eclipe中,最后恰當?shù)脑O置PATH變量。在Windows機器上,可以通過執(zhí)行以下命令啟動Elipse,或者可以簡單地雙擊elipse.exeus/oclecsecse第4Spring現(xiàn)在如果一切正常,你就可以繼續(xù)設置你的Spring框架。下面是在你的機器上并安裝框架的簡單步驟選擇是要在Windows還是在UIX上安裝pring,然后繼續(xù)進行下一個步驟,在Windows上文件,而在Unix上.tz文件從版本的Spring框架的二進制在寫本的時候,我在我的Windows機器上了spring-framework-4.1.6.RELEASE-dist.zi 結(jié)構(gòu)為:\ring,如下所示。 E:\spring\libs中發(fā)現(xiàn)所有的Spring庫。確保你在這個 上正確的設置CLASSPATH變量,否則你將會在運行應用程序時遇到問題。如果使用的是s就不需要設置CLASSPATH,因為所有的設置將EclipseSprng4oWorld讓我們使用Spring框架開始實際的編程。在你開始使用Spring框架編寫第一個例子之前,你必須確保已經(jīng)正確地設置了Spring環(huán)境,正如在Spring——環(huán)境設置()中如所說的。假設你有了解一些有關(guān)EclipseIDE工SpringSpringBeans“oWorl!”或其他信息。第1步:創(chuàng)建JavaEclipseIDEJavaFile->New->Project,最后從向?qū)Я斜碇羞x擇JavaProject向?qū)А,F(xiàn)在,使用向?qū)Т翱趯⒛愕捻椖棵麨閛Spring,如下所示:ProjectExplorer第2第二步讓我們添加Spring框架和通用的日志API庫到我們的項目中。為了做到這個,在你的項目名稱oSpring上單擊右鍵,然后在快捷菜單上按照下面可用的選項:BuidPath->ConfigureBuildPathJava現(xiàn)在,在Libraries中使用可用的AddExternalJARs按鈕,添加從Spring框架和通用日志安裝 的JAR文件:spring-aop-44LEspring-beans-44.6RLAEspring-core-46.EESE.16.LAEspring-instrument-spring-jdbc-4..EESEspring-jms-4LEspring-orm-spring-test-spring-tx-46.EESEspring-web-46gwebmvc-n4.AE第3 包。為了做到這個,在packageexplore區(qū)域中的src上點擊右鍵,并按照選項:New->Package。o publicclass oWorld{privaterpublicvoida(tmessage){a=message;}publicvoidSystem.out.println("YourMessage:"+}}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidman(Sring[]{AplicationContextcontextnewaoWorldobj=oWorld)}}}第一步是我們使用框架APIClassPathXmlApplicationContext()來創(chuàng)建應用程序的上下文。這個API加beansAPIb**getBean()**beanbeanID第4步:創(chuàng)建bean你需要創(chuàng)建一個Bean的配置文件,該文件是一個XML文件,并且作為粘合bean的粘合劑即類。這個文件需要在src ens.lCLSSATHMainApp.javaBeans.ml用于給不同的ean分配唯一的DSpring“message”oWorld.java和MainApp.java文件。讓們來看看它是如何工作的:<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<bean ool"cass=cotrant. <propertysae oWor>當Spring應用程序被加載到內(nèi)存中時,框架利用了上面的配置文件來創(chuàng)建所有已經(jīng)定義的beans,并且按照標簽的定義為它們分配一個唯一的I。你可以使用來傳遞在創(chuàng)建對象時使用不同變量的值。第5一旦你完成了創(chuàng)建源代碼和bean的配置文件后,準備好下一步編譯和運行你的程序。為了做到這個,請保持ainApp.Java文件是有效的,并且在EclipseIDE中使用可用的Run選項,或使用Ctrl+F11編譯并運行你的應用程序MainApp。如果你的應用程序一切都正常,將在EclipseIDE控制臺打印以下信息:YourYourMessage oSpring應用程序的靈活性。下一步,我們開始在接下來的幾個章節(jié)中做一些更有趣的事5IoC容器Spring容器是Spring框架的。容器將創(chuàng)建對象,把它們連接在一起,配置它們,并管理他們的整個生命周期從創(chuàng)建到銷毀。Sprng容器使用依賴注入(DI)SpringBe通過閱讀配置元數(shù)據(jù)提供的指令,容器知道對哪些對象進行實例化,配置和組裝。配置元數(shù)據(jù)可以通過XML,JavaJavaSpringSpringICJavaPOJO序11neDIp.ctory.BeanFactory接口來定義。BeanFactoryBeanFactorye,ntalizngBean,DisposabeBean,在png中仍然存在具有大量的與ping整合的第框架的反向兼容性的目的。2SpringApplicationContextioc-otiner/sprin-applicationcontext-e力,發(fā)布應用程序給感的器的能力。該容器是由atcx接口定義。eBeanFactoryBeanFactory。BeanFactory仍然可以用于輕量級的應用程序,如移動設備或基于applet的應用程序,其中它的數(shù)據(jù)量和速度是顯著。S的BeanFactory容這是一個最簡單的容器,它主要的功能是為依賴注入(DI)提供支持,這個容器接口在org.springframework.beas.factry.eaFacor中被定義。BeanFactoryBeanFactoryAware、DisposableBean、InitializingBea,SpringSpring整合在SpringBeanFactoryXmlBeanFactory類。這個容器從一個XML文件中配置元數(shù)據(jù),由這些元數(shù)據(jù)來生成一個被配置化的系統(tǒng)或者應用。appletBeanFactoryAplicationContext,除非你有更好的理由選擇BeanFactory。EclipseIDE,Spring步1Sp1SpingEamplesrccom.tutorialspoint2點擊右鍵,選擇AddExternalJARs選項,導入Spring的庫文件,正如我們在SpringoWorldExample章節(jié)中提到的導入方式。3在i文件夾下創(chuàng)建oWorld.java和MinApp.java兩個類文件4srcBeanl5最后的步驟是創(chuàng)建所有Java文件和Bean oWorld.java的內(nèi)容publicclass oWorld{privaterpublicvoida(tmessage){a=message;}publicvoidSystem.out.println("YourMessage:"+}}MainApp.javapackagepackageomrapnt;importrneaimportpetimportpecasathepubicclassApublicstaticvoidmai(Sring[]args)XmleaFactryfactory=newXmlBenFactry(newsRsuoWorldobj=oWorld)}}XmlBeanFactory()APIbeanClassPathResource()APICLASSPATHbeanXmlBeanFactory()API對象,即在配置文件中提到的bean。第二步利用第一步生成的bean工廠對象的getBean()方法得到所需要的beanBeans.xml<?xm<?xml<beansxmlns="mns"encoding="UT-""ishaLocat"<bean ool"cass=cotrant. <propertysae oWor>YourMessageoW!ApplicationContext是spring中較高級的容器。和BeanFactory類似,它可以加載配置文件中定義的bean,beanbean文件從解析文本信息和將傳遞給所指定的器。這個容器在org.spingframeokcotet.AplicationContextinterface接口中定義。x包含BeanFactory所有的功能,一般情況下,相對于BeanFactory,Applicationotext會被推薦使用。BeanFactoryappletAplicationContextFileSystemXmlApplicationContext:該容器從XML文件中加載已被定義的bean。在這里,你需要提供給構(gòu)造器XML文件的完整路徑ClassPathXmlApplicationContext:該容器從XML文件中加載已被定義的beanXMLCLASSPATHCLASSPATH中bean配置文件。WebXmlApplicationContext:該容器會在一個web應用程序的范圍內(nèi)加載在XML文件中已被定義的be我們已經(jīng)在SpringoWrldExample章節(jié)中看到過ClassPathXmlAplicationContext容器,并且,在基于spring的webXmlWebpplicatinContext。所以,接下來,讓我們看一個關(guān)于FleytmXlApplicationContxtEclipseIDE,Spring步1Sp1SpingEamplesrcn的文件夾2點擊右鍵,選擇AddExternalJARs選項,導入Spring的庫文件,正如我們在SpringoWorldExample章節(jié)中提到的導入方式。3在i文件夾下創(chuàng)建oWorld.java和MinApp.java兩個類文件4文件夾下創(chuàng)建Bean的配置文件ens.xml5最后的步驟是編輯所有JAVA文件的內(nèi)容和Bean oWorld.java的內(nèi)容publicclass oWorld{privaterpublicvoida(tmessage){a=message;}publicvoidSystem.out.println("YourMessage:"+}}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;import.tppubicclassnp{publicstaticvoidmai(Sring[]args)AplicationContextcontext=newFileSystemXmlApplicaonCotxt(C/r/ZARk/ opngrB.l");oWorldobj=oWorld)}}第一步生成工廠對象。加載完指定路徑下bean配置文件后,利用框架提供的FileSystemXmlApplicationContextAPI去生成工廠bean。FileSystemXmlApplicationContext負責生成和初始化所有的對象,比如,所有在XMLbean配置文件中的bean。getBean()beanbeanID來返回一個真正的對象。一旦得到這個對象,就可以利用這個對象來調(diào)用任何方法。Beans.xml<?xm<?xml<beansxmlns="mns"encoding="UT-""ishaLocat"<bean ool"cass=cotrant. <propertysae oWor>YourMessageoW!6Bean定義beanSpringIoC容器管理的。beanSpringIoCbean在XML的表單中的定義。beanbeanbean的依賴關(guān)系上述所有的配置元數(shù)據(jù)轉(zhuǎn)換成一組構(gòu)成每個bean屬 描這個屬性是強制性的,并且指定用來創(chuàng)建bean的bean這個屬性指定唯一的bean標識符。在基于XMLIDnamebeanbeanbeanconstructor-prteslazy-iniializationbeanoC容器在它第一次被請求時,而不是在啟動時去創(chuàng)建一個bean實例。obeanbeanbeanbean你已經(jīng)看到了如何把基于XMLML個配置文件中有不同的ean<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<!--Asimebeanefnin--<beanid="..."<!--cllabratorsandconfigurationforthisbeangohere--<!--Abeandeinitionwithlazyinitseton--<beani="..."class="..."lay-<!--cllabratorsandconfigurationforthisbeangohere--<!--Abeandefinitionwithimethod--<beanid="..."class="..."init-ehd...><!--cllabratorsandconfigurationforthisbeangohere--<!--Abeandeinitionwithdestructionmethod--<!--cllabratorsandconfigurationforthisbeangohere--<!--morebeanefnitiosgohere--你可以查看SpringoWorld實例()來理解如何定義,配置和創(chuàng)建SpringBeansSpring依賴注入編程之前,能掌握一些其他重要的Spring概念。7Bean當在Spring中定義一個時,你必須該bean的作用域的選項。例如,為了強制Spring在每次需要時都產(chǎn)生一個新的bean實例,你應該bean的作用域的屬性為prototype。同理,如果你想讓Spring在每次需要時都返回同一個bean實例,你應該bean的作用域的屬性為singleton。作用 描該作用域?qū)我籦eanntext的上下文中有效。beanHTTPweb-awareSpringAnContext本章將討論前兩個范圍,當討論有關(guān)web-awarepringt時,其余三個將被討論singleton,SpringIoCbean在這種單例bean的高速緩存中,以及針對該bean的所有后續(xù)的請求和都返回緩存對象。singletonbeanbean域的屬性為singleton,如下所示:<!--<!--Abeandeinitionwithsingletonscope--<beani="..."class="..."<!--cllabratorsandconfigurationforthisbeangohere--EclipseIDE,Spring步1Sp1SpingExmplesrccom.tutorialspoi2使用AddExternalJARs選項,添加所需的Spring庫,在SpringoWorldExample章節(jié)解釋3在com.tutorialspoint包中創(chuàng)建Java類World和MainAp4srcBeansBn.xml5最后一步是創(chuàng)建的所有Java文件和Bean這里這里 packagecom.tutorialspoint;publicclass oWorld{privateStringpublicvoidsetMessage(Stringmessage){this.message=message;}publicvoidSystem.out.println("YourMessage:"+}}MainApp.javapackagepackageimport publicclassMainApp{publicstaticvoidmain(String[]args)ApplicationContextcontext=newClassPathXmlApplicationContext("Beans.xml");oWorldobjA=( oWorld)context.getBean(" objA.setMessage("I'mobjectoWorldobjB=oWorld)}}下面是singleton作用域必需的配置文件<?xml<?xmlversion="1.0"encoding="UTF-<beansxmlns="""<bean oWorld" YourYourMessage:I'mobjectAYourMessage:I'mobjectprototypebeanSpringIoCBean例。一般說來,滿狀態(tài)的bean使用prototype作用域和沒有狀態(tài)的bean使用singleton作用域。prototypebeanprototype<!--<!--Abeandeinitionwithsingletonscope--<beand="..."class="..."<!--cllabratorsandconfigurationforthisbeangohere--EclipseIDE,Spring步1Sp1SpingExmplesrc文件夾中創(chuàng)建一個包o2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)3在com.tutorialspoint包中創(chuàng)建Java類World和MainAp4在src文件夾中創(chuàng)建Beans配置文件eas.xml5最后一步是創(chuàng)建的所有Java文件和Bean packagecotrant;pubic {tStringpublicvoida(tmessage){a=message;}publpublicvoidSystem.out.println("YourMessage:"+}}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidmai(Sring[]args)AplicationContextcontext=newttBn.oWorldobjA=( oWorld)context.getBean(" WbA.etessae(mobjectoWorldobjB=oWorld)W}}sm:<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<bean oWorld" o一旦你創(chuàng)建源代碼和BeanYourYourMessage:I'mobjectAYourMessage:null8Bean理解Springbean的生命周期很容易。當一個bean被實例化時,它可能需要執(zhí)行一些初始化使它轉(zhuǎn)換成可用狀態(tài)。同樣,當bean不再需要,并且從容器中移除時,可能需要做一些清除工作。盡管還有一些在Beanbean為了定義安裝和拆卸一個bean,我們只要帶有init-method和/或destroy-method參數(shù)的。init-method屬性指定一個方法,在實例化bean時,立即調(diào)用該方法。同樣,destroy-method指定一個方法,只有從容器中移除bean之后,才能調(diào)用該方法。org.pringfrmework.beans.actory.InitializingBeanpubpubicclassExampleBeanimplementsge{lcvoidafterPrpertiesSet()//dosomeaz}}XMLinit-methodvoid =xclass="exmple.EamleBean"init-dipubpubicclassblc//dosomeaz}}oapubpubicclassExampleBeanimplementsoe{publicvoiddestroy()//dosomedestruction}}XMLdestroy-methodvoid<bean<beandexpeBn"clas="exaple.xapleBean"destroy-pubpubicclass{publicvoiddestroy()//dosomedestruction}}如果你在非web應用程序環(huán)境中使用Spring的IoC容器;例如在豐富的客戶端桌面環(huán)境中;那么在JVM中你要關(guān)閉hook。這樣做可以確保正常關(guān)閉,為了讓所有的資源都被釋放,可以在單個beans上調(diào)用destroy方建議你不要使用IntialiingBean或者bBa的回調(diào)方法,因為XML配置在命名方法上提供了極大EclipseIDE,Spring步 描1SpingExmple的項目,并且在創(chuàng)建項目的src文件夾中創(chuàng)建一個包2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)3在com.tutorialspoint包中創(chuàng)建Java類World和MainAp4在src文件夾中創(chuàng)建Beans配置文件Ben.xml5最后一步是創(chuàng)建的所有Java文件和Bean下面是下面是MainApp.java文件的內(nèi)容。在這里,你需 一個nx packageomrapnt;pubic {iSpublicvoida(tmessage){this.message=message;}publicvoidSystem.out.println("YourMessage:"+}publicvoidSystem.out.println("Benisgoingthrough}publicteotprntn("endestroynow.");}hookregisterShutdownHook()方法。它將確保正常關(guān)閉,并且調(diào)用相關(guān)的destroy方法。packagepackagecotrant;importaximportr.prnpubicclassnppublicstaticvoidmai(Sring[]args)ApplicationContetcontext=newx"aoWorldobj=oWorld)}}<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<bean assotoalpnt. oolinit-oit destroy-edeto><property<propertysae oWor>BeanBeanisgoingthroughinit.YourMessage:oorBeanwilldestroynow.如果你有太多具有相同名稱的初始化或者銷毀方法的Bean,那么你不需要在每一個bean上初始化方法和銷毀方法default-init-methoddefault-destroy-method屬性提供了靈活地配置這種情<beans<beansmns"ishaLocat""""<beanid="..."<!--cllabratorsandconfigurationforthisbeangohere--9Spring——Bean后置處理器BeanPostProcessor接口定義回調(diào)方法,你可以實現(xiàn)該方法來提供自己的實例化邏輯,依賴解析邏輯等。你也SpringBeanPostProcessorbean你可以配置多個BeanPostProcessor接口,通過設置BeanPostProcessor實現(xiàn)的Ordered接口提供的order屬性來控制這些BeanPostProcessor接口的執(zhí)行順序。BeanPostProcessorbean(或?qū)ο螅㏒pringIoCbeanBeanPostProcessorApplicationContext會自動檢測由BeanPostProcessor接口的實現(xiàn)定義的bean,這些bean為后置處理器,然后通過在容器中創(chuàng)建bean,在適當?shù)臅r候調(diào)用它。x我們在適當?shù)奈恢檬褂肊clipseESpring應用程序:步1Sp1SpingExmplesrccom.tutorialspoi2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)3在com.tutorialspoint包中創(chuàng)建Java類oWorld、 World和MainAp4在src文件夾中創(chuàng)建Beans配置文件Ben.xml5最后一步是創(chuàng)建的所有Java文件和Bean orld.java**文件的內(nèi)容publicclass oWorld{privaterpublicvoida(tmessage){a=message;}publicvoidSystem.out.println("YourMessage:"+}publicvoidSystem.out.println("Benisgoingthrough}publpublicteotprntn("endestroynow.");}這是實現(xiàn)BeanPostProcessor的非常簡單的例子,它在任何bean的初始化的之前和之后輸入該bean的名稱。你可以在初始化bean的之前和之后實現(xiàn)更復雜的邏輯,因為你有兩個內(nèi)置bean對象的后置處理程序 下面是MainApp.java文件的內(nèi)容。在這里,你需 一個nx packagecotrant;importsnwonoimportrka pubicclass oWorldimplementsBeanPostProcessorpublicObjectpostProcsBeoreInitialization(Objectbean,StringbeanName)throws {ystem.utprintln("BeforeInitilization:"+beanName);returnbean;//youcanreturnanyotherobjectasl}publicObjectostrocessAftrInitialization(bjctbean,StringbeanName)throws {l:"+beanName);returnbean;//youcanreturnanyotherobjectasl}}hookregisterShutdownHook()方法。它將確保正常關(guān)閉,并且調(diào)用相關(guān)的destroy方法。packagepackagecotrant;importaximportr.prnpubicclassnppublicstaticvoidmai(Sring[]args)ApplicationContetcontext=newx"aoWorldobj=oWorld)}}<?xm<?xmlversion="1.0"encoding="UT-<beansmns""ns"i:ceaLocan""<bean oWorld"t Winitdndestroy-hd<propertysae oWor><beano oWorld"ao:lBeanisgoingthroughinit.enao:oWorldYourMessage:orBeanwilldestroynow.Bean子beanSpringBeanJavabean為模板和其他子bean就可以從父bean中繼承所需的配置。當你使用基于XML的配置元數(shù)據(jù)時,通過使用父屬性,指定父bean作為該屬性的值來表明子beanEclipseIDE,Spring步 描1SpingExmple的項目,并且在創(chuàng)建項目的src文件夾中創(chuàng)建一個包2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)3在com.tutorialspoint包中創(chuàng)建Java World、 和Mainpp4在src文件夾中創(chuàng)建Beans配置文件Ben.xml5最后一步是創(chuàng)建的所有Java文件和Bean下面是配置文件Beans.xml,在該配置文件中我們定義有兩個屬性message1和message2的“oWorld”bean。然后,使用parent屬性把“o”bean定義為“oWorld”beanbean繼承message2的屬性,重寫message1的屬性,并且引入一個屬性message3。<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<bean ool"cass=cotrant. <propertysg1 oWor><propertyname="message" oSecondWorl><bean"o" <propertymsag1 <propertyname="messag3"e oo .javapublicclass oWorld{vrmessage1;privateStringmessage2;publicvoid1imessage){this.message1=message;}blcvoidsetessage2(Strngmessage){sg=message;}publicvoidSystem.out.println("WrldMessage1:"+}publicvoidSystem.out.println("WrldMessage2:"+}}packagecotrant;publico{privateStringatmessage2;privatetmessage3;publicvoid1imessage){this.message1=}blcvoidmessage){sg=}blcvoidmessage){g=}publicvoidinMessage1:"+}publicvoidin Message2:"+}publicvoidin Message3:"+}}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext; tex.supportassPaXAppctnCtt;pubicclassApublicstaticvoidmai(Sring[]args)AplicationContextcontext=newttBnoWorldobjA= oWorld) WoobjB= ) }}WWoldMessage1WorldMessage2Message1:Message2Secondro!oSecondWrMessage3: 在這里你可以觀察到,我們創(chuàng)建“o”bean的同時并沒有傳遞message2,但是由于Bean定義的繼承,所以它傳遞了message2。Bean定義模板你可以創(chuàng)建一個Bean定義模板,不需要花太多功夫它就可以被其他子bean定義使用。在定義一個Bean定義模板時,你不應該指定類的屬性,而應該指定帶true值的抽象屬性,如下所示:<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<beanbn <propertysg1 oWor><propertyname="message" oSecondWorl><propertyname="messag3"e <bean"ur"entbeaeam<propertymsag1 <propertyname="messag3"e oo作為一個純粹的模板bean定義來使用的,充當子定義的父定義使用。每個基于應用程序的aa一個復雜的JavaJava或有時稱為布線)publpublicclassTextEditorapcrpublicTextEditor(){spellChecker=newke}}TextEditorpelChecker之間的依賴關(guān)系。在控制反轉(zhuǎn)的場景中,我們反publpublicclassTextEditorapcrpublicTextEditor(){spellChecker=newke}}在這里,TextEditorSelChecker的實現(xiàn)。SpellCecerTextEditor例化的時候?qū)⑻峁┙oTextEditor,整個過程是由Spring框架的控制。TextEditor(XML),且依賴關(guān)系(即SelChecker類)通過類構(gòu)造函數(shù)被注入到TextEditor類中。因此,控制流通過依賴注入(DI)已依賴注入的第二種方法是通過TextEditor類的Setter方法,創(chuàng)建pllChecker實例,該實例將被用于調(diào)用setter方法來初始化TextEditor的屬性。序11jctmd)依賴關(guān)系的setter是一個好的做法。知道依賴關(guān)系的位置或類,而這一切都由Spring框架控制的。下面的例子顯示了一個類TextEditor,只能用構(gòu)造函數(shù)注入來實現(xiàn)依賴注入。步1創(chuàng)建一個名為Spri1創(chuàng)建一個名為SprigExmple的項目,并在創(chuàng)建的項目中的src文件夾下創(chuàng)建包。2使用AddExternalJARs選項添加必需的Spring庫,解釋見SpringoWorldExample3在com.tutorialspoint包下創(chuàng)建Java類TextEdior,SpellChecker和MainAp4在srcBeans的配置文件ens.xml5最后一步是創(chuàng)建所有Java文件和BeanTextEditor.javapublicclassTextEditor{aSkpublicxocthis.spellChecker=r}publicvoid{heckcSellng);}}下面是另一個依賴類文件SpellChecker.javapackagepackagecom.uorialspint;publicclassSpelCheckerpublicheSystem.out.println("Insideekconstructor."}publpublicvoid.);}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidman(Sring[]{AplicationContextcontextnewClassPahmlAppictionContext("Beans.xml");spllhe(;}}Beans.xml<?xmlversion="1.0"encoding="UT-<beans"mns""ishaLocat"<beantasso.ttapntextEdt><constructor-arge"spelhece><!--DefinitionforspellCheckrbean--<beanslsIInsideSkconstructor.InsideTextEditorconstructor.Insideckelng.beanpackagex.y;packagex.y;publicFoo(Barbar,Bazbaz)//}}<beanid="foo"ass"xyFo><constructor-arg<constructor-arge<beanid="bar"assx..ar><beanid="baz"lass"ya>packagepackagex.y;publicFoo(intyear,Stringname)//}}type<bean"asseesmpeBean>aue201><constructor-argtype"jav.lang.String"aueaa>索引為0的例子,如下所示:<bean"asseesmpeBean><constructor-argndex=0"a<constructor-argindex="1"aueaa">使用如上所示的value屬性。factory方法來初始化你的bean后,通過容器在你的讓我們用EclipseIDE適當?shù)毓ぷ鳎凑找韵虏襟E創(chuàng)建一個Spring應用程序。步1創(chuàng)建一個名為Spri1創(chuàng)建一個名為SprigExmple的項目,并在創(chuàng)建的項目中的src文件夾下創(chuàng)建包。2使用AddExternalJARs選項添加必需的Spring庫,解釋見SpringoWorldExample3在com.tutorialspoint包下創(chuàng)建Java類TextEdior,SpellChecker和MainAp4在srcBeans的配置文件ens.xml5最后一步是創(chuàng)建所有Java文件和BeanTextEditor.javapublicclassTextEditor{aSk.publicvoidhekrSpChce.this.spellChecker=r}//agettermethodtoreturnspelheerpublicegetSpellChecker()hecke;}publicvoid{heckcSellng);}}spellCheckersetSpellChecker()方法,該方法與JavaPOJO類非常相似。讓我們創(chuàng)建另一個依賴類文件SpellChecker.java的內(nèi)容:publicclassSpelCheckerpublicheSystem.out.println("Insideekconstructor."}publicvoid.);}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidman(Sring[]{AplicationContextcontextnewClassPahmlAppictionContext("Beans.xml");spllhe(;}}Beans.xml<?xmlversion="1.0"encoding="UT-<beans"mns""ishaLocat"<beantasso.ttapntextEdt><propertynae=spelheke"espelheke><!--DefinitionforspellCheckrbean--<beansls函數(shù)注入中,我們使用的是中的元素,而在基于設值函數(shù)的注入中,我們使用的是中的元素。直接傳遞一個值,那么你應該使用value屬性。IInsideSkconstructor.InsidesetSelCheckr.Insideckelng.p-namespaceXMLXMLp-namespace是非常方便的。讓我們查看一下區(qū)以帶有的標準XML配置文件為例<?xmlversion="1.0"encoding="UT-<beans"mns""ishaLocat"<beanjnclassic"asscmexape<propertyevalue="John<propertyu<beaneass=cmexame<propertyevalue="John上述XML配置文件可以使用p-namespace<?xmlversion="1.0"encoding="UT-<beans"mns"""ishaLocat"<beanoclassic"sea."p:name="JonDoe"p:spouse-e<beanjelsx."p:name="JonDoe"/>在這里,你不應該區(qū)別指定始值和帶有p-namespace的對象。ref分表這不一個接的,而是對另一個ben的 。注入內(nèi)部Javainnerbeansbean的bean。因此在或元素內(nèi)元素被稱為內(nèi)部bean,如下所示。<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<beand<propertye<beanid="innerBean"EclipseIDE,Spring步11SpingExmplesrcomtutrialspoint。2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)。optionasexinedinthechapter.3在com.tutorialspoint包中創(chuàng)建Java類TextEditor、SelChecker和MainApp4在src文件夾中創(chuàng)建Beans配置文件Ben.xml5TextEditor.javapublicclassTextEditor{aSk.publicvoidhekrSpChce.this.spellChecker=r}//agettermethodtoreturnpelheerpublpublice{return}publicvoid{heckcSellng);}}下面是另一個依賴的類文件SpellChecker.javapackagepackagecom.uorialspint;publicclassSpelCheckerpublicheSystem.out.println("Insideekconstructor."}publiccpSystem.ouprintln("Inside.);}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidmai(Sring[]args)AplicationContextcontext=newttBn.TextEditorte=(TextEditor)context.getBean("textEditor");}}<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<beantasso.ttapntextEdt><propertyespelhec><beanslcass=cotrant.plhecke>IInsideSkconstructor.InsidesetSelCheckr.Insideckelng.你已經(jīng)看到了如何使用value屬性來配置基本數(shù)據(jù)類型和在你的bean配置文件中使用的ref屬性來配置對象。這兩種情況下處理奇異值傳遞給一個bean。JavaColletionList、Set、MapProperties,應該怎么做呢。為了處理這種情況,Spring元 描t你會遇到兩種情況(a)傳遞集合中直接的值(b)傳遞一個bean的作為集合的元素EclipseIDE,Spring步驟描述1SpingExmple的項目,并且在創(chuàng)建項目的src文件夾中創(chuàng)建一個包t2使用AddExternalJARs選項,添加所需的Spring庫,解釋見SpringoWorldExample章節(jié)。optionasexinedinthechapter.3在com.tutorialspoint包中創(chuàng)建Java類TextEditor、SelChecker和MainApp4在src文件夾中創(chuàng)建Beans配置文件Ben.xml5JavaCollection.javampotjava.util.*;publicclass{ListaddressList;SetaddressSet;MapaddressMap;ei{this.addressList=}////nandreturnsalltheelementsofthelist.publicListgetAddressList(){sreturnaddressList;}publicvoidsetAddressSet(Set{this.addressSet=}ntspublicSetgetAddressSet(){Se.outntn(StElements:"+addressSet);returnaddressSet;}publicvoidsetAddressMap(Map{this.addressMap=}//tandreturnsalltheelementsoftheMap.publicMapgetAddressMap(){System.otprinln("MapElements:"+addressMap);returnaddressMap;}publicvoidsetAddressrp(roperties{this.addressProp=}publicrrgetAddressProp(){Se.outntn(PoetyElements:"+addressProp);returnaddressProp;}}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidman(Sring[]{AplicationContextcontextnewt"noten(}}Beans.xml<?xmlversion="1.0"encoding="UT-<beans mns" ishaLocat"<!--DefinitionforjavCollection--<beanoassotoalpntaolectn><!--resultsnaAdessLaautlLs)call--<propertye <!--resultsinaseAdresSet(java.util.Set)call--<propertyd <!--resultsinadrucall--<propertyd <entrykey="2"auePaktn><entrykey="3"e<entrykey="4"ae<!--<!--resultsinaseAdressrop(jaa.util.Properties)call--<propertyd<prop <prop<propey"eeU<p<propListElements:[ ,ListElements:[ ,Pakistan,USA,USA]SetElements:[ ,Pakistan,USA]MapElements ,2=Pakistan,3=USA,PropertyElements:{two=Pakistan, ,three=USA,ou=S}注入下面的Bean定義將幫助你理解如何注入bean的作為集合的元素。甚至你可以將和值混合在一起,如<?xm<?xmlversion="1.0"encoding="UT-<beansmns"ishaLocat"""<!--BeanDefinitiontohandlereferencesandvalues--<beanid="..."<!--Passingbeanreferenceforjava.util.List--<propertyeeanaddes1>anaddess><!--Passingbeanreferenceforjva.util.Set--<propertydeanaddes1>anaddess><!--Passingbeanreferenceforu--<propertyd<entrykey="one" <entrykey="two"value-e <bean<beand="..."<property "aue>前面的例子相當于Java代碼:exampleBean.set 如果你需要傳遞一個NULL值,那么你可以傳遞它,如下所示:<bean<beand="..."<propertye "><nul/pet> (null)Beans你已經(jīng)學會如何使用元素來bean和通過使用XML配置文件中的和元素來注入于Spring的應用程序的XML配置的數(shù)量。Spring模 描byName(beans-auto-ng/spng-atwnbae由屬性名自動裝配。Spring容器看到在XML配置文件中bean的自動裝配的屬性設置為byName。然后嘗試匹配,并且將它的屬性與在配置文件中被定義為相同名稱beansrngrng-auwn由屬性數(shù)據(jù)類型自動裝配。Spring容器看到在XMLbean的屬性設置為byTypebean名bean,則一個致命的異常將會被拋出。constructor(beans-autngntuctom數(shù)參數(shù)類型的bean,則一個致命錯誤將會發(fā)生。嘗試通過byType來自動裝配。byTypeconstructor當自動裝配始終在同一個項目中使用時,它的效果最好。如果通常不使用自動裝配,它可能會使開發(fā)人員的使用它來連接只有一個或兩個bean定義。不過,自動裝配可以顯著減少需要指定的屬性或構(gòu)造器參數(shù),但你應限 描Spring這種模式由屬性名稱指定自動裝配。Sring容器看作beans,在XML配置文件中beans的auto-wire屬性設置為byName。然后,它嘗試將它的屬性與配置文件中定義為相同名稱的beans進行匹配和連接。如果找到匹例如,在配置文件中,如果一個bean定義設置為自動裝配byName,并且它包含spellChecker屬性(即,它setSpellChecer(...)方法)SpringspellCheckerbean,并且用它來設置這個屬性。你仍然可以使用<property>連接其余的屬性。下面的例子將說明這個概念。EclipseIDE,Spring步1Sp1SpingExmplesrccm.ttrial2使用AddExternalJARs選項,添加所需的Spring庫,在SpringoWorldExample章節(jié)中已說3在com.tutorialspoint包中創(chuàng)建JavaTextEdtor,SpellChecker和MainApp4在src文件夾中創(chuàng)建Beans的配置文件Bas.xml5最后一步是創(chuàng)建所有Java文件和BeanTextEditor.javapublicclassTextEditor{vpervSname;publicvoidtlSpellCheckerspellChecker){this.spellChecker=k}publicpk{returnr}publicvoide{=}publicr{return}publicvoid{heckcSellng);}}}下面是另一個依賴類文件SpellChecker.javapackagepackagecom.uorialspint;publicclassSpelChecker{publicp{System.out.println("Insideekconstructor."}publicvoid.);}MainApp.javapackagepackagecotrant;importg.pngaewon.plicatoContext;importr.prnpubicclassnp{publicstaticvoidman(Sring[]{AplicationContextcontextnewClassPahmlAppictionContext("Beans.xml");spllhe(;}}Beans.xml<?xmlversion="1.0"encoding="UT-<beans"mns""ishaLocat"<beantasso.ttapntextEdt><property"ere="spellChecker"<propertymmGeTextEditor"<!--DefinitionforspellCheckrbean--<beansls但是,如果你要使用自動裝配“byName”,那么你的XML<?xmlversion="1.0"encoding="UT-<beans"ns""i:ceaLocan"sauowe"yae><propertymmGeTextEditor"<!--DefinitionforspellCheckrbean--<bea

溫馨提示

  • 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

提交評論