`
lionelf
  • 浏览: 81694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring事务,方法拦截器各种配置

阅读更多

1. 代理工厂Bean事务管理( *ProxyFactoryBean) + Service + DAO配置

我刚开始看Spring时用的书是林信良的《Spring技术手册》,书中对声明式事务主要采用 TransactionProxyFactoryBean,业务Bean如 Service或BO类继承它来进行事务控制。代理工厂Bean( *ProxyFactoryBean)这一类Spring提供的工厂类,可将一个 bean 进行委托代理,从而达到控制方法行为的目的。

此类事务配置一般如下(因为我们未采用这种方式,就以书上的JDBC datasource举例说明。不同公司采用的格式可能有所不同):


Xml代码



<!-- 前面的 dataSource等配置略 ........ --> 



<!-- 事务管理器 --> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 

<property name="dataSource"> 

<ref local="dataSource" /> 

</property> 

</bean> 



<!-- 事务模板 --> 

<bean id="baseTransactionProxy" 

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 

abstract="true"> 

<property name="transactionManager" ref="transactionManager" /> 

<property name="transactionAttributes"> 

<props> 

<prop key="*">PROPAGATION_REQUIRED</prop> <!-- 本文仅简单用一种方式说明。所有方法起事务,可以修改以精细和区别性控制事务 --> 

</props> 

</property> 

</bean> 





<!-- 业务对象 --> 

<bean id="authService" parent="baseTransactionProxy"> 

<property name="target"> 

<bean class="com.xxxx.cms.service.AuthorityService"> 

<property name="authDao" ref="authDao" /> 

</bean> 

</property> 

</bean> 

<bean id="departmentService" parent="baseTransactionProxy"> 

<property name="target"> 

<bean class="com.xxxx.cms.service.pojo.DepartmentService"> 

<property name="departmentDao" ref="departmentDao" /> 

</bean> 

</property> 

</bean> 

<!-- 数据访问对象 --> 

<bean id="authDao" class="com.xxxx.cms.dao.jdbc.AuthorityDao"> 

<property name="dataSource" ref="dataSource" /> 

</bean> 

<bean id="departmentDao" class="com.xxxx.cms.dao.jdbc.DepartmentDao"> 

<property name="dataSource" ref="dataSource" /> 

</bean> 





<!-- 前面的 dataSource等配置略 ........ -->
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<!-- 事务模板 -->
<bean id="baseTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>   <!-- 本文仅简单用一种方式说明。所有方法起事务,可以修改以精细和区别性控制事务 -->
</props>
</property>
</bean>
<!-- 业务对象 -->
<bean id="authService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.xxxx.cms.service.AuthorityService">
<property name="authDao" ref="authDao" />
</bean>
</property>
</bean>
<bean id="departmentService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.xxxx.cms.service.pojo.DepartmentService">
<property name="departmentDao" ref="departmentDao" />
</bean>
</property>
</bean>
<!-- 数据访问对象 -->
<bean id="authDao" class="com.xxxx.cms.dao.jdbc.AuthorityDao">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="departmentDao" class="com.xxxx.cms.dao.jdbc.DepartmentDao">
<property name="dataSource" ref="dataSource" />
</bean>



这种代理工厂Bean的事务管理一般都要求将 Service 的 bean 配置为 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" , 上面的例子使用了 parent="baseTransactionProxy" 继承机制简化了原书中的配置。

代码中通过以下方式使用:




Java代码



AuthService authService = (AuthService) context.getBean("authService"); 

boolean b = authService.hasPermission("TOKEN_XXXXX"); 





AuthService authService = (AuthService) context.getBean("authService");
boolean b = authService.hasPermission("TOKEN_XXXXX");



2. 自动代理事务(*AutoProxyCreator) + Service + DAO配置

*AutoProxyCreator这一类东东,能够自动为Spring容器中的bean进行 AOP 代理,配置起来能适当简化。一般需要用 BeanNameAutoProxyCreator 来配置对那些类进行自动代理, MethodPointcutAdvisor 来配置对哪些方法进行代理。

这种声明式事务配置采用拦截器(Interceptor)或通知器(Advisor) 进行事务控制,这里使用了Spring提供的 TransactionInterceptor 来管理事务。 (本质上 ProxyFactoryBean 也要生成被代理对象的字节码,不过每个类型的ProxyFactoryBean 只能固定处理一个 Aspect,不算真正的AOP)。

以下配置对 *Service 的所有方法进行事务控制。 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> 




Xml代码



<!-- 事务管理拦截器 --> 

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> 

<property name="transactionManager"> 

<ref local="transactionManager"/> 

</property> 

<property name="transactionAttributes"> 

<props> 

<prop key="*">PROPAGATION_REQUIRED</prop> <!-- 本文仅简单用一种方式说明。所有方法起事务,还可以精细控制事务 --> 

</props> 

</property> 

</bean> 



<!-- 配置要拦截哪些方法 --> 

<bean id="trasactionMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 

<property name="mappedNames"> 

<list> 

<value>*</value> <!-- 所有方法 --> 

</list> 

</property> 

<property name="advice"> 

<ref local="transactionInterceptor" /> 

</property> 

</bean> 



<!-- 配置要拦截哪些类,并使用那些拦截器 --> 

<bean id="ServiceAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 

<property name="proxyTargetClass" value="true"></property> 

<property name="beanNames"> 

<list> 

<value>*Service</value> 

</list> 

</property> 

<property name="interceptorNames"> 

<list> 

<!-- 头三个是我们项目中用的其他 Advisor,这里展示了添加拦截器进行aspect控制的灵活性。省略他们的配置 --> 

<value>monitorMethodPointcutAdvisor</value> 

<value>asynmonitorMethodPointcutAdvisor</value> 

<value>businessLogMethodPointcutAdvisor</value> 

<value>trasactionMethodPointcutAdvisor</value> <!-- 事 务拦截器, 直接配成 transactionInterceptor 去 掉 trasactionMethodPointcutAdvisor bean 也可以, --> 

</list> 

</property> 

</bean> 





<!-- 事务管理拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop> <!-- 本文仅简单用一种方式说明。所有方法起事务,还可以精细控制事务 -->
</props>
</property>
</bean>
<!-- 配置要拦截哪些方法 -->
<bean id="trasactionMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedNames">
<list>
<value>*</value> <!-- 所有方法 -->
</list>
</property>
<property name="advice">
<ref local="transactionInterceptor" />
</property>
</bean>
<!-- 配置要拦截哪些类,并使用那些拦截器 -->
<bean id="ServiceAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="true"></property>
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<!-- 头三个是我们项目中用的其他 Advisor,这里展示了添加拦截器进行aspect控制的灵活性。省略他们的配置 -->
<value>monitorMethodPointcutAdvisor</value>
<value>asynmonitorMethodPointcutAdvisor</value>
<value>businessLogMethodPointcutAdvisor</value>
<value>trasactionMethodPointcutAdvisor</value> <!-- 事务拦截器, 直接配成 transactionInterceptor 去掉 trasactionMethodPointcutAdvisor bean 也可以, -->
</list>
</property>
</bean>



Service,DAO的配置方式稍微改变一下, Service不再作为ProxyFactoryBean的 target属性,而是一个顶级 bean,这样 Service bean看起来就更单纯一些。 


Xml代码



<!-- 业务对象 --> 

<bean class="com.xxxx.cms.service.AuthorityService"> 

<property name="authDao" ref="authDao" /> 

</bean> 

<bean class="com.xxxx.cms.service.pojo.DepartmentService"> 

<property name="departmentDao" ref="departmentDao" /> 

</bean> 



<!-- 数据访问对象 --> 

<bean id="authDao" class="com.xxxx.cms.dao.jdbc.AuthorityDao"> 

<property name="dataSource" ref="dataSource" /> 

</bean> 

<bean id="departmentDao" class="com.xxxx.cms.dao.jdbc.DepartmentDao"> 

<property name="dataSource" ref="dataSource" /> 

</bean> 

分享到:
评论

相关推荐

    spring五种事务配置demo

    测试spring事务管理 搭建了ssh框架的web工程 本工程用到的数据库表很简单 user(id, name) 可自行创建 本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务...

    spring 事务配置的五种方法

    spring 事务配置的五种方法 1:每个bean都有个代理 2:所有bean共享一个代理基类 3:拦截器 4:tx标签拦截器 5:全注释(注记)

    Spring配置事务处理

    这是在java里使用到spring的配置文件里,添加事务处理过程,以至于可以回滚事务,当中使用到拦截器。

    springMVC+Mybatis3.1+spring3.1.2包含事务,注解,拦截器

    springMVC+Mybatis3.1+spring3.1.2(包含事务详解,代码诠释,含数据库文件...展示了增、删、改、查、注解、拦截器、spring事务配置(亲测成功),sql文 件!!赶紧来下载给好评!!! web project 完全可以跑起来!!!

    Spring MVC事务配置

    一、      XML,使用tx标签配置拦截器实现事务 一、      Annotation方式 以下所使用环境为Spring4.0.3、Hibernate4.3.5

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    -- 配置事务拦截器--&gt; class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt; &lt;!-- 事务拦截器bean需要依赖注入一个事务管理器 --&gt; &lt;!-- 下面定义事务传播属性 [ bus* 事务...

    使用Spring更好地处理Struts动作

    用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。 依赖注入是一个强大的特性,但是 Spring ...您很快就会看到,为了处理横切关注点,Spring AOP 发布了它自己的拦截器,您也可以编写您自己的拦截器。

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    10、SpringMVC的异常处理及其拦截器 11、MyBatis简介及其入门 12、MyBatis的配置文件详解 13、MyBatis的多表操作 适用人群: 在校大学生/职场小白 Spring部分: 1、Spring简介 2、Spring快速入门 3、Spring配置...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:...

    Spring.3.x企业应用开发实战(完整版).part2

    15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...

    Spring 2.0 开发参考手册

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2....

    spring applicationContext 配置文件

    -- 配置事务管理器,這個事務性是爭對pdm數據庫的 --&gt; &lt;bean id="transactionManagerPdm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager " p:dataSource-ref="dataSourcePdm"/&gt; ...

    Spring中文帮助文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    JavaSpring的商城项目前台+后台+api

    面向切面编程(AOP):Spring支持AOP,允许定义方法拦截器和切点来分离应用程序的业务逻辑和系统服务。这有助于增加模块化,并且可以用于事务管理、日志记录等。 事务管理:Spring提供了一致的事务管理接口,可以在...

    Spring API

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    spring in action英文版

     11.1.1 安全拦截器  11.1.2 认证管理器  11.1.3 访问决策管理器  11.1.4 运行身份管理器  11.2 管理身份验证  11.2.1 配置ProviderManager  11.2.2 根据数据库验证身份  11.2.3 根据LDAP...

    spring chm文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2....

    Spring3.x企业应用开发实战(完整版) part1

    15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...

    springCloud.rar(私聊博主要密码)

    + 熔断机制 + eureka + 单元测试(controller、service、mapper层) + redis集群集成练习 + redis操作练习 + fastDFS集成练习 + 全局拦截器 + 定时器配置 + 定时器任务设计[线程池+分布式锁] +关闭挂钩 + 单例应用 + ...

    Spring攻略(第二版 中文高清版).part1

    8.3 用处理程序拦截器拦截请求 297 8.3.1 问题 297 8.3.2 解决方案 298 8.3.3 工作原理 298 8.4 解析用户区域 302 8.4.1 问题 302 8.4.2 解决方案 302 8.4.3 工作原理 302 8.5 外部化区分区域的...

Global site tag (gtag.js) - Google Analytics