广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringAOP 构造注入的实现步骤
  • 898
分享到

SpringAOP 构造注入的实现步骤

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

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

摘要

目录aop_面向切面编程初步了解简单介绍详细说明spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件创建一个测试类测试运行总结AOP_面向切

AOP_面向切面编程初步了解

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

简单介绍

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

  • 静态AOP

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

  • 动态AOP:

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

详细说明

Spring 的通知类型

名称 标签 说明
前置通知 @Before 用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知 @AfterReturning 用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知 @Around 用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常通知 @AfterThrowing 用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知 @After 用于配置最终通知。无论增强方式执行是否有异常都会执行
切面类注解 @Aspect 标注该当前类是一个切面类
断点注解 @Pointcut 使用一个返回值为 void 、方法体为空的方法来命名切入点

实战演练

导入依赖包


    <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("环绕通知");
    }
}

创建一个切面类


@Component("VisitAspect")
@Aspect //标注当前myAspect是一个切面类
public class VisitAspect_anno {
    // 定义切入点表达式
    // 使用一个返回值为 void 、方法体为空的方法来命名切入点
    @Pointcut("execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))")
    private void v1() {
    }

    //前置通知
    @Before("v1()")
    public void visitBefore(JoinPoint joinPoint) {

        System.out.println("口令:");
    }

    @After("v1()")
    //最终通知,无论是否报错,都执行
    public void visitAfter(JoinPoint joinPoint) {
        System.out.println("输入完成");
    }

    @AfterReturning("v1()")
    //后置通知报错不执行
    public void visitSuccess(JoinPoint joinPoint) {
        System.out.println("请求成功,欢迎");
    }

    @AfterThrowing(value = "v1()",throwing = "ex")
    //异常通知,报错后执行
    public void visitThrow(JoinPoint joinPoint, Throwable ex) {
        System.out.println("请求失败,拒绝");
    }

    @Around("execution(* Spring_AOP.service.impl.VisitServiceImpl.around())")
    //环绕通知,如果报错只执行前一句
    public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("-------环绕-------");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("------------------");
        return obj;
    }
}

配置xml文件


    <!-- 基于注解的声明式 AspectJ -->
    <context:component-scan base-package="Spring_AOP" />
    <!-- 启动基于注解的声明式 AspectJ 支持一 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

创建一个测试类


 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
请求失败,拒绝
输入完成
-------环绕-------
环绕通知
-------环绕-------

总结

使用构造注入可以更方便的实现AOP模式,但是同样与设置注入相比各有千秋。
以上就是以注解实现SpringAOP框架构造注入的实现,如有错误,麻烦指出,感谢耐心到现在的朋友ᕕ( ᐛ )ᕗ

到此这篇关于SpringAOP_构造注入的实现步骤的文章就介绍到这了,更多相关SpringAOP_构造注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringAOP 构造注入的实现步骤

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringAOP 构造注入的实现步骤
    目录AOP_面向切面编程初步了解简单介绍详细说明Spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件创建一个测试类测试运行总结AOP_面向切...
    99+
    2022-11-12
  • SpringAOP 设置注入的实现步骤
    目录AOP_面向切面编程初步了解简单介绍详细说明Spring 的通知类型实战演练导入依赖包创建一个增强类以及其接口创建一个切面类配置xml文件,需要添加第三方约束创建一个测试类测试运...
    99+
    2022-11-12
  • golang构建HTTP服务的实现步骤
    目录HTTPHandlerServeMuxServer创建HTTP服务 http注册路由开启监听处理请求 参考:   一个go最简单的Http服务器程序 package main...
    99+
    2022-11-12
  • vue中引入高德地图并多点标注的实现步骤
    vue中引入高德地图并多点标记 步骤: 通过vue的方法引入地图初始化地图,设置宽和高信息窗口实例遍历生成多个标记点 首先在项目的public下的index.html中引入地图 &l...
    99+
    2022-11-13
  • SpringBoot项目接入Nacos的实现步骤
    目录前言maven依赖Nacos配置中心配置文件动态配置Nacos服务发现配置文件使配置生效结果前言 项目中没有使用nacos官方提供的方式使用SpringBoot的集成方式来进行集...
    99+
    2022-11-12
  • 使用roolup构建你的lib(实现步骤)
    概述 Rollup, 和 Webpack, Parcel 都是模块打包工具(module bundler tool), 但是侧重点不同, 我们要聊的 Rollup更加适合用于构建li...
    99+
    2022-11-12
  • SpringBoot启动嵌入式Tomcat的实现步骤
    目录Spring Boot中Web容器相关接口WebServerServletWebServerFactoryWebServerFactoryCustomizerBeanPostPr...
    99+
    2022-11-12
  • springboot项目组引入JMeter的实现步骤
    目录一、前言二、springboot项目引入JMeter完成接口自动化操作一、前言 看到标题的小伙伴肯定很好奇,springboot项目中用JMeter能干什么,那么我先反问你JM...
    99+
    2022-11-12
  • Opencv下载和导入Visualstudio2022的实现步骤
    目录1.opencv下载地址2.Visual studio 2022下载参考教程3.导入Visual studio 2022步骤1.opencv下载地址 https://www.ra...
    99+
    2022-11-13
  • Maven导入本地jar包的实现步骤
    目录1、 在本地maven仓库安装本地jar包2、把本地jar包放在项目的某个目录中3、使用scope system依赖参考资料软件项目管理和发布工具Maven给java的开发带来了...
    99+
    2022-11-13
  • Mysql8导入数据到Mysql5.7的实现步骤
    目录序修改xx.sql文件的字符集和排序规则直接修改数据库和表的字符集和排序规则修改数据库字符集和排序规则修改表字符集和排序规则通过Navicat将MySQL8.0导入到MySQL5...
    99+
    2022-11-13
  • golang构建HTTP服务的实现步骤是什么
    这篇文章给大家介绍golang构建HTTP服务的实现步骤是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。参考:   一个go最简单的Http服务器程序package main...
    99+
    2023-06-22
  • python数据写入Excel文件中的实现步骤
    目录一、导入excel表格文件处理函数二、创建excel表格类型文件三、在excel表格类型文件中建立一张sheet表单四、自定义列名五、将列属性元组col写进sheet表单中六、将...
    99+
    2022-11-10
  • 使用Webpack构建多页面程序的实现步骤
    使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序。 原理 将每个页面所在的文件夹都看...
    99+
    2022-11-11
  • VUE引入腾讯地图并实现轨迹动画的详细步骤
    目录效果:引入步骤:效果: 引入步骤: 在 html 中通过引入 script 标签加载API服务在一个盒子元素 div 中预先准备地图容器,并在CSS样式中定义地图(容器)显示大...
    99+
    2022-11-13
  • 安卓调用阿里云上的服务器实现步骤和注意事项
    本文主要讲述了如何在安卓应用中调用阿里云上的服务器,以实现数据的远程处理和存储。我们将会详细介绍如何在安卓应用中创建阿里云的SDK,连接阿里云服务器,以及处理服务器响应。 创建阿里云的SDK首先,我们需要在阿里云的官方网站上创建一个开发者...
    99+
    2023-11-16
    阿里 注意事项 步骤
  • Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作
    这篇文章将为大家详细讲解有关Python中如何实现二叉排序树的定义、查找、插入、构造、删除操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 二叉排序树的定义  二叉排序树 ( B i n a r y...
    99+
    2023-06-15
  • 【iOS内购支付,无需插件】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)
    前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希...
    99+
    2023-10-12
    uni-app ios objective-c
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作