读书人

初学spring配备实例!2011年10月12日

发布时间: 2012-10-12 10:17:04 作者: rapoo

初学spring,配置实例!!2011年10月12日, AM 11:05:17

1、在建立单纯的spring项目时,web.xml文件如下:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

??????<servlet>

?????????????<servlet-name>spring</servlet-name>

?????????????<servlet-class>

????????????????????org.springframework.web.servlet.DispatcherServlet

?????????????</servlet-class>

?????????????<init-param>

????????????????????<param-name>contextConfigLocation</param-name>

??????<param-value>/WEB-INF/application.xml</param-value>

?????????????</init-param>

?????? 上面加框的一段是用来指定spring配置文件的(可以为任意名,如上),也可以不写,不写时spring的配置文件默认名为:?? “<servlet-name>”名-servlet.xml。(如此处的<servlet-name>的值为“spring”,则配置文件名为:springt-servlet.xml)

<load-on-startup>1</load-on-startup>

??????</servlet>

??????<servlet-mapping>

?????????????<servlet-name>spring</servlet-name>

?????????????<url-pattern>*.do</url-pattern>

??????</servlet-mapping>

</web-app>

?

spring配置文件(这里假定为spring-servlet.xml)如下:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTDBEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<!--? -Application context definition for "springapp"DispatcherServlet.? -->

<beans>

?????? <beanid="LoginAction" style="text-align: left;">在bean中配置有属性(包括bean格式的属性)时,bean对应的java文件内必须要定义一个与property的name名字一样的属性值,并且需要有这个属性值的getter和setter方法。

?????????????<property name="msg">????????????????????

<value>Hello World</value>

?????????????</property>

?????????????<property name="data">

????????????????????<ref bean="data1" />

当一个bean中有格式为bean的属性时,用“<ref bean="bean-name" />”来指定,在指定”bean-name”后还要在下面用”<bean></bean>”来指定这个bean格式的属性的值,此时”<bean></bean>”中的”id”必须与前面指定的”bean-name”一致。

?????????????</property>

??????</bean>

?????? <beanid="data1" style="text-align: left;">?????????????<property name="message">

????????????????????<value>liang</value>

?????????????</property>???????????????

??????</bean>

?????? <beanid="urlMapping"??????style="text-align: left;">?????????????<property name="mappings">

????????????????????<props>

??????????????????????????? <propkey="/login.do">LoginAction</prop>

????????????????????</props>

?????????????</property>

??????</bean>

</beans>

?

而在建立spring+struts项目时,web.xml文件按照struts项目的规格建立,在此不在多说,而在此时struts-config.xml如下:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

??????<form-beans>

???????????<form-bean name="loginForm"type="com.ln.struts.LoginForm" />

??????</form-beans>

?????? <action-mappings>

?????????????<action path="/login"

??????type="org.springframework.web.struts.DelegatingActionProxy"

????????????????????name="loginForm">

????????????????????<forward name="success" path="/main.jsp" />

????????????????????<forward name="failure" path="/loginfail.jsp"/>

?????????????</action>

??????</action-mappings>

?????? <plug-in

??????className="org.springframework.web.struts.ContextLoaderPlugIn">

?????????????<set-property property="contextConfigLocation"

????????????????????value="/WEB-INF/spring-servlet.xml" />

??????</plug-in>

</struts-config>

在这个配置文件中,由于使用spring来管理struts的action所以有两个地方要注意:

1.? Action的”type”指向spring里定义的用来处理action的类,而不是自己写的action.

2.增加了一个”<plug-in></plug-in>“来指定spring配置文件。

?

?

?

?

此时spring-servlet.xml配置文件如下:

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTDBEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

?????? <beanname="/login" style="text-align: left;">?????????????singleton="false">

此处的bean与struts-config.xml中的action相对应,name与struts-config.xml中action的path一致

?????????????<property name="msg">

????????????????????<value>Hello World</value>

?????????? ???</property>

??????</bean>

</beans>

?

2、Spring配置文件总结??

首先来看一个标准的Spring配置文件 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
????http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
?default-autowire="byName"default-lazy-init="true">

