一、概述

  在软件业,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与事务的更多相关文章

  1. Spring学习之AOP的实现方式

    Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...

  2. Spring 学习(五)--- 事务(未完成)

    问题 : Spring 事务传播机制是怎么样的,在什么应用场景使用 事务是什么 我们使用的框架可能是Hibernate/JPA或者是Mybatis,都知道的底层是需要一个session/connect ...

  3. Spring学习之AOP总结帖

    AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...

  4. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  5. spring学习(八)事务操作

    一.事务的概念: 事务是并发控制的单位,一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做,所有操作必须成功完成,否则 ...

  6. Spring学习之AOP

    Spring-AOP(Aspect-orented programming) 在业务流程中插入与业务无关的逻辑,这样的逻辑称为Cross-cutting concerns,将Crossing-cutt ...

  7. Spring学习之Aop的各种增强方法

    AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的 ...

  8. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  9. spring学习笔记-AOP

    1.aop:aspect oriented programming 面向切面编程 2.aop在spring中的作用:   提供声明式服务(声明式事务) 允许用户实现自定义切面 3.aop:在不改变原有 ...

随机推荐

  1. 【转载】Perl中的引用

    为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USAFrankfurt, Ger ...

  2. 数据库操作sql

    一.把从另外一张表里查到的值插入到前表: 1. 表结构完全一样 insert into 表1 select * from 表2 2. 表结构不一样(这种情况下得指定列名) insert into 表1 ...

  3. laravel-Policy步骤

    用户授权Policy 定义策略类 php artisan make:policy <name> 定义方法 注册策略类和模型关联 app > Providers > AuthSe ...

  4. POJ 1979 DFS

    题目链接:http://poj.org/problem?id=1979 #include<cstring> #include<iostream> using namespace ...

  5. Day4----------用户、群组、权限

    一.创建用户 命令:useradd 详细信息: root:x:0:0:root:/root:/bin/bash 总共七位 tom:x:500:500: :/home/tom:/bin/bash 1.r ...

  6. 【Darwin】 越狱后玩耍IPhone系统

    玩耍IOS系统 大家都知道IOS是自Mac OS修改而来的.而Mac OS和IOS的共同核心是Darwin,其基于FreeBSD发展而来,整体而言也是个类Unix系统.之前把自己的手机越狱之后正好开始 ...

  7. (工具类)double类型数据运算

    package com.flf.util;import java.math.BigDecimal;/** * double类型数据运算 * @author Yancy 2016-12-14 * */p ...

  8. echarts地图的引用

    最近是跟echarts杠上了 所在公司是搞数据的 所以身为前端的我 就必须使用echarts将数据展示出来 ,进公司一周 ,前前后后大概用了八九种echarts图,我举得最难的就是引用的地图,因为刚开 ...

  9. 《团队-手机app便签-开发文档》

    项目托管平台地址:https://github.com/Vcandoit/Notepad.git 我主要负责文件存储部分,文字部分使用sqlite保存. 因为我们想实现备忘录记录照片.语音的功能,所以 ...

  10. Beta冲刺 第一天

    Beta冲刺 第一天 1. 昨天的困难 由于今天还是第一天,所以暂时没有昨天的困难. 2. 今天解决的进度 潘伟靖: 对代码进行了review 1.将某些硬编码改为软编码 2.合并了一些方法,简化代码 ...