一、概述

  在软件业,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. python web开发-flask中日志的使用

    Flask使用日志记录的方式: 初始化flask应用实例 在flask中使用logger,需要初始化一个flask的应用 app = Flask(__name__) 2. 调用logger 直接调用l ...

  2. struts2基于注解配置action

    如果使用struts2,就需要配置文件或者注解,关于struts2的配置文件struts.xml非常熟悉,对于注解可能spring使用的比较多.配置文件的繁琐衬托出了注解的简洁方便,一条或者几条注解解 ...

  3. websocket使用指南

    前言 最近在一个项目中,需要使用到websocket,之前对websocket不是很了解,于是就花了一点时间来熟悉websocket. 在浏览器与服务器通信间,传统的 HTTP 请求在某些场景下并不理 ...

  4. POJ1331 Multiply(strtol函数练习)

    题目链接:http://poj.org/problem?id=1331 主要介绍strtol函数: long int strtol(const char *nptr,char **endptr,int ...

  5. html-简单的简历表制作

    代码如下: <!DOCTYOE html> <html> <head> <meta charset='UTF-8'/> <title>课后作 ...

  6. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  7. 个人作业Week3-案例分析

    DeadLine:2017.10.13 23:00 声明:本作业以邹欣老师博客 http://www.cnblogs.com/xinz/archive/2012/03/26/2417699.html ...

  8. Flask 扩展 国际化 本地化

    pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask.ext.babel import Bab ...

  9. Bate测试报告

    1 测试中找出的bug Bug类型 总数 描述 修复的bug 10 1.注册成功并没有直接跳转到登录页面: 2.学校地区无限制,数字也可以: 3.虽然相同用户名不能注册,但是只是显示,注册失败,却没有 ...

  10. 详谈C++虚函数表那回事(多重继承关系)

    上一篇说了一般继承,也就是单继承的虚函数表,接下来说说多重继承的虚函数表: 1.无虚函数覆盖的多重继承: 代码: #pragma once //无覆盖,多重继承 class Base1 { publi ...