Spring学习之AOP与事务
一、概述
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
简而言之,aop的作用就是在不修改源码的情况下对程序进行增强,如权限校验,日志记录,性能测试,事务控制。
二、aop的操作术语
Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象(要增强的类)
Weaving(织入):是把增强应用到目标的过程.把advice 应用到 target的过程
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
三、在spring中aop操作之HelloWorld
1.基于aspectj的xml配置
例如:测试程序运行时间
a.导入aop操作所需的jar包 在spring的配置文件中导入相关约束

b.配置aop操作的
<!--配置需要被加强的方法的对象以及用来加强类的对象--> <bean id="student" class="cn.Student"></bean> <bean id="strengthen" class="cn.strengthen"></bean> <!-- 2配置aop操作 --> <aop:config> <!-- 配置切入点 --> <aop:pointcut expression="execution(* cn.Student.study(..))" id="poitcutAdd" /> <!-- 配置切面(把增强用到方法上去) --> <aop:aspect ref="strengthen"> <!-- 指定增强类型 method:用那个方法来增强 pointcut-ref:被增强的切入点 --> <aop:before method="front1" pointcut-ref="poitcutAdd" /> <!--配置切入方式为环绕(环绕通知)--> <aop:around method="aroundFront" pointcut-ref="poitcutAdd" /> </aop:aspect> </aop:config>
c.student和strengthen类
public class Strengthen {
// ProceedingJoinPoint 用来执行被增强的方法
public void aroundFront(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable {
long f = System.currentTimeMillis();
// 执行被增强的方法
proceedingJoinPoint.proceed();
System.out.println("程序执行用时:" + (System.currentTimeMillis() - f));
}
}
public class Student {
public void study() {
System.out.println("测试方法");
}
}
2.基于aspectj的注解配置
//注解方式进行aop操作
@Aspect
public class Student {
@Before(value = "execution(* cn.mycookies.aop.Book.add(..))")
public void front1() {
System.out.println("前置增强");
}
@Around(value = "execution(* cn.mycookies.aop.Book.add(..))")
public void aroundFront(ProceedingJoinPoint proceedingJoinPoint)
throws Throwable {
long f = System.currentTimeMillis();
proceedingJoinPoint.proceed();
System.out.println("程序执行用时:" + (System.currentTimeMillis() - f));
}
}
四、在spring中使用开启事务有两种方式
1.基于xml配置文件的事务管理
<!-- 配置事务管理器-->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务增强-->
<tx:advice id="txadvice1" transaction-manager="dataSourceTransactionManager">
<!--做事务操作-->
<tx:attributes>
<!--设置进行事务操作的方法的匹配规则
name方法名ing propagation为隔离级别-->
<tx:method name="ZhuanZhang*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--配置切面-->
<aop:config>
<aop:pointcut
expression="execution(* cn.mycookies.service.CustomerService.*(..))"
id="pointcut1" />
<aop:advisor advice-ref="txadvice1" pointcut-ref="pointcut1" />
</aop:config>
2.基于配置文件和注解方式(简单)
<!--1 .配置事务管理器 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2.开启事务注解 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<!-- 3.在方法所在类上加上注解即可Transactional -->
Spring学习之AOP与事务的更多相关文章
- Spring学习之AOP的实现方式
Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...
- Spring 学习(五)--- 事务(未完成)
问题 : Spring 事务传播机制是怎么样的,在什么应用场景使用 事务是什么 我们使用的框架可能是Hibernate/JPA或者是Mybatis,都知道的底层是需要一个session/connect ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- spring学习(二) ———— AOP之AspectJ框架的使用
前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...
- spring学习(八)事务操作
一.事务的概念: 事务是并发控制的单位,一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做,所有操作必须成功完成,否则 ...
- Spring学习之AOP
Spring-AOP(Aspect-orented programming) 在业务流程中插入与业务无关的逻辑,这样的逻辑称为Cross-cutting concerns,将Crossing-cutt ...
- Spring学习之Aop的各种增强方法
AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的 ...
- spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)
在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...
- spring学习笔记-AOP
1.aop:aspect oriented programming 面向切面编程 2.aop在spring中的作用: 提供声明式服务(声明式事务) 允许用户实现自定义切面 3.aop:在不改变原有 ...
随机推荐
- 使用jquery-panzoom来实现图片或元素的放大缩小
1. html <div class="wrapper"> <a class="btn btn-md" ui-turn-off="A ...
- Java设计模式-合成模式
合成模式有时也叫组合模式,对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 "部分/ ...
- Mycat 介绍
Mycat 是什么 Mycat是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL客户端工具和命 ...
- JavaIO
1.字节流和字符流 在IO有两种数据传输格式一个是字符流还一个是字节流,但是字符流就会涉及到编码的问题. 一开始美国使用的自己的编码表就是ASCII表 中国的字符需要被识别也需要编码表于是就有了GB2 ...
- poj-1056-IMMEDIATE DECODABILITY(字典)
Description An encoding of a set of symbols is said to be immediately decodable if no code for one s ...
- 避免uncaughtException错误引起node.js进程崩溃
uncaughtException 未捕获的异常, 当node.js 遇到这个错误,整个进程直接崩溃. 或许这俩个人上辈子一定是一对冤家. 或许这俩个人经历了前世500次的回眸才换来了今生的相遇,只可 ...
- Redis --> Redis架构设计
Redis架构设计 一.前言 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列 ...
- ASCII十进制转字符串的方法
/// <summary> /// ASCII转字符串 /// </summary> /// <param name="asciiCode">A ...
- React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(二)
上一篇杂七杂八说了下express部分的,现在开始进入正题. 接下去的顺序,就是项目从零开始的顺序(思路方向). [actions定义] 如图,目录页,有4部分的内容,所以以下几个actions是需要 ...
- drbd(一):简介和安装
本文目录:1.drbd简介2.drbd工作原理和术语说明 2.1 drbd工作原理 2.2 drbd复制协议模型 2.3 drbd设备的概念 2.4 drbd资源角色 2.5 drbd工作模式 2.6 ...