1.spring + mybatis:

Aop流程:

提前定义好几个用于Aop的类

前置通知:新建MyBeForeAdvice类 实现 MethodBeforeAdvice,并实现其方法

后置通知:新建MyAfterAdvice类 实现 AfterReturningAdvice,并实现其方法

环绕通知:新建RoundAdvice类 实现 MethodInterceptor ,并实现其方法

异常通知:新建ExceptionAdvice类 实现 ThrowsAdvice , 并编写 ”afterThrowing“ 方法,如下:

public void afterThrowing(Exception ex){
System.out.println("异常通知: my throws 异常通知辅助功能");
}

applicationContext.xml配置如下:

<!-- 目标 : 原始业务,自己的某个bean都行-->
<bean id="us" class="com.qf.service.UserServiceImpl" /> <!-- 通知:额外功能 -->
<!-- 前置通知类 -->
<bean id="before" class="com.qf.aop.MyBeforeAdvice"></bean>
<!-- 后置通知,在核心之后执行,如果核心有异常,则不执行 -->
<bean id="after" class="com.qf.aop.MyAfterAdvice"></bean>
<!-- 在核心中抛异常时,执行 -->
<bean id="throws" class="com.qf.aop.MyThrowsAdvice"></bean>
<!-- 环绕通知 -->
<bean id="mi" class="com.qf.aop.MyMethodInterceptor"></bean>

定义切入点,形成切面

<aop:config>
<!-- 切入点【修饰符 返回值 包.类 方法名 参数表 】 -->
<aop:pointcut id="pc_shine" expression="execution(* queryUsers())"/>
<aop:pointcut id="pc_shine2" expression="execution(* deleteUser(..))"/>
<aop:pointcut id="pc_shine3" expression="execution(* updateUser(..))"/>
<aop:pointcut id="pc_shine4" expression="execution(* saveUser(..))"/> <!-- 组装 -->
<aop:advisor advice-ref="before" pointcut-ref="pc_shine"/>
<aop:advisor advice-ref="after" pointcut-ref="pc_shine2"/>
<aop:advisor advice-ref="throws" pointcut-ref="pc_shine3"/>
<aop:advisor advice-ref="mi" pointcut-ref="pc_shine4"/>
</aop:config>
根据表达式通配切入点:

语法 : execution(返回值类型 包名.方法名(参数包名.类型))

<aop:config>
<!--匹配参数-->
<aop:pointcut id="pc01" expression="execution(* *(com.qf.pojo.User))"/>
<!--匹配任意方法(无参)-->
<aop:pointcut id="pc02" expression="execution(* *())"/>
<!--匹配方法名(任意参数)-->
<aop:pointcut id="pc03" expression="execution(* saveUser(..))"/>
<!--匹配返回值类型(任意参数)-->
<aop:pointcut id="pc04" expression="execution(java.lang.Integer *(..))"/>
<!--匹配类名(任意参数)-->
<aop:pointcut id="pc05" expression="execution(* com.qf.service.UserServiceImpl.*(..))"/>
<!--匹配包名(任意参数)-->
<aop:pointcut id="pc06" expression="execution(* com.qf.service.*.*(..))"/>
<!--匹配包名、以及子包名(任意参数)-->
<aop:pointcut id="pc07" expression="execution(* com..*.*(..))"/> <!--组装-->
<aop:advisor advice-ref="after" pointcut-ref="pc01"/>
</aop:config>

2.事务控制:

1.配置DataSourceTransactionManager事务管理器,其中持有DataSource,可以控制事 务功能(commit,rollback等)。

<!-- 1. 引入一个事务管理器,其中依赖DataSource,借以获得连接,进而控制事务逻辑 -->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

2.配置事务切面, 事务使用的规则

<!--aop在事务中的使用, 配置事务切面, 事务使用的规则-->
<tx:advice id="txManager" transaction-manager="tx">
<tx:attributes>
<!--规定哪些方法不需要事务(查询方法)propagation="SUPPORTS" 取消事务-->
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="query*" propagation="SUPPORTS"/>
<tx:method name="select*" propagation="SUPPORTS"/>
<tx:method name="get*" propagation="SUPPORTS"/>
<!--规定哪些方法需要事务(增删改) rollback-for="Exception" 遇到异常执行回滚操作-->
<tx:method name="insert*" rollback-for="Exception"></tx:method>
<tx:method name="update*" rollback-for="Exception"></tx:method>
<tx:method name="delete*" rollback-for="Exception"></tx:method>
</tx:attributes>
</tx:advice>

3.将事务管理的Advice 切入需要事务的业务方法中

