返回顶部
首页 > 资讯 > 后端开发 > Python >SpringAOP 设置注入的实现步骤
  • 121
分享到

SpringAOP 设置注入的实现步骤

2024-04-02 19:04:59 121人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录aop_面向切面编程初步了解简单介绍详细说明spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件,需要添加第三方约束创建一个测试类测试运

AOP_面向切面编程初步了解

让我们先想象一个场景,你正在编写一个项目,在开发过程中的多个模块都有某段重复的代码,于是你选择将其抽象成一个方法,然后在需要的地方调用这个方法,当需要修改这段代码时只需要修改这个方法就行。有一天,你的Boss给了新的需求,需要再抽象出一个方法,然后再在各个需要这个方法的模块调用这个方法,这可能就让你头疼了,需要修改大量的代码,于是会想,能不能不修改源代码为系统业务添加某种功能呢?幸运的是,AOP可以很好的解决这个问题。

简单介绍

AOP:保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能,本质是由AOP框架修改业务组件的多个方法的源代码,我们将其分为两类:

  • 静态AOP

AOP 框架在编译阶段对程序源代码进行修改,生成了静态的 AOP 代理类(生成的*.class文件已经被改掉了,需要使用特定的编译器),比如 AspectJ。

  • 动态AOP:

AOP 框架在运行阶段对动态生成代理对象(在内存中以 jdk 动态代理,或 CGlib 动态地生成 AOP 代理类),如 SpringAOP。

详细说明

Spring 的通知类型

名称 标签 说明
前置通知 < aop:before > 用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知 < aop:after-returning > 用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知 < aop:around > 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常通知 < aop:throwing > 用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知 < aop:after > 用于配置最终通知。无论增强方式执行是否有异常都会执行

实战演练

导入依赖包


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- Https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

创建一个增强类以及其接口

增强类接口:


public interface VisitService {
    //用于实现前置通知,后置通知,异常通知,最终通知
    void visit(String str) throws Exception;

    //用于实现环绕通知
    void around();
}

增强类:


public class VisitServiceImpl implements VisitService {
    //前置,后置,最终,异常通知的增强类
    public void visit(String str) throws Exception{
        System.out.println(str);
        if(!str.equalsIgnoreCase("agree")){
            throw new Exception("非法访问");
        }
    }
    //环绕通知的增强类
    public void around() {
        System.out.println("环绕通知");
    }
}

创建一个切面类


public class VisitAspect {
    //前置通知
    public void visitBefore(JoinPoint joinPoint){
        System.out.println("口令:");
    }
    //最终通知,无论是否报错,都执行
    public void visitAfter(JoinPoint joinPoint){
        System.out.println("输入完成");
    }
    //后置通知报错不执行
    public void visitSuccess(JoinPoint joinPoint){
        System.out.println("请求成功,欢迎");
    }
    //异常通知,报错后执行
    public void visitThrow(JoinPoint joinPoint, Throwable ex){
        System.out.println("请求失败,拒绝");
    }
    //环绕通知,如果报错只执行前一句
    public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("-------环绕-------");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("-------环绕-------");
        return obj;
    }
}

配置xml文件,需要添加第三方约束


    <bean id="userDao" class="Spring_AOP.service.impl.VisitServiceImpl"></bean>
    <bean id="aspect" class="Spring_AOP.service.VisitAspect"></bean>
    
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))"/>
        <aop:pointcut id="pointcut1" expression="execution(* Spring_AOP.service.impl.VisitServiceImpl.around())"/>
        <aop:aspect ref="aspect">
             <aop:before method="visitBefore" pointcut-ref="pointcut"></aop:before>
             <aop:after method="visitAfter" pointcut-ref="pointcut"></aop:after>
             <aop:after-returning method="visitSuccess" pointcut-ref="pointcut"></aop:after-returning>
             <aop:around method="visitAround" pointcut-ref="pointcut1"></aop:around>
             <!-- 报错后执行aop:after-throwing -->
             <aop:after-throwing method="visitThrow" pointcut-ref="pointcut" throwing="ex"></aop:after-throwing>
         </aop:aspect>
    </aop:config>

注,对于execution()
1、execution(): 表达式主体 (必须加上execution)。
2、第一个* 号:表示返回值类型,* 号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,cn.smd.service.impl包、子孙包下所有类的方法。
4、第二个* 号:表示类名,* 号表示所有的类。
5、* (..):最后这个星号表示方法名,* 号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
书写的注意事项:execution(* cn.smd.service.impl..(..))

创建一个测试类


 public class visitTest {
    @Test
    public void VisitTest(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext_AOP.xml");
        VisitService visitService = app.getBean(VisitService.class);
        try {
            visitService.visit("agree");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            visitService.visit("ok");
        } catch (Exception e) {
            e.printStackTrace();
        }
        visitService.around();
    }
}

测试运行

口令:
agree
请求成功,欢迎
输入完成
口令:
ok
请求失败,拒绝
输入完成
-------环绕-------
环绕通知
-------环绕-------

总结

  • SpringAOP进一步降低组件的耦合,实现解耦合
  • 可以更好的监控程序,进行权限拦截
  • 注:学习AOP设置注入时需要注意出现报错时各个通知的状态

以上就是SpringAOP 设置注入的实现步骤的详细内容,更多关于SpringAOP 设置注入的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringAOP 设置注入的实现步骤

