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. Flink使用Pod Template将状态快照(Checkpoint、Savepoint)存储在NFS

    背景 Flink 版本 1.13.3,使用 native k8s 部署模式,原采用 HDFS 作为状态快照(Checkpoint.Savepoint)的存储地址,但是由于仅使用了其 HDFS 作为状态 ...

  2. 钉钉登录二维码嵌套在vue页面中

    转自 https://www.csdn.net/tags/OtDacg3sMjQ2NTgtYmxvZwO0O0OO0O0O.html 钉钉登录二维码嵌套在vue页面中 2021-09-04 14:42 ...

  3. GraphX 图计算实践之模式匹配抽取特定子图

    本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...

  4. Git出现“filename too long”错误处理

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月8日. 怎么肥事? Windows系统下,在Git使用过程中,出现"filename too long"错误提 ...

  5. MongoDB学习总览

    第1部分: MongoDB入门(第1~6章) 该部分介绍MongoDB的基本概念及入门知识. 通过该部分的学习,读者可对MongoDB自身的技术全貌形成一定的认识. 第2部分: MongoDB微服务开 ...

  6. 如何正确理解古典概率中的条件概率 《考研概率论学习之我见》 -by zobol

    "B事件发生的条件下,A事件发生的概率"? "在A集合内有多少B的样本点"? "在B约束条件下,A发生的概率变化为?" "B事件中 ...

  7. GitHub-SSH密钥获取

    SSH密钥 需要先安装git的客户端,下载: http://git-scm.com/download/ 使用下列步骤完成密钥的添加. 检查系统是否存在密钥 运行 Git Bash, 在弹出的终端中输入 ...

  8. Linux系统安全配置

    1.物理安全 硬件服务器,关闭从CD/DVD等这些方面的软启动方式.同时也可以设置BIOS密码,并且要有限制访问的策略与各类流程管控. 还可以禁用USB设备来达到安全的目的: centos7x 安装d ...

  9. 『现学现忘』Docker基础 — 42、补充:save和load命令说明

    目录 1.save命令 2.load命令 1.save命令 将指定的一个或多个镜像保存成.tar格式的文件,进行打包归档. 查看docker save帮助命令,如下: [root@192 ~]# do ...

  10. MySQL 锁常见知识点&面试题总结

    节选自 <MySQL 常见知识点&面试题总结> 表级锁和行级锁了解吗?有什么区别? MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发 ...