?<!-- 配置数据源 -->
?<bean id="dataSource"
??style="text-align: left;">?<!--配置SessionFactory-->
?<bean id="sessionFactory"
??/>
??</property>
??<property name="mappingResources">
???<list>
????<value>com/ssh/pojo/User.hbm.xml</value>
???</list>
??</property>
??<property name="hibernateProperties">
???<props>
????<propkey="hibernate.show_sql">true</prop>
???</props>
??</property>
?</bean>
?
?<!-- 事务管理 -->
?<bean id="transactionManager"
??/>
??</property>
?</bean>
?
?<!-- hibernateTemplate -->
?<bean id="hibernateTemplate"
??/>
??</property>
?</bean>

?<!-- 配置数据持久层 -->
?<bean id="userDao"
??style="text-align: left;">?<!-- 配置业务逻辑层 -->
?<bean id="userService"
??style="text-align: left;">?<!-- 配置控制层 -->
?<bean id="UserAction"
??style="text-align: left;">?

////////////////////////////////////////////////???? 下面是详解:?////////////////////////////////////////////////////////////////////////

1.基本配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????">


<context:component-scan base-package="com.persia">
<!-- 开启组件扫描 -->
</context:component-scan>

<context:annotation-config>
<!--开启注解处理器-->
</context:annotation-config>

<!-- 使用注解,省去了propertity的xml配置,减少xml文件大小-->
<bean id="personServiceAnno"style="text-align: left;"><!-- 自动注解 -->
<bean id="personServiceAutoInject"style="text-align: left;">
<bean id="personService"style="text-align: left;"><bean id="personService2"lazy-init="true"
????? init-method="init"? destroy-method="destory">
<!-- 静态工厂获取bean -->
</bean>

<bean id="fac"factory-bean="fac"factory-method="createInstance" scope="prototype">
<!-- 实例工厂获取bean,先实例化工厂再实例化bean-->
</bean>


<!-- ref方式注入属性 -->
<bean id="personDao"style="text-align: left;"><!-- 内部bean方式注入-->
<bean id="personService5" style="text-align: left;"><bean id="personService6"value="构造注入的name" ></constructor-arg>
?? <!-- 基本类型可以不写type -->
?? <constructor-arg index="1"type="com.persia.IDaoBean" ref="personDao">
?? </constructor-arg>
</bean>

</beans>2.开启AOP:
<?xml version="1.0" encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
????????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????????????">

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="myInterceptor"encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
????????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????????????">

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

<bean id="personService" style="text-align: left;"><aop:config>
?<aop:aspect id="myaop" ref="aspectBean">
?<aop:pointcut id="mycut" expression="execution(*com.persia.service.impl.PersonServiceImpl.*(..))"/>
?<aop:pointcut id="argcut" expression="execution(*com.persia.service.impl.PersonServiceImpl.*(..)) andargs(name)"/>?
?<aop:before pointcut-ref="mycut"method="doAccessCheck"? />
?<aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
?? <aop:after-throwing pointcut-ref="mycut"method="doThrowing"/>
?? <aop:after pointcut-ref="argcut"method="doAfter" arg-names="name"/>
?<aop:around pointcut-ref="mycut"method="arround"/>
?</aop:aspect>
?
</aop:config>

</beans>3.开启事务和注解:
<?xml version="1.0" encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
??????????????????">

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
??????????????????
<!-- 配置数据源 -->??
? <bean id="dataSource"value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/>??
??? <property name="username"value="root"/>??
??? <property name="password"value=""/>??
???? <!-- 连接池启动时的初始值-->??
???? <property name="initialSize"value="1"/>??
???? <!-- 连接池的最大值-->??
???? <property name="maxActive"value="500"/>??
???? <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->??
???? <property name="maxIdle"value="2"/>??
???? <!--? 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->??
???? <property name="minIdle"value="1"/>??
? </bean>?
??
? <!-- 配置事务管理器-->??
?<bean id="txManager"style="text-align: left;">
</beans>XML版本:

<?xml version="1.0" encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
??????????????????">

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
??????????????????
<!-- 配置数据源 -->??
? <bean id="dataSource"value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/>??
??? <property name="username"value="root"/>??
??? <property name="password"value=""/>??
???? <!-- 连接池启动时的初始值-->??
???? <property name="initialSize"value="1"/>??
???? <!-- 连接池的最大值-->??
???? <property name="maxActive"value="500"/>??
???? <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->??
???? <property name="maxIdle"value="2"/>??
???? <!--? 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->??
???? <property name="minIdle"value="1"/>??
? </bean>?
??
<!-- 配置事务管理器 -->
?<bean id="txManager"propagation="NOT_SUPPORTED"/>
????? <!-- 其他方法以默认事务进行-->
??????? <tx:methodname="*"/>?
????? </tx:attributes>?
</tx:advice>?
??
?
</beans>4.SSH:
<?xml version="1.0" encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
??????????????????">


