Spring-從入門到精通_第1頁
Spring-從入門到精通_第2頁
Spring-從入門到精通_第3頁
Spring-從入門到精通_第4頁
Spring-從入門到精通_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Spring輕量級容器框架Spring簡介Spring是一個控制反轉〔Ioc〕和面向切面編程〔AOP〕的輕量級的容器,為軟件開發(fā)提供全方位支持的應用程序框架。控制反轉(InversionofControl,IoC)與依賴注入(DependencyInjection,DI)。由容器來管理對象之間的依賴關系〔而不是對象本身來管理〕,就叫“控制反轉”或“依賴注入”.控制反轉應用本身不負責依賴對象的創(chuàng)立和維護,而是由外部容器來負責。這樣控制權就由應用轉移到外部容器,控制權的轉移就是所謂的反轉。容器是符合某種標準能夠提供一系列效勞的管理器,開發(fā)人員可以利用容器所提供的效勞來方便地實現(xiàn)某些特殊的功能。所謂的“重量級”容器是指那些完全遵守J2EE的標準,提供標準中所有的效勞。EJB就是典型的例子?!拜p量級”容器的也是遵守J2EE的標準,但其中的效勞可以自由配置。Spring最常用的特性利用Spring來創(chuàng)立對象〔JavaBean工廠〕利用Spring構建業(yè)務邏輯層管理依賴關系適應需求變更利用Spring創(chuàng)立數(shù)據(jù)訪問對象〔DAO〕利用Spring進行事務處理Spring的安裝下載并解壓將相應的jar包參加類路徑spring.jar配置SpringApplicationContext.xmlIoC/DI控制反轉(InversionofControl,IoC)與依賴注入(DependencyInjection,DI)。由容器來管理對象之間的依賴關系〔而不是對象本身來管理〕,就叫“控制反轉”或“依賴注入”前面的例子,已清楚闡述IoC/DI出現(xiàn)的原因,以及IoC的根本原理:抽象不依賴于現(xiàn)實,而是現(xiàn)實依賴于抽象。Spring框架的根本思想就是IoC/DI,Spring就是一個IoC容器IoC與DI,說的是一回事,但DI這個名詞更能表達這種設計模式的思想Spring架構依賴注入的類型構造器注入通過類的構造方法注入依賴關系使用<constructor-arg>

元素設值方法注入通過類的setter方法注入依賴關系使用<property>元素依賴注入的配置注入根本數(shù)據(jù)類型,字符串等。在<property>或<constructor-arg>元素中使用<value>在<property>或<constructor-arg>元素中加上value屬性注入依賴對象在<property>或<constructor-arg>元素中使用<ref>在<property>或<constructor-arg>元素中加上ref屬性注入null值如果使用<value></value>這種形式,Spring是作為空字符串來對待的??梢允褂?lt;null>表示null值內部Bean,在<property>或<constructor-arg>元素中使用<bean>元素再定義一個Bean內部Bean的scope、id、name屬性會被忽略內部Bean總是prototype(原型)模式內部Bean不能在包含該內部Bean的Bean之外依賴注入的配置注入集合通過<list>、<set>、<map>、<props>配置與JavaCollection類型對應List、Set、Map、Properties<propertyname=“l(fā)ists”>

<list><value></value><ref/></list></property><propertyname=“maps”>

<map><entry><key> <value></value> </key><value></value></entry></map></property><propertyname=“sets”>

<set><value></value><ref/></set></property><propertyname=“emails”>

<props><propkey=“support”></prop></props></property>Bean的依賴模式1用ref屬性指定依賴。local模式

Bean與被參考引用的Bean在同一個XML文件中,而且被參考 應用的Bean是指定id屬性。

Spring的XML解析器會在解析時匹配,如果沒有匹配的元 素,XML解析器會產(chǎn)生一個錯誤。<propertyname="book"><reflocal="book1"/></property>

Bean的依賴模式2bean模式〔可找id,也可找name命名的別名〕<beanid="book1"name="book2"class="com.Book">Bean與被參考引用的Bean可以在不同的XML文件中。ApplicationContextcontext=newClassPathXmlApplicationContext(newString[]{"beans1.xml","beans2.xml"});bean-dao.xmlbean-po.xmlbean-service.xmlbean-….xmlBean的依賴模式3parent模式,表示被參考引用的Bean可以是當前

BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean。表示繼承的父類

如果有很多繼承同一個父類的BEAN

那么在配置文件中實例那些BEAN時候可以省略掉父類已經(jīng)注入的屬性

bean定義繼承父bean定義,它可以覆蓋父bean的一些值,或者它需要的值。

