spring声明式事务,service层必须在ioc容器中声明?

问题描述

各位,小弟在学习spring+hibernate 声明式事务时,发现一个问题, 做了两种测试1. 建立一个普通的 java projectx.y.services 包下有 applicationContext.xml, DefaultFooService.java, 在applicationContext.xml中对DefaultFooService进行声明式事务,并注入 DefaultFooService运行后成功实现事务管理2. 建立一个 web dynamic project在applicationContext.xml中对DefaultFooService进行声明式事务,但不注入 DefaultFooService,而是在 DefaultFooService.java中,public void init() {System.out.println("init...");ctx = new ClassPathXmlApplicationContext("applicationContext.xml");sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");if(sessionFactory == null) {System.out.println("sessionFactory is null");}fooDaoHibernate = new FooDaoHibernate();if(fooDaoHibernate == null) {System.out.println("fooDaoHibernate in init() is null");}fooDaoHibernate.setSessionFactory(sessionFactory);relationshipDaoHibernate = new RelationshipDaoHibernate();relationshipDaoHibernate.setSessionFactory(sessionFactory);}同时在 spring-servlet.xml中<bean id="fooService" class="x.y.services.DefaultFooService" init-method="init"></bean>这样的话,事务没有成功所以,请问 问题出在哪?我个人猜测是不是因为我没有使用 IoC容器管理 DefaultFooService,所以声明式事务无法实现,如果是这样,应该怎样进行事务管理?谢谢! 问题补充:补充:public class DefaultFooService implements FooService { private static FooDaoHibernate fooDaoHibernate; private static RelationshipDaoHibernate relationshipDaoHibernate; private static ApplicationContext ctx = null; private static SessionFactory sessionFactory = null; ...}1. 建立一个普通的 java project, 在applicationContext.xml中,注入DefaultFooService,<bean id="fooService" class="x.y.service.DefaultFooService"> <property name="fooDaoHibernate" ref="fooDao" /> <property name="relationshipDaoHibernate" ref="relationshipDao" /></bean><bean id="fooDao" class="x.y.service.FooDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /></bean><bean id="relationshipDao" class="x.y.service.RelationshipDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /></bean>,2. 建立一个 web dynamic project,在applicationContext.xml中,没有上面的代码,而是如正文所述。

解决方案

哥们,你这个我看是没有在你的applicationcontext中配置dao,而是在initmethod中直接instant的dao,所以你的这个dao不是由spring容器进行维护的,所以spring对它什么也做不了,自然就无法进行声明式事物控制了。你如果使用annotation注入的dao的话也是一样可以生效的,另外一个小建议就是如果使用@Transactional,最好放在service层。

时间: 2024-10-01 19:35:02

spring声明式事务,service层必须在ioc容器中声明?的相关文章

spring声明式事务解析_java

一.spring声明式事务 1.1 spring的事务管理器 spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事务实现.spring容器负责事物的操作,spring容器充当切面,事务的方法称为增强处理,生成的代理对象的方法就是目标方法+增强也就是crud+事务程序员只用做crud的操作,也就是目标方法和声明哪些方法应该在事务中运行. Spring提供了许多内置事务管理器实现: DataSourceTransactionManager:位于or

Spring声明式事务管理源码解读之事务提交

在下面的文章中,我讲会多次提到第一篇文章,第一篇文章是:Spring声明式事务管 理源码解读之事务开始 如果要理解事务提交的话,理解事务开始是一个前提条件,所以请先看第一篇文章,再 来看这篇 如果你仔细看下去,我想肯定是有很多收获,因为我们确实能从spring的代码和思想 中学到很多东西. 正文: 其实俺的感觉就是事务提交要比事务开始复杂,看事务是否提交我们还是要回到 TransactionInterceptor类的invoke方法 Java代码 public Object invoke(Met

Spring声明式事务管理源码解读之事务开始

这个是我昨天在解决问题是看源码得一点体验,可能说得比较大概,希望大家多多讨 论,把本贴得质量提高上去,因为spring实现的事务管理这部分我相信还是有点复杂的. 一个人未必能想得十分清楚 在spring的声明式事务管理中,它是如何判定一个及标记一个方法是否应该是处在事 务体之中呢. 首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的.有这样一 个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口 TransactionAttribute,其中

spring声明式事务

问题描述 最近研究了很久spring控制事务的问题,也看了源代码,但是小弟有一点问题不明白在事务方法中如publicvoidupdate(){//dataStore.currentConnection().setAutoCommit(false);Studentstu=newStudent();stu.setId("3");stu.setName("潘潘");dataStore.insert(stu);}这样是没有问题的,可以插入oracle数据库中,如果把注释打开

spring声明式事务 同一类内方法调用事务失效

只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题]        Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务:轻量级,测试起来也简单,嘿!".不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事.所以,我们"一直用它".         不过,最近的一个项目里

spring声明式事务管理解析_java

前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解. 本文内容: 1.了解什么是声明式事务? 2.声明式事务管理分别有哪几种? 3.这几种事务管理之间的区别是什么? 一.什么是声明式事务? 声明式事务(declarative transaction management)是spring提供的对程序事务管理的方式之一.Spring的声明式事务就是采用声明的方式来处理事务,用在Spring配置文件中声明式的处理事务来代替代码式的处理事务.这样的好处是

mysql+spring 声明式事务不起作用

问题描述 详细情况如图所示, 真的找不出是哪里存在了问题... 也许是申明式事务配置错误? 求大家帮我看看啦, 谢谢!!! 解决方案 invalid bound statement (not found) 你的那个statement名字估计写的不对解决方案二:首先,不确定到底是哪里出错了,但有几个地方你可以再确定下,1.配置事务的地方增加rollback-for 和 no-rollback-for 属性的值,但是我也不确定这两个属性是否有默认值.<tx:method name="del*&

Spring声明式事务配置管理方法

环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring2.0AOP类库即可.添加方法: 点击项目右键->BuildPath->Addlibrarys: 打开AddLibraries对话框,然后选定MyEclipseLibraries: 点击Next,找到Spring2.0aopLibraries并勾选上,点击finsh即可. 如果在项目里面能看到下面的库文件,说明已经安装成功. 事务配置 首先在/WEB-INF/applicationContex

spring学习笔记(22)声明式事务配置,readOnly无效写无异常

在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置.但在实际开发中,我们可能并不需要这样细粒度的配置.另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情.而且也可能会造成大量重复代码的冗杂堆积.面对这些缺点,我们首要想到的就是我们spring中的AOP了.spring声明式事务的实现恰建立在AOP之上. 在这一篇文章中,我们介绍s