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:在不改变原有 ...
随机推荐
- susmote个人网站博客论坛(TexTec | 关注互联网技术,传播极客精神)
网站地址 www.susmote.com www.textec.club 欢迎您的访问
- Spring Boot应用的后台运行配置
酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...
- Java中==与equals()的区别
声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...
- 如何在mac上搭建sqli-labs
近期想学习sql注入,但是一来网络上的资料参差不齐,难以系统的学习:二来随着程序员安全意识的提高,这种完全可以避免的注入漏洞越来越少见了,所以难以找一个合适的网站练手,于是乎,sqli-labs这种实 ...
- Beta No.6
今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...
- cpp常用函数总结
//sprintf sprintf(temp_str_result, "%lf", temp_double); result = temp_str_result; (*begin) ...
- Twisted 延迟调用
延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制 1.基本使用 defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函 ...
- java unicode和字符串间的转换
package ykxw.web.jyf; /** * Created by jyf on 2017/5/16. */ public class unicode { public static voi ...
- 几种Java的JSON解析库速度对比
java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去 ...
- [USACO13JAN] Seating
https://www.luogu.org/problem/show?pid=3071 题目描述 To earn some extra money, the cows have opened a re ...