三種實例化Bean的方式使用類構造器實例化,也就是沒有參數(shù)的構造函數(shù)來建立Bean的實例

<beanid="sample"class="com.fendou.service.impl.SampleImpl"/>使用靜態(tài)工廠方法實例化publicPersonFactory{publicstaticPersongetPerson(){returnnewPerson(); }}<beanid="person2"class="com.spring.bean.PersonFactory"factory-method="getPerson"></bean>使用實例工廠方法實例化<beanid=“sampleFactory"class="com.fendou.service.impl.SampleFactory“><beanid="sample3"factory-bean=“sampleFactory”factory-method=“createSample”/>Bean的作用域Singleton。在Spring中取得的實例被默認為Singleton(單例)<beanid=“sample”class=“com.fendou.service.impl.SampleImpl“scope=“singleton”/><beanid=“sample”class=“com.fendou.service.impl.SampleImpl“singleton=“true”/>Prototype。在每次對該bean請求時創(chuàng)立出一個新的bean對象(原型)<beanid=“sample”class=“com.fendou.service.impl.SampleImpl“scope=“prototype”/>其他作用域:request、session、globalsession延遲初始化Bean默認的情況下在容器啟動時會初始化Bean。但可以通過指定<bean>元素中的lazy-init屬性來延遲初始化Bean,這樣將會在第一次獲取Bean的時候初始化Bean

<beanid="sample"class="com.fendou.service.impl.SampleImpl“l(fā)azy-init=“true”/>如果想對所有的Bean都延遲初始化,可以修改<beans>元素

<beansdefault-lazy-init=“true”>Bean的生命周期Bean的生命周期包括:Bean的定義、Bean的初始化、Bean的使用、Bean的銷毀。Bean的初始化可以通過指定init-method屬性來完成

<beanid="sample"class="com.fendou.service.impl.SampleImpl“ init-method=“init”/>

或者通過實現(xiàn)接口,實現(xiàn)afterPropertiesSet()方法來完成Bean的銷毀可以通過指定destory-method屬性來完成

<beanid="sample"class="com.fendou.service.impl.SampleImpl“destory-method=“clearup”/>

或者通過實現(xiàn)接口,實現(xiàn)destory()方法來完成Bean的自動裝配模式Spring提供了5種自動裝配的模式,從而減少一些屬性的設置。在<bean>元素中設置autowire屬性byName模式,通過Bean的屬性名字進行自動裝配byType模式,通過在配置文件查找一個屬性類型一樣的Bean來進行自動裝配constructor模式,是指根據(jù)構造函數(shù)的參數(shù)盡心自動裝配autodetect模式,通過對Bean檢查類的內部來選擇是constructor還是byType模式no模式,不使用自動裝配在企業(yè)應用開發(fā)過程中,是不主張使用自動裝配模式的Bean的依賴檢查Spring允許Bean在初始化之前強制執(zhí)行其他Bean的初始化。通過的<bean>元素中指定depends-on屬性設置通過在<bean>元素中指定dependency-check屬性來檢查Bean的每個屬性是否設定完成。simple模式,對根本類型、字符串、集合進行依賴檢查object模式,對依賴的對象進行依賴檢查all模式,對全部屬性進行依賴檢查none模式,不進行依賴檢查基于注解的依賴注入基于注解〔Annotation〕的配置有越來越流行的趨勢,Spring2.5順應這種趨勢,提供了完全基于注釋配置Bean、裝配Bean的功能,學員可以使用基于注解的SpringIoC替換原來基于XML的配置。注解配置相對于XML配置具有很多的優(yōu)勢:它可以充分利用Java的反射機制獲取類結構信息,這些信息可以有效減少配置的工作。注釋和Java代碼位于一個文件中,而XML配置采用獨立的配置文件,大多數(shù)配置信息在程序開發(fā)完成后都不會調整,如果配置信息和Java代碼放在一起,有助于增強程序的內聚性。而采用獨立的XML配置文件,程序員在編寫一個功能時,往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會降低開發(fā)效率。因此在很多情況下,注解配置比XML配置更受歡送,注解配置有進一步流行的趨勢。Spring2.5的一大增強就是引入了很多注釋類,現(xiàn)在我們已經(jīng)可以使用注解配置完成大局部XML配置的功能?;谧⒔獾囊蕾囎⑷雜pring注解的使用1、要使用注解來代替xml的配置,要引入如下jar包:%spring_home%\lib\j2ee\common-annotations.jar。而且在applicationContext.xml中要參加<context:annotation-config/>的命名空間。2、引入spring頭文件3、寫@開頭注解@Resource注入接口配置文件修改<beansxmlns=":///schema/beans"xmlns:xsi=":///2001/XMLSchema-instance"xmlns:context=":///schema/context"xsi:schemaLocation=