<!--使用AOP切入事务-->
<aop:config>
<!--规定切点(某个方法,或匹配范围内的方法)-->
<aop:pointcut id="pc" expression="execution(* com.qf.service.*.*(..))"/>
<!--组织切面-->
<aop:advisor advice-ref="txManager" pointcut-ref="pc"/>
</aop:config>

3.开启注解开发

<!--开启注解使用(扫描此包下的所有注解)-->
<context:component-scan base-package="com.qf"></context:component-scan>
@Autowhrid与@Resource的区别

一个接口只有一个实现类的时候,用@Autowhird

一个人接口有多个实现类的时候,

bean的注解后面应加上括号,例如@Service(value = “u2”)

注入时用@Resource(name = "u2"),而不是@Autowhird

@Controller 用在控制层的实现类上

@Service 用在service实现类上

@Repository 用在dao层的实现类上

@Component 用在其他需要被spring管理的bean上

@Value("${某个属性名}") //获取引入的properties文件内的某个属性,赋值给变量

private String ha;

4.使用注解@Transactional控制事务 (方便)

  1. 在applicationContext.xml中配置好事务管理器,上面有配置方法

  2. 在applicationContext.xml中配置声明式事务标签,并指定事务管理器

  3. <!--声明式事务,注解实现-->
    <!-- 告知spring,@Transactional在定制事务时,基于tx=DataSourceTransactionManager -->
    <tx:annotation-driven transaction-manager="tx"/>
  4. 在applicationContext.xml中配置好注解扫描,上面有配置方法

  5. 在想添加事务的方法上添加@Transactional注解即可

(事务控制应该在ServiceImpl层实现,而不是controller层)

spring-aop-事务-注解开发-代理的更多相关文章

  1. 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)

    主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...

  2. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  3. Spring笔记13--SSH--全注解开发

    SSH全注解开发: (1) 在Action类中添加注解,实现Struts2的注解开发(@NameSpace.@ParentPackage.@Action...) package com.tongji. ...

  4. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  5. Spring AOP源码分析--代理方式的选择

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...

  6. spring aop 使用注解方式总结

    spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...

  7. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  8. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  9. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  10. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

随机推荐

  1. 使用http://start.spring.io/构建maven微服务项目的几个坑及eclipse构建spring boot微服务项目

    一,使用http://start.spring.io/构建maven微服务项目 本来嘛,直接构建的项目导入时没有任何问题的导入就可以运行,可是最近构建好项目,然后导入,种种报错 1.导入之后POM报错 ...

  2. SAP Web Dynpro - 应用程序中的服务调用

    您可以使用服务调用来调用Web Dynpro组件中的现有功能模块. 要创建服务呼叫,您可以使用Web Dynpro工具中易于使用的向导. 您可以在ABAP工作台中启动该向导以创建服务调用. 步骤1-选 ...

  3. UiPath循环活动While的介绍和使用

    一.While循环的介绍 先判断条件是否满足, 如果满足, 再执行循环体, 直到判断条件不满足,则跳出循环 二.While循环在UiPath中的使用 1. 打开设计器,在设计库中新建一个Flowcha ...

  4. jenkins页面一直在Please wait while Jenkins is getting ready to work ...

    原因:因为访问官网太慢.我们只需要换一个源,不使用官网的源即可. 1.找到jenkins工作目录 find / -name *.UpdateCenter.xml 2.修改文件中的url,随后重启就行了 ...

  5. 微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹

    之前的文章中我们介绍了如何通过 Nocalhost 快速开发 Rainbond 上的微服务,介绍了基本的开发流程. 本文将续接上文继续介绍,使用 Nocalhost 开发配置文件 实现以下内容: 一键 ...

  6. 这么强?!Erda MySQL Migrator:持续集成的数据库版本控制

    为什么要进行数据库版本控制? 现代软件工程逐渐向持续集成.持续交付演进,软件一次性交付了事的场景逐渐无法满足复杂多变的业务需求,"如何高效地进行软件版本控制"成为我们面临的挑战.同 ...

  7. HMS Core图形图像技术展现最新功能和应用场景,加速构建数智生活

    [2022年7月15日,杭州]HUAWEI Developer Day(华为开发者日,简称HDD)杭州站拉开帷幕.在数字经济不断发展的今天,开发者对图形图像的开发需求更加深入和多样化,从虚拟环境重构到 ...

  8. 沙漠世界1.0 c++小游戏

    #include<bits/stdc++.h> #include<time.h> #include<windows.h> #include<stdlib.h& ...

  9. centos7更改中文

    这是在CentOS7中设置,CentOS6的是在 .etc/sysconfig/i18n 配置文件下.在root用户下操作,使用 locale 命令查看语言环境,看到 LANG=en_US.utf8 ...

  10. 算法竞赛进阶指南 0x52 背包

    背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选 ...