Spring AOP简介及相关案例

这篇具有很好参考价值的文章主要介绍了Spring AOP简介及相关案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、Spring AOP简介

二、AOP相关术语

三、AOP入门案例

1. 引入依赖

2. 编写连接点

3. 编写通知类

4. 配置切面

5. 测试 

四、通知类型

1. 编写通知方法

2. 配置切面

3. 测试

五、切点表达式

六、多切面配置 

1. 编写发送邮件的通知

2. 配置切面

3. 测试 

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章 


一、Spring AOP简介

        AOP的全称是Aspect Oriented Programming,即面向切面编程。是实现功能统一维护的一种技术,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。

  • 作用:在不修改源码的基础上,对已有方法进行增强。实现原理:动态代理技术。
  • 优势:减少重复代码、提高开发效率、维护方便
  • 应用场景:事务处理、日志管理、权限控制、异常处理等方面。

二、AOP相关术语

Spring AOP简介及相关案例

 为了更好地理解AOP,就需要对AOP的相关术语有一些了解

名称 说明
Joinpoint(连接点) 指能被拦截到的点,在Spring中只有方法能被拦截。
Pointcut(切点) 指要对哪些连接点进行拦截,即被增强的方法。
Advice(通知) 指拦截后要做的事情,即切点被拦截后执行的方法。
Aspect(切面) 切点+通知称为切面
Target(目标) 被代理的对象
Proxy(代理) 代理对象
Weaving(织入) 生成代理对象的过程

三、AOP入门案例

AspectJ是一个基于Java语言的AOP框架,在Spring框架中建议使用AspectJ实现AOP。
接下来我们写一个AOP入门案例:dao层的每个方法结束后都可以打印一条日志:

1. 引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
    </dependencies>

2. 编写连接点

package com.example.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    public void add(){
        System.out.println("用户新增");
    }
    public void delete(){
        System.out.println("用户删除");
    }
    public void update(){
        System.out.println("用户修改");
    }
}

3. 编写通知类

package com.example.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

public class MyAspectJAdvice {
    // 后置通知
    public void myAfterReturning(JoinPoint joinPoint){
        System.out.println("切点方法名:"+joinPoint.getSignature().getName());
        System.out.println("目标对象:"+joinPoint.getTarget());
        System.out.println("打印日志···"+joinPoint.getSignature().getName()+"方法被执行了!");    }
}

4. 配置切面

bean.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!-- 扫描包 -->
        <context:component-scan base-package="com.example"/>
        <!-- 通知对象 -->
        <bean id="myAspectJAdvice" class="com.example.aspect.MyAspectJAdvice"/>
        <!-- 配置AOP -->
        <aop:config>
            <!-- 配置切面 -->
            <aop:aspect ref="myAspectJAdvice">
                <!-- 配置切点 -->
                <aop:pointcut id="myPointcut" expression="execution(* com.example.dao.UserDao.* (..))"/>
                <!-- 配置后置通知 -->
                <aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/>
            </aop:aspect>
        </aop:config>
  </beans>

5. 测试 

import com.example.SpringConfig;
import com.example.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDaoTest {
    @Test
    public void testAdd(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        UserDao userDao = (UserDao) ac.getBean("userDao");
        userDao.add();
    }
    @Test
    public void testDelete(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        UserDao userDao = (UserDao) ac.getBean("userDao");
        userDao.delete();
    }
}

运行结果分别为

Spring AOP简介及相关案例

 Spring AOP简介及相关案例

Spring AOP简介及相关案例  

OK,确实是可以的,本次入门案例就学习到这里了。 

四、通知类型

 AOP有以下几种常用的通知类型:

通知类型 描述
前置通知 在方法执行前添加功能
后置通知 在方法正常执行后添加功能
异常通知 在方法抛出异常后添加功能
最终通知 无论方法是否抛出异常,都会执行该通知
环绕通知 在方法执行前后添加功能

1. 编写通知方法

    // 前置通知
    public void myBefore(){
        System.out.println("前置通知···");
    }

    // 异常通知
    public void myAfterThrowing(Exception e){
        System.out.println("异常通知···");
        System.out.println(e.getMessage());
    }

    // 最终通知
    public void myAfter(){
        System.out.println("最终通知···");
    }

    // 环绕通知
    public Object myAround(ProceedingJoinPoint point) throws Throwable {
        System.out.println("环绕前···");
        // 执行方法
        Object obj = point.proceed();
        System.out.println("环绕后···");
        return obj;
    }

2. 配置切面

        <!-- 配置AOP -->
        <aop:config>
            <!-- 配置切面 -->
            <aop:aspect ref="myAspectJAdvice">
                <!-- 配置切点 -->
                <aop:pointcut id="myPointcut" expression="execution(* com.example.dao.UserDao.* (..))"/>
                <!-- 配置后置通知 -->
                <aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut"/>
                <!-- 前置通知 -->
                <aop:before method="myBefore" pointcut-ref="myPointcut"/>
                <!-- 异常通知 -->
                <aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointcut" throwing="e"/>
                <!-- 最终通知 -->
                <aop:after method="myAfter" pointcut-ref="myPointcut"/>
                <!-- 环绕通知 -->
                <aop:around method="myAround" pointcut-ref="myPointcut"/>
            </aop:aspect>
        </aop:config>