:///schema/context/spring-context-2.5.xsd"><context:annotation-config/></beans>基于注解的依賴注入@Resource注解以前我們使通過配置xml文件方式來表示Bean之間的依賴關系,而現(xiàn)在我們可以通過@Resource方式來表示Bean之間的依賴關系packagecom.fendou;importjavax.annotation.Resource;publicclassUser{//通過@Resource注解把配置文件中id為user1的bean注入給屬性user1

@Resource(name="user1")privateUser1user1;@Resource(name="user2")privateUser2user;//省略了getter和setter方法}基于注解的依賴注入@PostConstruct和@PreDestroy注解Spring容器中的Bean是有生命周期的,Spring允許在Bean在初始化完成后以及Bean銷毀前執(zhí)行特定的操作,您既可以通過實現(xiàn)InitializingBean/DisposableBean接口來定制初始化之后/銷毀之前的操作方法,也可以通過<bean>元素的init-method/destroy-method屬性指定初始化之后/銷毀之前調用的操作方法。關于Spring的生命周期已經(jīng)在前面的章節(jié)詳細講解過了,現(xiàn)在我們用@PostConstruct和@PreDestroy這兩個注釋從新測試spring的生命周期。標注了@PostConstruct的方法將在類實例化后調用,而標注了@PreDestroy的方法將在類銷毀之前調用。請看User.java類packagecom.fendou;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;publicclassUser{@PostConstructpublicvoidinit(){System.out.println("init");}@PreDestroypublicvoiddestory(){System.out.println("destory");}}下面是spring的配置<context:annotation-config/><beanid="user"class="com.fendou.User"></bean>基于注解的依賴注入@Component注解雖然我們可以通過@Resource在Bean類中使用自動注入功能,但是Bean還是在XML文件中通過<bean>進行定義,也就是說,在XML配置文件中定義Bean,通過@Resource為Bean的成員變量、方法入?yún)⒒驑嬙旌瘮?shù)入?yún)⑻峁┳詣幼⑷氲墓δ?。能否也通過注解定義Bean,從XML配置文件中完全移除Bean定義的配置呢?答案是肯定的,我們通過Spring2.5提供的@Component注釋就可以到達這個目標了。下面,我們完全使用注釋定義Bean并完成Bean之間裝配:使用@Component注解的User1,僅需要在類定義處,使用@Component注解就可以將一個類定義了Spring容器中的Bean。方法:1、參加spring配置文件中參加

<context:component-scanbase-package="com.spring.bean"></context:component-scan><beansxmlns=":///schema/beans"xmlns:xsi=":///2001/XMLSchema-instance"xmlns:context=":///schema/context"xsi:schemaLocation="><context:component-scanbase-package="com.spring.bean"></context:component-scan>

用@Component方法注入到spring中.@ComponentpublicclassUser1{ publicvoidprint(){System.out.println("我是User1");}}基于注解的依賴注入使用@Component注解的User2@ComponentpublicclassUser2{publicvoidprint(){System.out.println("我是User2");}}使用@Component注解的Userpackagecom.fendou;importjavax.annotation.Resource;importorg.springframework.stereotype.Component;@Component("user")publicclassUser{@Resource(name="user1")privateUser1user1;@Resource(name="user2")privateUser2user2;//省略了getter和setter方法 }基于注解的依賴注入@Scope注解默認情況下通過@Component定義的Bean都是singleton的,如果需要使用其它作用范圍的Bean,可以通過@Scope注釋來到達目標,如以下代碼所示:packagecom.fendou;importorg.springframework.context.annotation.Scope;importorg.springframework.stereotype.Component;@Component@Scope("prototype")publicclassUser1{publicvoidprint(){ System.out.println("我是User1");}}其他注解@Repository 持久層@Service 業(yè)務層@Controller 控制層〔Web層〕@Component對那些比較中立的類進行注解。

這3個注解和@Component是等效的和@Component相比沒有什么新意,但Spring將在以后的版本中為它們添加特殊的功能AOP面向切面(方面)編程〔AspectOrientedProgramming,AOP)在實際應用中,常常會寫一些與具體業(yè)務無關的代碼,例如日志、權限、異常處理、事務處理等。在編寫的過程中,將這樣的代碼編寫到一起,所以處處都有重復的代碼。使用AOP,就是將這種和業(yè)務邏輯關系不大的代碼別離出來,到達重用的目的。AOP是一種思想,和具體的實現(xiàn)技術無關。任何一種符合AOP思想的技術實現(xiàn),都可以看作AOP的實現(xiàn)。Spring的AOP是建立在Java的動態(tài)代理機制之上的。Java的反射機制什么是動態(tài)語言?根本的定義是程序運行時,允許改變程序結構或變量類型,這種語言稱為動態(tài)語言。在這樣的定義與分類下Java不是動態(tài)語言,它卻有著一個非常突出的動態(tài)相關機制:Reflection〔反射〕Java的反射機制:Java程序可以加載一個運行時才得知名稱的class,得悉其完整構造,并生成其對象實體、或對其fields設值、或調用其methods。這種機制也可以稱為introspection〔內省〕通過和包中的Method、Field、Constructor等實現(xiàn)。Java的動態(tài)代理普通代理模式:生成一個和類相同接口的代理類,用戶通過使用代理類來封裝某個實現(xiàn)類。