本文链接: https://lsjlt.com/news/125287.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringAOP 设置注入的实现步骤
    目录AOP_面向切面编程初步了解简单介绍详细说明Spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件,需要添加第三方约束创建一个测试类测试运...
    99+
    2024-04-02
  • SpringAOP 构造注入的实现步骤
    目录AOP_面向切面编程初步了解简单介绍详细说明Spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件创建一个测试类测试运行总结AOP_面向切...
    99+
    2024-04-02
  • sqlserver设置主键的实现步骤
    目录开始之前限制和局限设置主键并置为非空更改已经建好的表中主键列的字符类型开始之前 限制和局限 一个表只能包含一个 PRIMARY KEY 约束。在 PRIMARY KEY 约束中定义的所有列都必须定义为 NO...
    99+
    2023-10-19
    sqlserver设置主键 sqlserver 主键
  • 3-1SQL注入网站实例:注入步骤
    在第三部分,我们主要是详细的给大家演示,如何对一个网站进行SQL注入入侵的,这个入侵过程中,它是如何发现注入点的,发现和测试注入点之后,我们要如何来获得爆库、爆表、爆密码,甚至控制后台,一旦获得网站控...
    99+
    2023-09-14
    数据库 服务器 mysql
  • SpringAOP实现日志收集管理功能(步骤详解)
    第一步引入必要的依赖 <dependency> <groupId>org.springframework.boot</grou...
    99+
    2024-04-02
  • MYSQL数据库主从同步设置的实现步骤
    目录为什么要主从同步?主从同步的原理MYSQL数据库进行主从同步创建两个MYSQL数据库初始化,安装主机数据库配置从机测试主从同步为什么要主从同步? 1、读写分离 主从同步分为一个主...
    99+
    2024-04-02
  • 基于Nginx实现HTTPS网站设置的步骤
    目录前言:加密算法:一、HTTPS 简介二、Nginx 实现 HTTPS 网站设置1.安装 Nginx2.创建服务器证书密钥文件3.创建服务器证书的申请文件4.生成证书文件5.修改 ...
    99+
    2024-04-02
  • JupyterLab设置切换虚拟环境的实现步骤
    在进行数据科学任务时,一般会用到交互式开发环境,即Jupyter Notebook,Jupyter lab是Jupyter Notebook的升级版,功能更强大、更好用,但是默认情况...
    99+
    2023-02-08
    Jupyter Lab设置虚拟环境 Jupyter Lab虚拟环境
  • ubuntu20.04配置mysql8.0的实现步骤
    目录1 安装1.1 下载1.2 安装1.3 安装mysql Server1.4常用命令2 配置外网访问2.1 查看端口2.2修改配置文件2.3 修改root密码2.4修改用户安装过程询问一般 y 就可以了 1 安装 1....
    99+
    2023-05-05
    ubuntu20.04配置mysql8.0 ubuntu配置mysql
  • win10设置默认输入法的步骤教程
    win10系统已经发布好几年了,不知不觉中各个方面也已经相当完善了。但是,为什么设置默认输入法就那么难呢?那是因为你没遇到我呀。请大家一起来看看,今天小编将为大家介绍如何设置win10的默认输入法步骤教程。1、首先打开控制面板,然后在“控制...
    99+
    2023-07-11
  • Android 添加系统设置属性的实现及步骤
    Android 添加系统设置属性的实现及步骤Android源码开发中,常常要用到一些全局标志或者说变量,这时候我们可以给android系统添加自己想要的属性。 整个android系统都能访问的属性;该属性值永久保存; 那么我们可以...
    99+
    2023-05-30
    android 设置属性 roi
  • SpringBoot项目接入Nacos的实现步骤
    目录前言maven依赖Nacos配置中心配置文件动态配置Nacos服务发现配置文件使配置生效结果前言 项目中没有使用nacos官方提供的方式使用SpringBoot的集成方式来进行集...
    99+
    2024-04-02
  • vue中引入高德地图并多点标注的实现步骤
    vue中引入高德地图并多点标记 步骤: 通过vue的方法引入地图初始化地图,设置宽和高信息窗口实例遍历生成多个标记点 首先在项目的public下的index.html中引入地图 &l...
    99+
    2024-04-02
  • MyBatis实现配置加载的步骤
    目录前言正文总结前言 在原始MyBatis的使用中,使用MyBatis时会先读取配置文件mybatis-config.xml为字符流或者字节流,然后通过SqlSessionFacto...
    99+
    2023-05-19
    MyBatis 配置加载
  • PHP.ini修改编码设置的步骤与注意事项
    PHP.ini 修改编码设置的步骤与注意事项 PHP是一种强大的服务器端脚本语言,广泛应用于Web开发领域。在PHP开发过程中,经常需要处理不同编码格式的数据,因此正确设置编码是非常重...
    99+
    2024-04-02
  • SpringBoot启动嵌入式Tomcat的实现步骤
    目录Spring Boot中Web容器相关接口WebServerServletWebServerFactoryWebServerFactoryCustomizerBeanPostPr...
    99+
    2024-04-02
  • springboot项目组引入JMeter的实现步骤
    目录一、前言二、springboot项目引入JMeter完成接口自动化操作一、前言 看到标题的小伙伴肯定很好奇,springboot项目中用JMeter能干什么,那么我先反问你JM...
    99+
    2024-04-02
  • Mysql8导入数据到Mysql5.7的实现步骤
    目录序修改xx.sql文件的字符集和排序规则直接修改数据库和表的字符集和排序规则修改数据库字符集和排序规则修改表字符集和排序规则通过Navicat将MySQL8.0导入到MySQL5...
    99+
    2024-04-02
  • Opencv下载和导入Visualstudio2022的实现步骤
    目录1.opencv下载地址2.Visual studio 2022下载参考教程3.导入Visual studio 2022步骤1.opencv下载地址 https://www.ra...
    99+
    2024-04-02
  • Maven导入本地jar包的实现步骤
    目录1、 在本地maven仓库安装本地jar包2、把本地jar包放在项目的某个目录中3、使用scope system依赖参考资料软件项目管理和发布工具Maven给java的开发带来了...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作