?<!-- 配置数据源 -->??
? <bean id="dataSource" /></property>
? <property name="mappingResources">
????? <list>
??????? <value>com/persia/model/Person.hbm.xml</value>
????? </list>
?? </property>
??
???? <!-- 1.首先在sessionFactory里面配置以上3条设置 -->
??????? <!-- 2.然后得在类路径下面添加一个ehcache.xml的缓存配置文件 -->
??????? <!-- 3.最后在要使用缓存的实体bean的映射文件里面配置缓存设置 -->
????????????<!--使用二级缓存-->
????????????<!-- 不使用查询缓存,因为命中率不是很高 -->
????????????<!-- 使用Ehcache缓存产品-->?
? <property name="hibernateProperties">
????? <value>
?????????hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
?????????hibernate.hbm2ddl.auto=update
????????? hibernate.show_sql=false
????????? hibernate.format_sql=false
?????????hibernate.cache.use_second_level_cache=true
??????????????hibernate.cache.use_query_cache=false
??????? ????hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
????? </value>
????? </property>
</bean>

<!-- 配置Spring针对hibernate的事务管理器 -->
<bean id="txManager"style="text-align: left;"><!-- 配置使用注解的方式来使用事务 -->?
<tx:annotation-driven transaction-manager="txManager"/>

<!-- 使用手工配置的注解方式来注入bean -->
<context:annotation-config></context:annotation-config>

<!--定义要注入的业务bean -->
<bean id="personService"style="text-align: left;"><!--将Struts的action交给Spring容器来管理 -->
<bean name="/person/list"style="text-align: left;"><bean name="/person/manage"encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
??????????????????">


?<!-- 配置数据源 -->??
? <bean id="dataSource"destroy-method="close">??
??? <property name="driverClassName"value="com.mysql.jdbc.Driver"/>??
??? <property name="url"value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/>??
??? <property name="username"value="root"/>??
??? <property name="password"value=""/>??
???? <!-- 连接池启动时的初始值-->??
???? <property name="initialSize"value="1"/>??
???? <!-- 连接池的最大值-->??
???? <property name="maxActive"value="500"/>??
???? <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->??
???? <property name="maxIdle"value="2"/>??
???? <!--? 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->??
???? <property name="minIdle"value="1"/>??
? </bean>?
?
? <!-- 配置hibernate的sessionFactory-->
<bean id="sessionFactory" /></property>
? <property name="mappingResources">
????? <list>
???????<value>com/persia/model/Person.hbm.xml</value>
????? </list>
?? </property>
??
???? <!-- 1.首先在sessionFactory里面配置以上3条设置 -->
??????? <!-- 2.然后得在类路径下面添加一个ehcache.xml的缓存配置文件 -->
??????? <!-- 3.最后在要使用缓存的实体bean的映射文件里面配置缓存设置 -->
????????????<!--使用二级缓存-->
????????????<!-- 不使用查询缓存,因为命中率不是很高 -->
????????????<!-- 使用Ehcache缓存产品-->?
? <property name="hibernateProperties">
????? <value>
?????????hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
?????????hibernate.hbm2ddl.auto=update
????????? hibernate.show_sql=false
?????????hibernate.format_sql=false
????????? hibernate.cache.use_second_level_cache=true
??????????????hibernate.cache.use_query_cache=false
??????? ????hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
????? </value>
????? </property>
</bean>

<!-- 配置Spring针对hibernate的事务管理器 -->
<bean id="txManager" style="text-align: left;"><!-- 配置使用注解的方式来使用事务 -->?
<tx:annotation-driven transaction-manager="txManager"/>

<!-- 使用手工配置的注解方式来注入bean -->
<context:annotation-config></context:annotation-config>

<!--定义要注入的业务bean -->
<bean id="personService"style="text-align: left;"><!--注入Struts 2的action-->
<bean id="personList"encoding="UTF-8"?>
<beans
?xmlns="http://www.springframework.org/schema/beans"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xmlns:context="http://www.springframework.org/schema/context"
?xmlns:aop="http://www.springframework.org/schema/aop"
?xmlns:tx="http://www.springframework.org/schema/tx"
?xsi:schemaLocation="http://www.springframework.org/schema/beans
???????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
???????????????????http://www.springframework.org/schema/context
???????????????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
???????????????????http://www.springframework.org/schema/aop
???????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
???????????????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
??????????????????">