Java的動態(tài)代理:動態(tài)代理中的代理類是由java.lang.reflect.Proxy類在運行期時根據(jù)接口定義,采用Java反射機制動態(tài)生成的。結合接口,加強現(xiàn)有類的方法實現(xiàn)。使用CGLIB代理AOP的概念連接點(JoinPoint),指程序運行中的某個階段點,如某個方法的調用,異常的拋出等。切入點(Pointcut)是連接點的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么樣的條件下才能觸發(fā)。通知(Advice),指某個連接點所采用的處理邏輯,前例中輸出日志的代碼就是一個通知。Advisor,是切入點和通知之間的配置器。SpringAOP首先我們要參加如下jar文件%spring_home%\lib\aspectj\aspectjrt.jar%spring_home%\lib\aspectj\aspectjweaver.jarSpring配置文件的頭要有如下內容xmlns:aop=":///schema/aop"一個例子:我們用spring實現(xiàn)事務,事務不是硬編碼,而是 通過springaop完成SpringAOPBookFacade.java代碼如下:packagecom.fendou;publicclassBookFacadeImplimplementsBookFacade{ publicvoidaddBook(){ System.out.println("增加圖書實際的方法"); }}BookFacadeImpl.java代碼如下:packagecom.fendou;publicinterfaceBookFacade{ publicvoidaddBook();}SpringAOP現(xiàn)在我們定義一個普通的類,里面有個方法用來開啟事務,代碼如下:packagecom.fendou;publicclassTransaction{publicvoidbeginTransaction(){ System.out.println("開啟事務");}}Spring配置文件如下<beanid="bookFacade"class="com.fendou.BookFacadeImpl"></bean><beanid="transaction"class="com.fendou.Transaction"></bean>

<aop:config> <!--切入點--> <aop:pointcutid="trans" <!--切入點表達式--> expression="execution(*com.fendou.BookFacade.*(..))"/> <!--切面--> <aop:aspectid="myAspect"ref="transaction"> <!--通知--> <aop:beforepointcut-ref="trans"method="beginTransaction"/> </aop:aspect></aop:config>SpringAOP<beanid="bookFacade"class="com.fendou.BookFacadeImpl"></bean><beanid="transaction"class="com.fendou.Transaction"></bean>

<aop:config> <!--切入點--> <aop:pointcutid="trans" <!--切入點表達式--> expression="execution(*com.fendou.BookFacade.*(..))"/> <!--切面--> <aop:aspectid="myAspect"ref="transaction"> <!--通知--> <aop:beforepointcut-ref="trans"method="beginTransaction"/> </aop:aspect></aop:config>Spring配置文件如下SpringAOP對一些切入點的說明任意公共方法:execution(public**(..))任意一個名字以set開始的方法:execution(*set*(..))AccountService接口定義的任意方法:execution(*com.xyz.service.AccountService.*(..))在service包中定義的任意方法:execution(*com.xyz.service.*.*(..))在service包或其子包中定義的任意方法:execution(*com.xyz.service..*.*(..))

SpringAOP對于通知的一些說明@Before前置通知@AfterReturning后置通知@AfterThrowing異常通知:在方法拋出異常后執(zhí)行@After最終通知:不管一個方法是如何結束的,最終通知都運行@Around環(huán)繞通知(做權限使用)通知的第一個參數(shù)必須是ProceedingJoinPoint類型。在通知體內調用它的proceed()方法會導致后臺連接點方法的執(zhí)行

基于@AspectJ的AOPAspectJ是AOP的一種實現(xiàn),spring集成了它還是剛剛的例子BookFacade.java和BookFacadeImpl .java的代碼不變Transaction.java代碼有改動如下:

