由于到最后我的项目还是有个邪门的错没解决,所以先把文章大概内容告知:

1.spring框架aop注解扫描默认是关闭的,得手动开启。

2.关于Con't call commit when autocommit=true报错信息的解决。

3.最后是有一个由bean.xml配置切面(运行结果没问题)转换成注解配置切面(结果:执行方法顺序错误,而且注解的位置我也没注错)的问题。希望有大佬路过可以帮我看一看。

如果前两条可能帮不上你,又对我遇到的错误没兴趣,又在着急解决自己遇到的问题的话,可以继续去搜索其他解决办法了。

正文:

学习spring框架并练习转账业务的代码编写

为转账业务已经写好事务控制类,保证每一个业务用同一个connection。并且已经在bean.xml中用<aop:config>标签配置好切面,并且能成功走切面。

而我用注解的形式代替用bean.xml<aop:config>标签形式完成切面配置后发现不走切面,就是我写的事务控制类即使加了注解也不走事务控制类里的方法了。

我怀疑是不是漏掉了什么,于是上网查找annotation配置步骤,发现果然缺了一步:开启aop注解扫描方式。

aop注解扫描默认是false,得在bean.xml中加上这段代码:

<!--开启aop注解方式,默认为false-->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>

运行后果然走切面了,但是紧接着报了一个错

查了一下报错原因:

Can't call commit when autocommit=true表示的意思就是当自动属性值为true是无法call commit(mysql默认都是自动提交)

解决此问题只需要将自动提交改成手动提交即可,也就是令autocommit=false。

我找到提示得错误位置的代码

意思是提交之前得将自动提交改成手动提交,于是我将代码改成:

运行之后成功了。但是我的想法是转账业务得方法是切点,开启事务是前置通知,提交事务时后置通知。

并且已经在前置通知里关闭自动提交。

按理说用的是同一条连接,我应该不用在提交之前重新再关一遍自动提交。后来在运行结果出发现了问题。

业务处理执行完毕之后并没有提交,而是释放了资源,释放资源之后才进行了提交操作。导致还是用了两个连接(connection),而且有一个挺搞笑的事:

第一个连接做的事是:开始事务:方法是关闭了自动提交。执行业务:感觉上对数据库一顿操作,但是没提交,也不会自动提交。最后释放资源了:将连接关闭了。

第二两连接做的事是:提交事务。他也不知道要提交啥,最后还没被关闭,他估计现在还在想呢,我刚刚到底提交了啥?

这一波操作,代码通了,也没报错。你感觉你成了,其实数据库没变。一切跟没做一样。

总而言之,我好像知道哪里出错了,应该是切面里的方法执行顺序错了,我第一感觉应该是我马虎将方法上注解加错了。去检查一番发现好像并没错

切点表达式是对的,因为从运行结果上看,已经找到切点了。前置通知用Before,后置通知用AfterReturning,最终通知用After。这些都没错。

我彻底懵了。处世未深的我瑟瑟发抖。用bean.xml配置没有问题,改成注解配置怎么会出现顺序的错误呢?

可能我学的时候忽略了什么知识,或者有地方马虎了我还没找出来。希望大佬们帮忙看看。以下是可能出现问题的代码(只进行改动的代码):

bean.xml(用这种方式运行是没错的):

<!--Aspect已经用注解形式在切面类TranscationManager.java中配置完成-->
<!--开启aop注解方式,默认为false-->
<!--<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>-->
<aop:config>
<aop:pointcut id="pt1" expression="execution(* ccut.wulang.service.impl.*.*(..))"/>
<aop:aspect id="txValue" ref="transcationManager">
<aop:before method="beginTranscation" pointcut-ref="pt1"></aop:before>
<aop:after-returning method="commit" pointcut-ref="pt1"></aop:after-returning>
<aop:after-throwing method="rollback" pointcut-ref="pt1"></aop:after-throwing>
<aop:after method="release" pointcut-ref="pt1"></aop:after>
<!--<aop:around method="around" pointcut-ref="pt1"></aop:around>-->
</aop:aspect>
</aop:config>

TranscationManager.java切面类:

