Spring框架--AOP

1、AOP (面向切面编程)          AOP为Aspect Oriented Programming的缩写,意为:面向切面编程    通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术    AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型    利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
    AOP 思想:横向重复、纵向抽取  
2、底层实现: Spring 的 AOP 的底层用到两种代理机制:       JDK 的动态代理:针对实现了接口的类产生代理    Cglib 的动态代理:针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术 生成当前类的子类对象

3、AOP 的开发中的相关术语:
    Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点(可以被切入的点)
    Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。(已经被切入的点)
    Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
    Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态地添加一些方法或 Field。
    Aspect(切面):是切入点和通知(引介)的结合
    Target(目标对象):代理的目标对象
    Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类。
    Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。

4、 示例的项目结构:

   

  4.1使用XML配置

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <!-- 目标对象 -->
    <bean name="userService" class="com.roxy.spring.service.UserServiceImpl"></bean>

    <!-- 通知对象 -->
    <bean name="transactionAdvice" class="com.roxy.spring.advice.TransactionAdvice"></bean>

    <!-- 将通知对象织入目标对象 -->
    <aop:config>
        <!-- 选择切入点 -->
        <aop:pointcut expression="execution(* com.roxy.spring.service..*ServiceImpl.*(..))" id="pointcut"/>
        <!-- 选择切入时机 -->
        <aop:aspect ref="transactionAdvice">
            <aop:before method="before" pointcut-ref="pointcut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut"/>
            <aop:after method="after" pointcut-ref="pointcut"/><!-- 无论是否出现异常都会调用 -->
            <!--<aop:around method="around" pointcut-ref="pointcut"/>
            <aop:after-throwing method="afterException" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>
public interface UserService {

    public void save();

    public void delete();

    public void update();

    public void select();
}
public class UserServiceImpl implements UserService{

    @Override
    public void save() {
        System.out.println("保存用户");
    }
    @Override
    public void delete() {
        System.out.println("删除用户");
    }
    @Override
    public void update() {
        System.out.println("更新用户");
    }
    @Override
    public void select() {
        System.out.println("查询用户");
    }
}
public class TransactionAdvice {

    public void before() {
        System.out.println("前置通知被执行");
    }

    public void afterReturning() {
        System.out.println("后置通知被执行(出现异常不调用)");
    }

    public void after() {
        System.out.println("后置通知被执行(无论是否出现异常都会调用)");
    }

    public void afterException() {
        System.out.println("异常通知被执行");
    }

    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("around_before");
        Object proceed = point.proceed();//调用目标方法
        System.out.println("around_after");
        return proceed;
    }
}

  4.2 使用注解

    <!-- 目标对象 -->
    <bean name="userService" class="com.roxy.spring.service.UserServiceImpl"></bean>

    <!-- 通知对象 -->
    <bean name="transactionAdvice" class="com.roxy.spring.advice.TransactionAdvice"></bean>

    <!-- 开启织入注解 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect //该类为切面
public class TransactionAdvice {

    @Pointcut(value="execution(* com.roxy.spring.service..*ServiceImpl.*(..))")
    public void PointCut(){}

    @Before("TransactionAdvice.PointCut()")
    public void before() {
        System.out.println("前置通知被执行");
    }

    @AfterReturning("TransactionAdvice.PointCut()")
    public void afterReturning() {
        System.out.println("后置通知被执行(出现异常不调用)");
    }

    @After("TransactionAdvice.PointCut()")
    public void after() {
        System.out.println("后置通知被执行(无论是否出现异常都会调用)");
    }

    @AfterThrowing("TransactionAdvice.PointCut()")
    public void afterException() {
        System.out.println("异常通知被执行");
    }

    @Around("TransactionAdvice.PointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("around_before");
        Object proceed = point.proceed();//调用目标方法
        System.out.println("around_after");
        return proceed;
    }
}

5、5种通知的调用顺序

console:      around_before
    前置通知被执行
    保存用户
    around_after
    后置通知被执行(无论是否出现异常都会调用)
    后置通知被执行(出现异常不调用)

result:        环绕通知 --> 前置通知 --> 调用方法 --> 环绕通知 --> 后置通知(after) --> 后置通知(afterException)

6、AOP中的正则表达式

aop配置切点的正则表达式
.       匹配除换行外的所有单个字符
*       匹配前面的字符0次或多次
+       匹配前面的字符1次或多次
?       匹配前面的字符0次或1次
^       匹配字符串开始
$       匹配字符串结束
x|y     匹配x或y
[xyz]    zyx其中一个
{n}     匹配n次
{n,}    匹配至少n次
{n,m}    匹配n次到m次
\    转意字符
时间: 2024-10-11 00:57:29

Spring框架--AOP的相关文章

跟着刚哥学习Spring框架--AOP(五)

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各

Spring框架AOP源码剖析

今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西的源码剖析,作为多年的开发者,想必大家在面试的时候都被问过,你知道Spring框架AOP的底层实现机制吗,这可是很简单的噢,我们会说,如果某个类有接口就使用JDK动态代理,没有接口就用CGLIB动态代理,并且Spring也提供了可配置开关,不管有无接口都一律使用CGLIB动态代理,例如 <aop:aspectj-autoproxy proxy-target-class="true"/&

spring框架 AOP核心详解

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around

Spring框架AOP的使用及个人对底层原理的理解

Spring框架AOP的使用及个人对底层原理的理解**** 前言: AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,今天要给大家分享的是Spring框架AOP的使用,以及我个人对底层原理的一些理解. Aop使用步骤 配置aop信息 <aop:config> 相当于aop的根节点 配置切入点 <aop:piontcut> 切入点 可以理解为需要增强的方法

Spring框架 AOP(三)

AOP理论概述 Aspect Oriented Programming 面向切面编程 业界 AOP 实际上 OOP (面向对象编程 ) 延伸 -- OOP编程语言. AOP设计思想 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) 横向抽取代码复用,基于代理技术,在不修改原有对象代码情况下,对原有对象方法功能进行增强! ---- AOP 思想 Spring框架如何实现AOP Spring1.2 版本开始 开始支持AOP技术 (传统Spring AOP

Spring框架Aop详解

一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnblogs.com/xrq730/p/4919025.html AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次

Spring框架——AOP(面向切面编程)详解

 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充. ●AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点. ●在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类.这样一来横切关注点就被模块化到特殊的类里--这样的类我们通常称之为"切面".

Spring框架AOP使用扩展

一.什么是AOP 1.将复杂的需求分解出不同的方面,将散布在系统汇中的公共功能集中解决: 2.采用代理机制组装起来运行,再不改变原程序的基础上对代码段进行增强处理,增加新的功能: 3.默认采取的是JDK动态代理,面向接口编程的动态代理. 二.案例 接下来我们通过具体案例对AOP进一步了解 1.创建UserInfo实体类 package com.spring.entity; public class UserInfo { private Integer u_id; private String u

Spring框架-AOP原理

定义:面向切面编程,所谓面向切面编程,是一种通过预编译的方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的技术. AOP中比较重要的七个术语: 增强处理(ADVICE) 前置增强 后置增强 环绕增强.异常抛出增强.最终增强等类型 切入点 连接点 切面 目标对象 AOP代理 织入 原文地址:https://www.cnblogs.com/dongyaotou/p/12114749.html