spring框架案例學習文檔筆記_第1頁
spring框架案例學習文檔筆記_第2頁
spring框架案例學習文檔筆記_第3頁
spring框架案例學習文檔筆記_第4頁
spring框架案例學習文檔筆記_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

spring框架案例學習文檔筆記spring框架案例學習文檔筆記spring框架案例學習文檔筆記spring框架案例學習文檔筆記編制僅供參考審核批準生效日期地址:電話:傳真:郵編:Spring–SSH整合學習筆記wjt276[2010-05-14]目錄第一課:面向抽象編程 4第二課:Jdom的基本使用 4第三課:模擬Spring功能 5第四課:搭建sping的運行環(huán)境 8一、 建立一個新的項目 8二、 建立spring的配置文件 8三、 引入spring的jar包 8四、 測試代碼: 8五、 注意接口的使用: 8第五課:IOC(DI)配置及應用 9一、 什么是IOC、DI 9二、 編輯xml文件時,沒有提示 9三、 注入類型(Injectingdependencies) 9(一) setter注入類型SetterInjection 9(二) 構造方法ConstructorInjection 10四、 id、name 11五、 簡單屬性的注入 11六、 Bean的作用范圍scope 12七、 集合注入 12八、 自動裝配autowire 13(一) byName 13(二) byType 14(三) 注意 14九、 生命周期 15(一) lazy-init/default-lazy-init 15(二) init-methoddestroy-method不要和prototype一起用(了解) 15第六課:annotation方式Spring 16一、 開始使用annotation配置Spring 16二、 @Autowired、@Qualifier 16(一) @Autowired 16(二) @Qualifier 17三、 @Resource(重要、推薦) 17(一) JSR-250 17(二) @Resource 17四、 @Componet 18五、 @Scope、@PostConstruct、@PreDestroy 19六、 注解對應的jar包 19第七課:AOP(面向切面編程) 19一、 AOP概念 19二、 利用動態(tài)代理實現(xiàn)面向切面編程 20第八課:SpringAOP配置選項 21一、 AOP配置annotation方式 21(一) 搭建annotation開發(fā)環(huán)境 21(二) aspectJ類庫 22(三) AOP的annotation實例 22(四) AspectJ的專業(yè)術語 23(五) 織入點語法 23(六) Advice 24(七) Pointcut 26(八) annotatin方式的AOP實例 26二、 AOP配置xml方式 27三、 AOP實現(xiàn)動態(tài)代理注意 28第九課:DataSource 28一、 Sping配置數據源: 28二、 注入使用 29三、 29第十課Spring整合Hiberante3 30一、 Spring配置hibernate3的SessionFactory 30(一) xml形式的SessionFactory 30(二) annotation注解方式的SessionFactory 30二、 引入hibernate所需要使用的jar 31(一) 基本jar 31(二) 加入annotation功能的jar包 31(三) 搭建日志環(huán)境并配置顯示DDL語句jar包 31三、 Spring整合hibernate3事務 31(一) Annotation注解方式配置事務管理 31(二) Spring事務選項 35(三) XML文件形式配置Spring事務管理 37四、 HibernateTemplate 38(一) HibernateTemplate 38(二) HibernateDaoSupport 39第十一課:Spring整合-SSH 40一、 第一步:加入jar包(需要的jar包列表) 40二、 第二步:首先整合Spring+Hibernate 41三、 第三步:再來整合Struts2 41四、 struts的讀常量: 43第十二課:DTO、VO 43一、 DTO 43二、 VO 43第十二課:SSH整合存在的問題 43一、 Jsp中訪問Session時,Session已經關閉 43二、 如果不配置事務,openSessionView出現(xiàn)異常 44三、 中文亂碼問題: 44第十三課:SSH整合的jar包 45一、 Struts2 45二、 45三、 Spring 46