//通過注解定義切面@AspectpublicclassTransaction{//定義切入點及其表達式@Pointcut("execution(*com.fendou.BookFacade.*(..))")

publicvoidpointCutXxx(){};

//定義通知類型@Before("pointCutXxx()")publicvoidbeginTransaction(){ System.out.println("開啟事務");}}Spring與Hibernate的集成參加hibernate相關內容Hibernate的包實體類與*.hbm.xml文件的建立參加spring相關內容引入spring的包引入spring的配置文件application.xmlSpring與Hibernate的集成讓spring管理hibernate的sessionFactory<!–注入sessionFactory--><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"><value>classpath:hibernate.cfg.xml</value></property></bean>配置事務管理大多數(shù)的應用程序,事務管理被分配到業(yè)務邏輯方法上,即每個業(yè)務邏輯方法是一個事務在Spring中,所有的業(yè)務邏輯對象,均是普通的POJOSpring最強大的功能在于,它可以在普通的POJO上面實現(xiàn)聲明式的事務管理〔它使用AOP來完成這樣的任務〕步驟如下:定義一個事務管理器配置事務的傳播特性

Spring與Hibernate的集成定義一個事務管理器Spring與Hibernate的集成<!--配置事務管理器--><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean>配置事務的傳播特性Spring與Hibernate的集成<!--配置事務特性-->

<tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes> <!--對get/find/search開頭的方法要求只讀事務--> <tx:methodname="get*"propagation="SUPPORTS"read-only="true"/> <tx:methodname="find*"propagation="SUPPORTS"read-only="true"/> <tx:methodname="search*"propagation="SUPPORTS"read-only="true"/> <!--對其它方法要求事務--> <tx:methodname="*"propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置那些類的方法進行事務管理--><aop:config>

<aop:pointcutid="allManagerMethod"expression="execution(*com.fendou.manager.*.*(..))"/>

<aop:advisoradvice-ref="txAdvice"pointcut-ref="allManagerMethod"/></aop:config>Spring的事務級別Spring提供7種事務級別REQUIRED,如果當前沒有事務,就新建一個事務,如果已經(jīng)存在一個事務中,參加到這個事務中。這是最常見的選擇。SUPPORTS,支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。MANDATORY,使用當前的事務,如果當前沒有事務,就拋出異常。REQUIRES_NEW,新建事務,如果當前存在事務,把當前事務掛起。NOT_SUPPORTED,以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。PROPAGATION_NEVER,以非事務方式執(zhí)行,如果當前存在事務,那么拋出異常。PROPAGATION_NESTED,如果當前存在事務,那么在嵌套事務內執(zhí)行。如果當前沒有事務,那么執(zhí)行與PROPAGATION_REQUIRED類似的操作。創(chuàng)立可以支持Hibernate的DAO對象HibernateDaoSupport這是Spring提供的集成Hibernate的基類,所有用Hibernate實現(xiàn)的DAO,均需要繼承它從這個類中,可以獲取Hibernate的各種核心接口,如Session、SessionFactory等這個類的兩個重要方法getSession()和getSessionFactory()HibernateTemplateHibernateTemplate是Spring封裝的Hibernate操作接口,類似于Session接口可以調用HibernateDaoSupport提供的getHibernateTemplate()方法獲取HibernateTemplate對象Template模式:在父類定義一個操作中算法的骨架或操作順序,而將一些步驟的具體實現(xiàn)延遲到子類中。DAO的配置Dao的配置例如必須注入sessionFactory或dataSource的定義<beanid=“staffDao”class=“com.fendou.staff.dao.StaffDaoImpl"><propertyname="sessionFactory"><refbean=“sessionFactory”/></property></bean><beanid=“staffDaoJDBC”class=“com.fendou.staff.dao.StaffDaoJDBCImpl"><propertyname=“dataSource"><refbean=“dataSource”/></property></bean>配置ServiceService配置例如<beanid=“staffHelper”class=“com.fendou.staff.service.StaffHelperImpl"><propertyname=“staffDao”ref=“staffDao”/><propertyname=“staffDaoJDBC”ref=“staffDaoJDBC”/></bean>Spring與struts的集成參加struts相關內容struts的包struts-config.xml參加spring相關內容引入spring的包引入spring的配置文件application.xmlSpring與struts的集成讓系統(tǒng)啟動的時候加載ApplicationContext.xml(在web.xml中增加如下內容)<context-param><param-name>contextConfigLocation</param-name><param-value> /WEB-INF/classes/applicationContext-*.xml, classpath*:applicationContext-*.xml</param-value></context-param>

<listener><listener-class></listener-cla

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論