@Component
@Aspect
public class TranscationManager {
@Autowired
ConnectionUtil connectionUtil;
@Pointcut(value = "execution(* ccut.wulang.service.impl.*.*(..))")
private void pt1(){

}
@Before("pt1()")
public void beginTranscation(){
System.out.println("开启事务....");
try {
connectionUtil.getThreadConnect().setAutoCommit(false);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}

@AfterReturning("pt1()")
public void commit(){
System.out.println("提交事务....");
try {
connectionUtil.getThreadConnect().commit();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@AfterThrowing("pt1()")
public void rollback(){
System.out.println("回滚事务....");
try {
connectionUtil.getThreadConnect().rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@After("pt1()")
public void release(){
System.out.println("释放资源....");
try {
connectionUtil.getThreadConnect().close();
connectionUtil.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}

spring框架aop用注解形式注入Aspect切面无效的问题解决的更多相关文章

  1. Spring框架使用(控制反转,依赖注入,面向切面AOP)

    参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...

  2. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  3. Spring框架AOP学习总结(下)

    目录 1. AOP 的概述 2. Spring 基于AspectJ 进行 AOP 的开发入门(XML 的方式): 3.Spring 基于AspectJ 进行 AOP 的开发入门(注解的方式): 4.S ...

  4. 跟着刚哥学习Spring框架--AOP(五)

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...

  5. Spring框架学习之注解配置与AOP思想

         上篇我们介绍了Spring中有关高级依赖关系配置的内容,也可以调用任意方法的返回值作为属性注入的值,它解决了Spring配置文件的动态性不足的缺点.而本篇,我们将介绍Spring的又一大核心 ...

  6. spring框架学习(四)——注解方式AOP

    注解配置业务类 使用@Component("s") 注解ProductService 类 package com.how2java.service; import org.spri ...

  7. Spring框架 aop操作的注解方法 基于aspectj的自动注解aop方法 抽取相同的value="execution(public void cn.itcast.f_aspect.CRUD.*())"

    首先是在xml配置文件中配置好对象,然后开启aop的注解方法——即<aop:aspectj-autoproxy></aop:aspectj-autoproxy> xml代码如下 ...

  8. 使用Spring实现AOP(XML+注解)

    一.Spring对AOP的支持 AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行 ...

  9. 10 Spring框架 AOP (三) Spring对AspectJ的整合

    上两节我们讲了Spring对AOP的实现,但是在我们的开发中我们不太使用Spring自身的对AOP的实现,而是使用AspectJ,AspectJ是一个面向切面的框架,它扩展了Java语言.Aspect ...

随机推荐

  1. SpringMVC听课笔记(九:数据转换 & 数据格式化 & 数据校验)

    1.数据绑定流程 --1). Spring MVC主框架将ServletRequest对象及目标方法入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. - ...

  2. cookie机制、session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  3. Docker容器启动Mysql,Docker实现Mysql主从,读写分离

    Docker容器启动Mysql,Docker实现Mysql主从,读写分离 一.Docker文件编排 二.配置主从复制 2.1 配置master 2.2 配置slave 三.验证主从复制 3.1 mas ...

  4. Linux常用命令详解(第三章)(ping、kill、seq、du、df、free、date、tar)

    本章命令(共7个): 1 2 3 4 5 6 7 8 ping kill seq du df free date tar 1." ping " 作用:向网络主机发送ICMP(检测主 ...

  5. Cisco的互联网络操作系统IOS和安全设备管理器SDM__管理Cisco互联网络

    1.如果不能远程登录到一台设备上,可能是由于远程设备上没有设置口令.也可能是由于访问控制列表过滤了远程登录会话. show users:检查都有哪些设备连接到了此路由器. clear line #:清 ...

  6. 设计模式(七)——适配器模式(SpringMVC框架分析)

    适配器模式 1 现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了. 2 基本介绍 1) 适配器模式(Adapter Pattern)将某个类 ...

  7. 一篇文章图文并茂地带你轻松学完 JavaScript 事件循环机制(event loop)

    JavaScript 事件循环机制 (event loop) 本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识. 本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读 ...

  8. poj 3278 Catch That Cow(记忆化广度优先搜索)

    题意: 0到N的数轴上,每次可以选择移动到x-1,x+1,2*x,问从n移动到k的最少步数. 思路: 同时遍历三种可能并记忆化入队即可. Tips: n大于等于k时最短步数为n-k. 在移动的过程中可 ...

  9. P2762 太空飞行计划问题 (最小割)

    题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器 购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益 题解:......................... ...

  10. div 水平居中 内容居左

    <div style="margin:0 auto;width:500px;text-align:left"> </div> https://zhidao. ...