第一課:面向抽象編程原來什么類都是寫死的,現(xiàn)在是先建立一個大的標準,然后再各個實體類來實現(xiàn)他們的功能,然后在調用的時候,使用這個標準調用,這樣,你們那個來都可以被調用。實例:User實體類publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){ returnusername; } publicvoidsetUsername(Stringusername){=username;} publicStringgetPassword(){returnpassword; } publicvoidsetPassword(Stringpassword){ =password; }}UserDao接口publicinterfaceUserDao{ publicvoidsave(Useru);}UserDao的實現(xiàn)UserDaoImplpublicclassUserDaoImplimplementsUserDao{ @Override publicvoidsave(Useru){ "usersave..."); }}User管理類publicclassUserService{ ewInstance(); (id,o); } } publicObjectgetBean(Stringname){ return(name); }}測試:BeanFactoryfactory=newClassPathXmlApplicationContext(); UserServiceservice=newUserService(); ewInstance(); (id,o); oUpperCase()+(1); "methodName="+methodName); etMethod(methodName,().getInterfaces()[0]); DI與IOC相對來說是一樣的概念。編輯xml文件時,沒有提示window–preferences–myeclipse–FilesandEditing-xml–xmlcatalogadd按鈕Location: D:\share\0900_Spring\soft\ Type: SchemaLocationKey: 注入類型(Injectingdependencies)setter(重要)構造方法(使用的非常少)接口注入(可以忘記)setter注入類型SetterInjection 就是在bean中使用setXXX方法進行注入來 在bean類中,成員屬性需要setXXX方法如下:publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){ returnuserDao; } publicvoidsetUserDao(UserDaouserDao){ =userDao; } publicvoidadd(Useru){ (u);}}spring配置文件如下:<beanid="u"class=""></bean><beanid="userService"class=""> <propertyname="userDao"ref="u"/><!--這里的ref表示參考id=u的那個bean--> <!--或是下面的方式 <propertyname="userDao"> <refbean="u"></ref> </property>--></bean>構造方法ConstructorInjection首先在bean類中需要有成員屬性作為參數的構造方法 代碼如下:publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserService(UserDaouserDao){ super(); =userDao; } publicUserDaogetUserDao(){returnuserDao;} publicvoidsetUserDao(UserDaouserDao){ =userDao;} publicvoidadd(Useru){ (u);}}注意:背景較深的代碼為構造方法,帶有參數的構造方法spring配置文件如下:<beanid="u"class=""></bean><beanid="userService"class=""> <constructor-arg> <beanclass=""></bean> <!--<refbean="u"/>--> <!-- 需要注意的: 使用<bean>表示,重新new一個bean然后注入進去, 使用<ref>表示,使用已經new好的bean,這是只是引用它。 --> </constructor-arg></bean>使用<constructor-arg>和其子標簽<bean>或<ref>進行構造方法注入當構造方法注入時,構造方法中有多個參數時,可以使用以下兩種方式注入:bean代碼:publicclassExampleBean{privateintyears;privateStringultimateAnswer;publicExampleBean(intyears,StringultimateAnswer){=years;=ultimateAnswer;}}1、參數類型方式進行區(qū)分參數:xml配置文件:<beanid="exampleBean"class=""> <constructor-argtype="int"value="7500000"/><constructor-argtype=""value="42"/></bean>注意:這樣就是參數類型為int的注入7500000,而參數類型為的參數注入”42”,但這個方法不適合多個參數是相同的類型。2、利用索引進行區(qū)分參數xml配置文件<beanid="exampleBean"class=""><constructor-argindex="0"value="7500000"/><constructor-argindex="1"value="42"/></bean>注意:index=0的注入到第一個參數,index=1的注入到第二個參數。構造方法的注入不方便,所以我們需要使用setter注入方式。id、name注xml配置文件中<bean>標簽中的屬性名稱如下:<beanid="u"class=""></bean>或<beanname="u"class=""></bean>以上標簽中的屬性id與name作用是一樣,唯一的區(qū)別:id中不可以含有特殊字符,而name中可以有特殊字符簡單屬性的注入當bean中存在簡單屬性時的注入方式:bean代碼如下:publicclassUserDaoImplimplementsUserDao{ privateintdaoId; privateStringdaoStatus; publicintgetDaoId(){returndaoId;} publicvoidsetDaoId(intdaoId){=daoId; } publicStringgetDaoStatus(){ returndaoStatus; } publicvoidsetDaoStatus(StringdaoStatus){=daoStatus;} @Override publicvoidsave(Useru){"usersave...");}}xml配置文件如下:<beanid="u"class=""> <propertyname="daoId"value="8"></property> <propertyname="daoStatus"> <value>good</value> </property></bean>直接使用value屬性或是<value>子標簽來注入Bean的作用范圍scope在Spring配置文件中的<bean>標簽可以指定bean的作用范圍利用<bean>標簽中的scope屬性來指定scope值:singleton單例:每次取出的bean都是同一個bean。默認就是這個prototype原型:每次取的bean時,都會重新創(chuàng)建一個新的beanrequestsessionglobalsession實例:<beanid="u"class=""></bean><beanname="userService"class=""scope="prototype"> <propertyname="userDao"ref="u"/> </bean>注意:只有spring與web框架結合時才會使用request/session/globalsession,但也非常少用,因為其它框架已經有功能非常強大的scope了(例如:struts的scope)集合注入很少用,不重要,參考程序<beanid="u"class=""> <propertyname="properties"> <props> <propkey="administrator"</prop> <propkey="support"</prop> <propkey="development"</prop> </props> </property> <propertyname="list"> <list> <value>alistelementfollowedbyareference</value> <refbean="myDataSource"/> </list> </property> <propertyname="map"> <map> <entry> <key> <value>anentry</value> </key> <value>justsomestring</value> </entry> <entry> <key> <value>aref</value> </key> <refbean="myDataSource"/> </entry> </map> </property> <propertyname="set"> <set> <value>justsomestring</value> <refbean="myDataSource"/> </set> </property> </bean>自動裝配autowire含義:在bean注入時不需要我們來指定注入哪個具體的bean,而spring容器會根據我的使用autowire屬性來確定自動裝配功能。autowire值:autodetect;byName:根據bean中成員屬性的名稱來自動裝配byType:根據bean中成員屬性的類型來自動裝配。constaractordefault:會根據<beans>標簽中的default-autowire屬性來進行自動裝配的方式no(默認就是這個,需要手動指定注入那個bean)byName根據bean中成員屬性的名稱來自動裝配。bean代碼:UserDaoImpl類publicclassUserDaoImplimplementsUserDao{ privateintdaoId; publicintgetDaoId(){returndaoId;} publicvoidsetDaoId(intdaoId){=daoId; } @Override publicStringtoString(){ return"daoId="+; }}UserService類publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){ returnuserDao; } publicvoidsetUserDao(UserDaouserDao){ =userDao; } publicvoidadd(Useru){ (u); }}spring的配置文件<beanid="userDao"class=""> <propertyname="daoId"value="1"></property></bean><beanid="userDao2"class=""> <propertyname="daoId"value="2"></property></bean><beanname="userService"class=""scope="prototype"autowire="byName"></bean>測試代碼: publicvoidtestAdd_4()throwsException{ ApplicationContextfactory=newClassPathXmlApplicationContext(""); UserServiceservice=(UserService)("userService"); }結果:daoId=1說明:因為在配置文件中配置了兩個UserDaoImpl(名稱分別:userDao、userDao2)和一個UserService類。而在userService的bean中并沒有進行注入配置。而是使用了autowire屬性指定了byName值,這樣結果是正確的,是因為spring看到autowire=byName后,會在配置文件中查找bean的id與userService成員屬性名稱一至,然后將其注入,這樣就完成了根據名稱自動裝配功能。byType根據類型自動裝配:就是spring在初始化時,會在配置文件中查找<bean>的類型與userService成員屬性的類型相比較,類型一致的將其注入,這樣就完成了根據類型自動裝配。注意自動裝配使用并不多;只有在使用anntation注解時會使用的。byType如果出現(xiàn)相同類型在兩個以上,就會出現(xiàn)異常。生命周期lazy-init/default-lazy-init(不重要)bean的何時初始化lazy-init值:default:表示使用<beans>標簽中的default-lazy-init值 true:表示context在初始化時,不會初始化這個bean,只有在使用時才會初始化 false:表示context在初始化時,就會初始化這個bean例如:<xmlversion=""encoding="UTF-8"><beansxmlns=""xmlns:xsi=""xsi:schemaLocation=""default-lazy-init="false"><beanid="userDao"class=""lazy-init="true"> <propertyname="daoId"value="1"></property></bean><beanid="userDao2"class=""lazy-init="default"> <propertyname="daoId"value="2"></property></bean><beanname="userService"class=""lazy-init="false"></bean></beans>init-methoddestroy-method不要和prototype一起用(了解)init-method:用于<bean>標簽中的屬性,表示在初始化這個bean之前所需要的執(zhí)行方法destroy-method:用于<bean>標簽中的屬性,表示在這個bean銷毀時所需要的執(zhí)行方法。例如關閉連接池。注意:此屬性不要與scpoe=”prototype”一起使用,否則會出現(xiàn)其它的問題。例如:<beanid="u"class=""> <propertyname="daoId"value="1"></property></bean><beanname="userService"class=""init-method="init"destroy-method="destroy"> <propertyname="userDao"ref="u"></property></bean>userService類的代碼publicclassUserService{ publicvoidinit(){ "現(xiàn)在開始初始化UserService"); } privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){returnuserDao; } publicvoidsetUserDao(UserDaouserDao){=userDao;} publicvoidadd(Useru){ (u);} publicvoiddestroy(){"destory"); }}測試代碼: publicvoidtestAdd_4()throwsException{ ClassPathXmlApplicationContextfactory=newClassPathXmlApplicationContext(""); UserServiceservice=(UserService)("userService"); .");} @Override publicvoiddelete(Useru){"userdelete...");}}UserService(業(yè)務層)publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); publicUserDaogetUserDao(){returnuserDao;} publicvoidsetUserDao(UserDaouserDao){=userDao;} publicvoidadd(Useru){ (u);} publicvoiddelete(Useru){ (u);}}User(實體對象)publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){returnusername; } publicvoidsetUsername(Stringusername){=username;} publicStringgetPassword(){returnpassword; } publicvoidsetPassword(Stringpassword){=password;} }Spring的配置文件<beans> <beanid="u"class=""/> <beanid="userService"class=""> <!--<propertyname="userDao"bean="u"/>--> </bean></beans>需要處理的日志類(實現(xiàn)了InvocationHandler接口)只有實現(xiàn)了InvocationHandler接口的類才可以進行動態(tài)代理publicclassLogIntroductionimplementsInvocationHandler{privateObjecttergert; publicLogIntroduction(UserDaouserDao){=userDao;}etClassLoader(),newClass[]{},li); Useru=newUser(); (userDaoProxy); (u); (u);}結果:beforMethodusersave...beforMethoduserdelete...這樣就在執(zhí)行每個方法之前加入日志處理程序了。就是利用JAVA的動態(tài)代理實現(xiàn)的。第八課:SpringAOP配置選項 Spring實現(xiàn)動態(tài)代理配置是有兩種配置文件:xml文件方式;annotation方式(使用AspectJ類庫實現(xiàn)的。)AOP配置annotation方式搭建annotation開發(fā)環(huán)境首先:需要在配置文件中加入@AspectJ標簽<aop:aspectj-autoproxy/>自動幫我產生代理注意:Spring默認并沒有加入aop的xsd文件,因為我們需要手動加入(紅色部分)<beansxmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <aop:aspectj-autoproxy/></beans> 另外需要引用aspectJ的jar包: aspectJ類庫AspectJ是一個專門用來實現(xiàn)動態(tài)代理(AOP編程)的類庫AspectJ是面向切面編程的框架Spring使用就是這個類庫實現(xiàn)動態(tài)代理的AOP的annotation實例要求:在執(zhí)行save()方法之前加入日志邏輯spring的配置文件同上面的model類、dao層類、service層類都與上面天下一致切面類(LogInterceptor)importclassLogInterceptor{ @Before("execution(publicvoid") publicvoidbefore(){ "methodstart..."); } } 結果:這樣在運行publicvoid方法之前就會先執(zhí)行這個邏輯了。 注意: 1、@Aspect:意思是這個類為切面類 2、@Componet:因為作為切面類需要Spring管理起來,所以在初始化時就需要將這個類初始化加入Spring的管理; 3、@Befoe:切入點的邏輯(Advice) 4、execution…:切入點語法三個連接點(切入點)AspectJ的專業(yè)術語三個連接點(切入點)JoinPoint切入面連接點(切入點)切入面程序執(zhí)行過程程序執(zhí)行過程PointCut切入點人集合當需要定義一個切入點時,則需要使用這個@Pointcut("execution(*")publicvoidbusinessService(){}Aspect切面Advice切入點的邏輯例如上例中的@BeforeTarget被代理對象Weave織入織入點語法無返回值、方法參數為Userexecution(publicvoid任何包、任何類、任何返回值、任何方法的任何參數execution(public**(..))任何包、任何類、任何返回值、任何set開頭方法的任何參數execution(*set*(..))任何返回值、類中的任何方法、任何參數execution(*任何返回值、包中任何類中的任何方法、任何參數execution(*任何返回值、包中任何層次子包(..)、任何類、任何方法、任何參數execution(*和!void(非void)execution(publicvoid!void注意:上以是AspectJ的織入點語法,SpringAOP也實現(xiàn)了自己的織入點語法,同樣可以使用within執(zhí)行方法之前@AspectpublicclassBeforeExample{@Before("")publicvoiddoAccessCheck(){.}}@AspectpublicclassBeforeExample{@Before("execution(*")publicvoiddoAccessCheck(){.}}@

AfterReturning方法正常執(zhí)行完之后@AspectpublicclassAfterReturningExample{@AfterReturning("")publicvoiddoAccessCheck(){.}}@AspectpublicclassAfterReturningExample{@AfterReturning(pointcut="",returning="retVal")publicvoiddoAccessCheck(ObjectretVal){.}}@

AfterThrowing方法拋出異常之后@AspectpublicclassAfterThrowingExample{@AfterThrowing("")publicvoiddoRecoveryActions(){.}}@AspectpublicclassAfterThrowingExample{@AfterThrowing(pointcut="",throwing="ex")publicvoiddoRecoveryActions(DataAccessExceptionex){.}}

@After(finally)方法拋出異常被catch之后,需要進行的部分(相當于finally功能)@AspectpublicclassAfterFinallyExample{@After("")publicvoiddoReleaseLock(){.}}@

Around在方法之前和之后都要加上但是需要一個參數ProceedingJoinPoint,并者需要ObjectretVal=();和返回returnretVal;@AspectpublicclassAroundExample{@Around("")publicObjectdoBasicProfiling(ProceedingJoinPointpjp)throwsThrowable{."); } @AfterReturning("myMethod()") publicvoidafterReturning(){ "methodafterreturning..."); }}注意:那個空方法,只是為了給Pointcut起個名字,以方便別處使用annotatin方式的AOP實例importclassLogInterceptor{ @Pointcut("execution(public*") publicvoidmyMethod(){}; @Before(value="myMethod()") publicvoidbefore(){ "methodstart..."); } @AfterReturning("myMethod()") publicvoidafterReturning(){ "methodafterreturning..."); } @Around(value="myMethod()") publicvoidaround(ProceedingJoinPointpjp)throwsThrowable{ ."); ."); }}AOP配置xml方式xml方式是我們以后使用的比較多的,因為當切面類我們沒有源代碼時、當我們使用第三方的切面類時,我就不能使用annotation的方式,而且如果使用annotation方式一但程序編譯后就不可以修改了。如果使用xml方式就不一樣了,我們只需要修改xml文件就可以了。xml方式與annotation的作用是一樣?,F(xiàn)在就是實例:<xmlversion=""encoding="UTF-8"><beansxmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <beanid="logInterceptor"class=""></bean> <aop:config> <!--<aop:pointcut>在此處定義的pointcut是全局的pointcut可以供所有的aspect使用 id:表示這個pointcut的名稱,以方便使用--> <aop:pointcutid="myMethod" expression="execution(public*"/> <!--<aop:aspect>表示定義一個切面類(這需要Spring初始化加入其管理) id:切面類的名稱, ref:引用哪個bean(需要使用<bean>標簽初始化)--> <aop:aspectid="logAspect"ref="logInterceptor"> <!--在此處定義的pointcut是全局的pointcut只供當前的aspect使用 id:表示這個pointcut的名稱,以方便使用 --> <aop:pointcutid="myMethod2" expression="execution(public*"/> <!-- 定義advice時的參數 method:切面邏輯的方法名稱(切面類中的方法名) pointcut-ref:表示引用哪個pointcut(要求已經在上面定義好了) pointcut:定義一個pointcut --> <aop:beforemethod="before"pointcut-ref="myMethod"/> <aop:after-returningmethod="afterReturning"pointcut="execution(public*"/> </aop:aspect> </aop:config></beans>AOP實現(xiàn)動態(tài)代理注意因為Spring要實現(xiàn)AOP(面向切面編程),需要加入切面邏輯的類就會生成動態(tài)代理。在動態(tài)代理類中加入切面類從而實現(xiàn)面向切面編程,但生成動態(tài)代理存在以下注意事項:被動態(tài)代理的類如果實現(xiàn)了某一個接口,那么Spring就會利用JDK類庫生成動態(tài)代理。如果被動態(tài)代理的類沒有實現(xiàn)某一個接口,那么Spring就會利用CGLIB類庫直接修改二進制碼來生成動態(tài)代理(因為利用JDK生成動態(tài)代理的類必須實現(xiàn)一個接口),需要在項目中引用CGLIB類庫第九課:DataSource DataSource是一個接口 DataSource是一個標準,其它只需要實現(xiàn)它的接口,然后隨意怎樣實現(xiàn)。 Sping配置數據源: <beanid="dataSource"class=""destroy-method="close"> <propertyname="driverClassName"value=""/> <propertyname="url"value="jdbc:"/> <propertyname="username"value="root"/> <propertyname="password"value="root"/> </bean>或者Planceholder(占位符的方式)配置數據源 <!-- 下面是使用占位符(Placeholder)的方式配置數據源 首先需要配置一個占位符類bean 然后給其注入properties配置文件 classpath:表示classpath下的文件 再是在配置數據源時可以使用占位符(${})獲取一些值 例如:${}:表示獲取配置文件中項的值等。 --> <bean class=""> <propertyname="locations"> <value>classpath:</value> </property> </bean> <beanid="dataSource"destroy-method="close" class=""> <propertyname="driverClassName"value="${}"/> <propertyname="url"value="${}"/> <propertyname="username"value="${}"/> <propertyname="password"value="${}"/> </bean>文件=注入使用然后在其它的bean中自動注入(Spring需要使用的功能),就可以使用了。@Component("userDaoImpl")publicclassUserDaoImplimplementsUserDao{ privateDataSourcedataSource; publicDataSourcegetDataSource(){returndataSource;} @Resource(name="dataSource") publicvoidsetDataSource(DataSourcedataSource){ =dataSource;} @Override publicvoidsave(Useru){ try{ Connectionconn=(); ().executeUpdate("insertintouservalues(null,'wjt276')"); (); }catch(SQLExceptione){ ();}"usersave..."); }}#<!--初始化連接-->initialSize=10#<!--最大空閑連接-->maxIdle=20#<!--最小空閑連接-->minIdle=5#最大連接數量maxActive=50#是否在自動回收超時連接的時候打印連接的超時錯誤logAbandoned=true#是否自動回收超時連接removeAbandoned=true#超時時間(以秒數為單位)removeAbandonedTimeout=180#<!--超時等待時間以毫秒為單位6000毫秒/1000等于60秒-->maxWait=1000第十課Spring整合Hiberante3Spring整合hibernate3重點就是需要初始化SessionFactory這個bean,需要在Spring的配置文件中進行配置,實現(xiàn)實例如下:Spring配置hibernate3的SessionFactory實現(xiàn)上xml方式的配置文件與annotation注解方式的區(qū)別,只是在配置時所使用的bean不一樣,而且配置實體類所使用的屬性也不一樣(xml:mappingResources;annotation:annotatedClasses),如下:xml形式的SessionFactory <!--hibernater的xml方式LocalSessionFactoryBean是處理xml方式的bean 再利用mappingResources來配置實體類(model)映射文件 再利用hibernateProperties來配置相關屬性--><beanid="mySessionFactory"class=""><propertyname="dataSource"ref="dataSoure"/><propertyname="mappingResources"><list><value></list></property><propertyname="hibernateProperties"> <props> <propkey=""> <propkey="show_sql">true</prop> <propkey="format_sql">true</prop> </props></property>annotation注解方式的SessionFactory<!--hibernater的xml方式AnnotationSessionFactoryBean是處理annotation方式的bean 再利用annotatedClasses來配置實體類(model)是否進行了注解 再利用hibernateProperties來配置相關屬性--><beanid="mySessionFactory"class=""><propertyname="dataSource"ref="dataSource"/><propertyname="annotatedClasses"><list><value></list></property><propertyname="hibernateProperties"> <props> <propkey=""> <propkey="">true</prop> <propkey="">true</prop> </props></property>注意:配置SessionFactory要求前面已經配置了一個數據源的bean了,這里的dataSource引用了那個bean,同時,在dao層中的dataSource成員屬性要求使用自動裝配功能,進行自動注入。將指定包的實體類全部掃描到SessionFactory注意:如果您想在某一包或子包下掃描需要實現(xiàn)類,那么在annotation下配置SessionFactory可以使用annotatedPackages選項指定實體類所在包的包路徑就可以了。這樣就不需要把所有的實體類都配置這樣了。<propertyname="packagesToScan"> <list> <value> </list></property>這樣就不需要使用annotatedClassess來一個一個配置實現(xiàn)類了。只要將實現(xiàn)類所有的包配置進來就可以了??梢耘渲枚鄠€包路徑。引入hibernate所需要使用的jar基本jarHibernatecore/lib/requiredSlf-nopjarmysql的JDBC驅動名加入annotation功能的jar包HibernateannotationjarEjb3persistencejarHibernatecommonannotationsjar搭建日志環(huán)境并配置顯示DDL語句jar包我們使用slf接口,然后使用log4j的實現(xiàn)。首先引入log4j的jar包,然后再引入slf4j實現(xiàn)LOG4J和適配器jar包最后創(chuàng)建log4j的配置文件,并加以修改,只要保留 注意:在引入jar包時,一定要小心,可少引入,再根據錯誤提示引入其它包,但不可以多引入或引入不同版本或錯誤的jar,否則會出現(xiàn)想不到的異常。Spring整合hibernate3事務Spring整合hiberante最常用的就是整合事務管理(TransactionManager)當Spring整合hibernate事務后,默認就是運行期異常RunTimeException,Spring自動回滾Annotation注解方式配置事務管理<xmlversion=""encoding="UTF-8"><beansxmlns="" xmlns:xsi="" xmlns:context="" xmlns:aop="" xmlns:tx="" xsi:schemaLocation=""> <context:annotation-config/> <context:component-scanbase-package=""/> <!--下面是使用占位符(Placeholder)的方式配置數據源 首先需要配置一個占位符類bean 然后給其注入properties配置文件 classpath:表示classpath下的文件 再是在配置數據源時可以使用占位符(${})獲取一些值 例如:${}:表示獲取配置文件中項的值等。 --> <bean class=""> <propertyname="locations"> <value>classpath:</value> </property> </bean> <beanid="dataSource"destroy-method="close" class=""> <propertyname="driverClassName"value="${}"/> <propertyname="url"value="${}"/> <propertyname="username"value="${}"/> <propertyname="password"value="${}"/> </bean><!--hibernater的xml方式AnnotationSessionFactoryBean是處理annotation方式的bean 再利用annotatedClasses來配置實體類(model)是否進行了注解 再利用hibernateProperties來配置相關屬性 --><beanid="sessionFactory"class=""> <propertyname="dataSource"ref="dataSource"/> <propertyname="annotatedClasses"> <list> <value> <value> </list> </property> <propertyname="hibernateProperties"> <props> <propkey=""> <propkey="">true</prop> <propkey="">true</prop> </props> </property></bean><beanid="txManager"class=""> <propertyname="sessionFactory"ref="sessionFactory"/></bean><tx:annotation-driventransaction-manager="txManager"/> </beans>說明:首先:如果想使用Spring管理事務,則首需要在配置文件中加入下列(上面紅色加粗部分): xmlns:tx="" xsi:schemaLocation=”">其次:配置一個事務管理器的bean,這里使用的是Hibernate的事務管理HibernateTransactionManager,也可以使用,并且需要注入一個SessionFactory的bean,利用這個bean可以獲取數據源配置等其它的數據庫信息。但要求已經在這之前配置了一個SessionFactory的bean了。<beanid="txManager"class=""> <propertyname="sessionFactory"ref="sessionFactory"/></bean>再次:需要在配置文件中告訴Spring,我們需要使用Spring來管理事務,并且要告訴它,使用哪個事務管理器(這里我們就使用上面的剛則配置的txManager),<tx:annotation-driventransaction-manager="txManager"/> 注意:這里我們是使用annotation注解方式配置事務管理,所以使用<tx:annotation-driven>標簽最后:就是對什么方法進行事務管理,只需要在這個方法上加上@Transactional。如下:@Transactional publicvoidadd(Useru){……}這樣,Spring就會對這個方法進行事務管理了。實例:場景:當保存一個用戶后,需要向數據庫添加一條日志記錄,說明已經添加一個用戶了。需要使用Spring管理其事務,如果兩者有一者發(fā)生異常,執(zhí)都需要進行回滾。Spring的配置文件同上;代碼Log實體類@Entity@Table(name="t_log")publicclassLog{ privateintid; privateStringmsg; ……}User實體類@EntitypublicclassUser{ privateintid; privateStringname; ……}UserDao接口的實現(xiàn)@Component("userDaoImpl")publicclassUserDaoImplimplementsUserDao{ privateSessionFactorysessionFactory; publicSessionFactorygetSessionFactory(){returnsessionFactory;} ."); }}LogDao接口的實現(xiàn)@Component("logDaoImpl")publicclassLogDaoImplimplementsLogDao{ privateSessionFactorysessionFactory; publicSessionFactorygetSessionFactory(){returnsessionFactory;} ."); }}業(yè)務層代碼@Component(value="userService")publicclassUserService{ privateUserDaouserDao=newUserDaoImpl(); privateLogDaologDao; publicLogDaogetLogDao(){ returnlogDao;}只讀型事務超時timeoutint型(以秒為單位)事務超時回滾異常類(rollbackFor)一組Class類的實例,必須是Throwable的子類一組異常類,遇到時必須進行回滾。默認情況下checkedexceptions不進行回滾,僅uncheckedexceptions(即RuntimeException的子類)才進行事務回滾?;貪L異常類名(rollbackForClassname)一組Class類的名字,必須是Throwable的子類一組異常類名,遇到時必須進行回滾不回滾異常類(noRollbackFor)一組Class類的實例,必須是Throwable的子類一組異常類,遇到時必須不回滾。不回滾異常類名(noRollbackForClassname)一組Class類的名字,必須是Throwable的子類一組異常類,遇到時必須不回滾Propagationkey屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。PROPAGATION_NOT_SUPPORTED--以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。PROPAGATION_NEVER--以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。IsolationLevel(事務隔離等級):1、Serializable:最嚴格的級別,事務串行執(zhí)行,資源消耗最大;2、REPEATABLEREAD:保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。3、READCOMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用于大多數系統(tǒng)。4、ReadUncommitted:保證了讀取過程中不會讀取到非法數據。隔

溫馨提示

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

評論

0/150

提交評論