3. 测试

OK,这里我们测试用户新增方法 ,确实是得出来我们想要的结果了

Spring AOP简介及相关案例

五、切点表达式

切点表达式:访问修饰符 返回值 包名.类名.方法名(参数列表)

  • 使用AspectJ需要使用切点表达式配置切点位置,写法如下:
  • 标准写法:访问修饰符 返回值 包名.类名.方法名(参数列表)
  • 访问修饰符可以省略。
  • 返回值使用 * 代表任意类型。
  • 包名使用 * 表示任意包,多级包结构要写多个 * ,使用 *.. 表示任意包结构
  • 类名和方法名都可以用 * 实现通配。

参数列表

  • 基本数据类型直接写类型
  • 引用类型写 包名.类名
  • * 表示匹配一个任意类型参数
  • .. 表示匹配任意类型任意个数的参数

全通配: * *..*.*(..)

六、多切面配置 

        我们可以为切点配置多个通知,形成多切面,比如希望dao层的每个方法结束后都可以打印日志并发送邮件:

1. 编写发送邮件的通知

package com.example.aspect;

import org.aspectj.lang.JoinPoint;

public class MyAspectJAdvice2 {
    // 后置通知
    public void myAfterReturning(JoinPoint point){
        System.out.println("发送邮件···");
    }
}

2. 配置切面

在上面的基础上配置多一个切面即可

    <aop:aspect ref="myAspectJAdvice2">
         <aop:pointcut id="myPointcut2" expression="execution(* com.example.dao.UserDao.*(..))"/>
         <aop:after-returning method="myAfterReturning" pointcut-ref="myPointcut2"/>
    </aop:aspect>

3. 测试 

Spring AOP简介及相关案例

        OK,确实是打印了发送邮件,因此该多切面配置成功,下面接着讲解用另外几种方法实现AOP ,让我们一起学习啪

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。文章来源地址https://www.toymoban.com/news/detail-465499.html

1. Maven系列专栏文章

Maven系列专栏 Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏 MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章 

Spring系列专栏 Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

到了这里,关于Spring AOP简介及相关案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring AOP 代码加案例详解

    学习AOP就要先学习代理模式,这样AOP的学习就简单了。 代理模式是Java常见的设计模式之一,包含:静态代理和动态代理。 静态代理 通过案例感受静态代理:租房子问题。 房东需要将房子出租,如果都亲力亲为太麻烦了:房东要自己出去贴广告,带租客看房,讨价还价,签

    2024年02月01日
    浏览(31)
  • spring之AOP的概念及简单案例

    AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例

    2024年02月05日
    浏览(36)
  • 【Spring教程21】Spring框架实战:Spring事务简介、AOP事务管理、代码示例全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《AOP(面对切面编程)知识总结》 事务作用:在数据层保障一系列的数据库

    2024年02月04日
    浏览(44)
  • 注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】

    目录 一、注解配置AOP 1. 开启注解支持 2. 在类和方法加入注解 3. 测试 4.  为一个类下的所有方法统一配置切点 二、原生Spring实现AOP 1. 引入依赖 2. 编写SpringAOP通知类 3. 编写配置类bean2.xml 4  测试 三、SchemaBased实现AOP 1. 配置切面 2. 测试 往期专栏文章相关导读  1. Maven系列专栏

    2024年02月08日
    浏览(45)
  • 【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战

                                                 💧 S p r i n g A O P + 主从数据源切换 + 读写分离 + 自定义注解案例实战! color{#FF1493}{Spring AOP + 主从数据源切换 + 读写分离 + 自定义注解 案例实战!} Sp r in g A OP + 主从数据源切换 + 读写分离 + 自定义注解案例

    2024年02月15日
    浏览(37)
  • Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

    开篇: 欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式)。 概念 什么是AOP (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的

    2024年01月24日
    浏览(45)
  • Spring MVC简介附入门案例

    目录   一、SpringMVC简介 1.1 MVC模型 1.2 SpringMVC 二、SpringMVC入门案例 2.1 创建项目 2.2 引入依赖和tomcat插件 2.3 修改web.xml文件  2.4 新建springmvc.xml文件 2.5 编写控制器  2.6 配置运行方式 2.7 运行测试  三、SpringMVC执行流程 3.1 SpringMVC的组件 3.2 组件的工作流程 往期专栏文章

    2024年02月09日
    浏览(54)
  • 【Spring教程30】Spring框架实战:从零开始学习SpringMVC 之 Rest风格简介与RESTful入门案例

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《SpringMVC 之 服务器响应》 REST(Representational State Transfer),表现形式状态转

    2024年02月04日
    浏览(50)
  • AOP简介

    问题1:AOP的作用是什么? 问题2:连接点和切入点有什么区别,二者谁的范围大? 问题3:请描述什么是切面? AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象编程 作用:在不惊动原始设计的基础上为其

    2024年02月12日
    浏览(26)
  • AOP案例-记录日志操作

    目录 案例 操作日志 思路分析 步骤 准备 编码 将案例中的增删改接口的操作日志记录到数据表中 操作日志 日志信息包括:操作人、操作时间、执行方法的全类名、执行方法名、方法运行时的参数、返回值、犯法运行时长。 思路分析 需要对于所有业务类中的增删改查方法统

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包