<!-- 使用手工配置的注解方式来注入bean -->
<context:annotation-config></context:annotation-config>

<!-- 1.配置Spring集成JPA-->
<bean id="entityManagerFactory"value="SpringJPAPU"/>
</bean>

<!--2.配置Spring针对JPA的事务 -->
??? <bean id="txManager"style="text-align: left;"><!--3.开启事务注解 -->
<tx:annotation-driven transaction-manager="txManager"/>
?
<!--以上3个Spring集成JPA的配置,在web项目先添加Spring支持,后添加JPA支持时会自动生成 -->

<!-- 配置业务bean -->
<bean id="personService"style="text-align: left;"><!-- 配置Struts的action-->
<bean name="/person/list"style="text-align: left;">?

3、Spring事务配置的五种方式

??? 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。

??? 总结如下:

??? Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

??? DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

??? 具体如下图:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /></v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1026" type="#_x0000_t75" alt="初学spring,配备实例!2011年10月12日, AM 11:05:17" href="http://www.blogjava.net/images/blogjava_net/robbie/WindowsLiveWriter/Spring_9C9C/Spring%E4%BA%8B%E5%8A%A1%E9%85%8D%E7%BD%AE%20(2).jpg" style='width:490.5pt;height:283.5pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:fill o:detectmouseclick="t" /> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" o:title="Spring事务配置 (2)" /></v:shape><![endif]--><!--[if !vml]-->初学spring,配备实例!2011年10月12日, AM 11:05:17<!--[endif]-->

??? 根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

??? 第一种方式:每个Bean都有一个代理

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??? xmlns:context="http://www.springframework.org/schema/context"
??? xmlns:aop="http://www.springframework.org/schema/aop"
??? xsi:schemaLocation="http://www.springframework.org/schema/beans
??????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
??????????http://www.springframework.org/schema/context
??????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

??? <bean id="sessionFactory"?
??????????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?
??????? <propertyname="configLocation" value="classpath:hibernate.cfg.xml"?/>?
??????? <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"?/>
??? </bean>?

??? <!-- 定义事务管理器(声明式的事务) -->?
??? <bean id="transactionManager"
??????? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
???
??? <!-- 配置DAO -->
??? <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
???
??? <bean id="userDao"?
??????? class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">?
?????????? <!-- 配置事务管理器 -->?
?????????? <property name="transactionManager" ref="transactionManager"?/>????
??????? <propertyname="target" ref="userDaoTarget"?/>?
???????? <propertyname="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao"?/>
??????? <!-- 配置事务属性 -->?
??????? <propertyname="transactionAttributes">?
??????????? <props>?
???????????????<prop key="*">PROPAGATION_REQUIRED</prop>
??????????? </props>?
??????? </property>?
??? </bean>?
</beans>

??? 第二种方式:所有Bean共享一个代理基类

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??? xmlns:context="http://www.springframework.org/schema/context"
??? xmlns:aop="http://www.springframework.org/schema/aop"
??? xsi:schemaLocation="http://www.springframework.org/schema/beans
??????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
??????????http://www.springframework.org/schema/context
??????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

??? <bean id="sessionFactory"?
??????????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?
??????? <propertyname="configLocation" value="classpath:hibernate.cfg.xml"?/>?
??????? <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"?/>
??? </bean>?

??? <!-- 定义事务管理器(声明式的事务) -->?
??? <bean id="transactionManager"
??????? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
???
??? <bean id="transactionBase"?
??????????? class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?
??????????? lazy-init="true" abstract="true">?
??????? <!-- 配置事务管理器 -->?
??????? <propertyname="transactionManager" ref="transactionManager"?/>?
??????? <!-- 配置事务属性 -->?
??????? <propertyname="transactionAttributes">?
??????????? <props>?
???????????????<prop key="*">PROPAGATION_REQUIRED</prop>?
??????????? </props>?
??????? </property>?
??? </bean>???
??
??? <!-- 配置DAO -->
??? <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
???
??? <bean id="userDao" parent="transactionBase"?>?
??????? <propertyname="target" ref="userDaoTarget"?/>??
??? </bean>
</beans>

第三种方式:使用拦截器

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??? xmlns:context="http://www.springframework.org/schema/context"
??? xmlns:aop="http://www.springframework.org/schema/aop"
??? xsi:schemaLocation="http://www.springframework.org/schema/beans
??????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
??????????http://www.springframework.org/schema/context
??????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

