肯定要加的,这个都是要的
ApplicationContext没有注入
因为service如果继承了jdbcDaoSupport类时会自动入住jdbctemplate,会自动注入datasource
因为accountMoney7 已经开启事务,并且propagation = Propagation.REQUIRED, 按照事务的传播机制,执行 transMethod7 不会再开启新的事务,所以发生异常时 还是会回滚
应该只是transMethods()的方法回滚了,lessMoney()提交了
用jdbcTemplate吧这个才是事务实现类的好模板
这是由于缺少jar包导致的,c3p0连接池不仅需要c3p0的jar包,还需要mcommons的jar包,两个jar包下载地址如下:
c3p0:https://www.mvnjar.com/com.mchange/c3p0/0.9.5.1/detail.html
mchange-commons:https://www.mvnjar.com/com.mchange/mchange-commons-java/0.2.16/detail.html
dataSource不支持注入,只能在xml文件中进行注入
https://github.com/ThirdPrince/Spring-transaction-imooc-478
可能是Spring使用代理机制导致的(只看到错误信息和xml文件,大概猜测的原因)
使用JDK动态代理不支持类注入,只支持接口方式注入
如果想类注入可以使用cglib代理
你xml配置文件中注入service使用的是实现类而不是接口:
<bean id="accountService2" class="account.aop.service.AccountService2Impl"> <property name="accountDao2" ref="accountDao2"/> </bean>
应该改为:
<bean id="accountService2" class="account.aop.service.AccountService2"> <property name="accountDao2" ref="accountDao2"/> </bean>
注入dao部分应该也要类似修改。
对的呀!你使用了commit就是不能使用事物的回滚了,commit是提交的意思,COMMIT命令用于把事务所做的修改保存到数据库,它把上一个COMMIT或ROLLBACK命令之后的全部事务都保存到数据库。
问题解决了,导入包还不行,还得导入包的资源文件
老师讲过了。。。。。。。。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!--配置数据源c3p0-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置业务层实现类-->
<bean class="spring.demo2.AccountServiceImpl" id="accountService">
<property name="accountDao" ref="accountDao"/>
</bean>
<!--配置DAO类-->
<bean class="spring.demo2.AccountDaoImpl" id="accountDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置业务层的代理-->
<bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
id="transactionProxyFactoryBean">
<!--目标对象-->
<property name="target" ref="accountService"/>
<!--注入事务管理器-->
<property name="transactionManager" ref="transactionManager"/>
<!--注入属性-->
<property name="transactionAttributes">
<props>
<!--
prop的格式:
PROPAGATION:事务传播行为
ISOLATIN:事务的隔离行为
readOnly:只读
-Exception:发生哪些异常回滚事务
+Exception:发生哪些异常事务不回滚
-->
<!--*代表类中的所有方法-->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
解压在项目目录下的lib文件夹内
log4j.rootLogger=DEBUG,Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=INFO
在我感觉,事务的增强就是相当于给游戏人物穿一身装备,扩展能力.
原有的类做不到的功能,通过增强可以实现
老师是将dataSource这个连接池配置在applicationcontext.xml中的。
没有涉及前端,所以目前是不需要的
main中调用transferMoney <- 这个方法没有被spring 注册。
StudentDao需要从application 中getBean出来
log4j.properties只要就是输出日志的,spring默认的配置文件名称是applicationContext.xml,所以不需要进行配置
老师用的继承了各种插件的myeclipse,你如果想用提示,得给eclipse装下spring的插件。可参考这个博客
https://www.cnblogs.com/007sx/p/5659379.html
一些源码下载网站 例如:http://climberres.top/
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext3.xml]:
没办法创建这个bean: dataSource,有没有可能是这个写错了?要不就是c3p0的包没导入,重点看Caused by里面的原因,一个个解决