??? <bean id="sessionFactory"?
??????????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?
??????? <propertyname="configLocation" value="classpath:hibernate.cfg.xml"?/>?
??????? <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"?/>
??? </bean>?

??? <!-- 定义事务管理器(声明式的事务) -->?
??? <bean id="transactionManager"
??????? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>?
??
??? <bean id="transactionInterceptor"?
??????? class="org.springframework.transaction.interceptor.TransactionInterceptor">?
??????? <propertyname="transactionManager" ref="transactionManager"?/>?
??????? <!-- 配置事务属性 -->?
??????? <propertyname="transactionAttributes">?
??????????? <props>?
???????????????<prop key="*">PROPAGATION_REQUIRED</prop>?
??????????? </props>?
??????? </property>?
??? </bean>
?????
??? <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">?
??????? <propertyname="beanNames">?
??????????? <list>?
???????????????<value>*Dao</value>
??????????? </list>?
??????? </property>?
??????? <propertyname="interceptorNames">?
??????????? <list>?
???????????????<value>transactionInterceptor</value>?
??????????? </list>?
??????? </property>?
??? </bean>?
?
??? <!-- 配置DAO -->
??? <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
</beans>

第四种方式:使用tx标签配置的拦截器

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??? xmlns:context="http://www.springframework.org/schema/context"
??? xmlns:aop="http://www.springframework.org/schema/aop"
??? xmlns:tx="http://www.springframework.org/schema/tx"
??? xsi:schemaLocation="http://www.springframework.org/schema/beans
??????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
??????????http://www.springframework.org/schema/context
??????????http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
??????????http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

??? <context:annotation-config />
??? <context:component-scan base-package="com.bluesky"?/>

??? <bean id="sessionFactory"?
??????????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?
??????? <propertyname="configLocation" value="classpath:hibernate.cfg.xml"?/>?
??????? <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"?/>
??? </bean>?

??? <!-- 定义事务管理器(声明式的事务) -->?
??? <bean id="transactionManager"
??????? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>

??? <tx:advice id="txAdvice" transaction-manager="transactionManager">
??????? <tx:attributes>
??????????? <tx:method name="*" propagation="REQUIRED"?/>
??????? </tx:attributes>
??? </tx:advice>
???
??? <aop:config>
??????? <aop:pointcutid="interceptorPointCuts"
??????????? expression="execution(*com.bluesky.spring.dao.*.*(..))"?/>
??????? <aop:advisoradvice-ref="txAdvice"
??????????? pointcut-ref="interceptorPointCuts"?/>???????
??? </aop:config>?????
</beans>

第五种方式:全注解

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
??? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??? xmlns:context="http://www.springframework.org/schema/context"
??? xmlns:aop="http://www.springframework.org/schema/aop"
??? xmlns:tx="http://www.springframework.org/schema/tx"
??? xsi:schemaLocation="http://www.springframework.org/schema/beans
??????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
??????????http://www.springframework.org/schema/context
?????????? http://www.springframework.org/schema/context/spring-context-2.5.xsd
??????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
??????????http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

??? <context:annotation-config />
??? <context:component-scan base-package="com.bluesky"?/>

??? <tx:annotation-driven transaction-manager="transactionManager"/>

??? <bean id="sessionFactory"?
??????????? class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">?
??????? <propertyname="configLocation" value="classpath:hibernate.cfg.xml"?/>?
??????? <propertyname="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"?/>
??? </bean>?

??? <!-- 定义事务管理器(声明式的事务) -->?
??? <bean id="transactionManager"
??????? class="org.springframework.orm.hibernate3.HibernateTransactionManager">
??????? <propertyname="sessionFactory" ref="sessionFactory"?/>
??? </bean>
???
</beans>

此时在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public?class UserDaoImpl extendsHibernateDaoSupport implements UserDao {

??? public List<User> listUsers() {
??????? return?this.getSession().createQuery("from User").list();
??? }
???
??? <!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1025" type="#_x0000_t75" alt="初学spring,配备实例!2011年10月12日, AM 11:05:17" style='width:11.25pt;height:15pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.gif" o:title="dot" /></v:shape><![endif]--><!--[if !vml]-->初学spring,配备实例!2011年10月12日, AM 11:05:17<!--[endif]-->
}

?

读书人网 >编程

热点推荐