我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringAOP 设置注入的实现步骤

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringAOP 设置注入的实现步骤

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 设置注入的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringAOP 设置注入的实现步骤

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

下载Word文档

猜你喜欢

sqlserver设置主键的实现步骤

目录开始之前限制和局限设置主键并置为非空更改已经建好的表中主键列的字符类型开始之前限制和局限一个表只能包含一个android PRIMARY KEY 约束。在 PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL。
2023-10-19

JupyterLab设置切换虚拟环境的实现步骤

本文主要介绍了JupyterLab设置切换虚拟环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-08

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.1 下载wget
2023-05-05

win10设置默认输入法的步骤教程

win10系统已经发布好几年了,不知不觉中各个方面也已经相当完善了。但是,为什么设置默认输入法就那么难呢?那是因为你没遇到我呀。请大家一起来看看,今天小编将为大家介绍如何设置win10的默认输入法步骤教程。1、首先打开控制面板,然后在“控制
2023-07-11

Android 添加系统设置属性的实现及步骤

Android 添加系统设置属性的实现及步骤Android源码开发中,常常要用到一些全局标志或者说变量,这时候我们可以给android系统添加自己想要的属性。1. 整个android系统都能访问的属性;2.该属性值永久保存; 那么我们可以仿
2023-05-30

MyBatis实现配置加载的步骤

本文主要介绍了MyBatis实现配置加载的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-19

Docker配置MySql环境的实现步骤

本指南介绍了在Docker中配置MySQL环境的完整步骤。从安装Docker到创建MySQL容器、连接到容器、创建数据库和用户、查看容器日志、备份数据、停止和删除容器,再到恢复数据,都有详细说明。通过遵循这些步骤,您可以轻松地为您的项目设置一个功能齐全的MySQL环境。
Docker配置MySql环境的实现步骤
2024-04-02

Nginx配置http和https的实现步骤

Nginx配置HTTP和HTTPS本指南介绍了使用Nginx配置HTTP和HTTPS连接的详细步骤。通过获取SSL证书并配置虚拟主机块,您可以启用HTTPS,从而确保数据安全和隐私。步骤包括:获取SSL证书配置Nginx虚拟主机设置SSL证书和密钥配置HTTPS重定向设置SSL参数(可选)通过遵循这些步骤并验证配置,您可以为您的网站创建安全可靠的连接。
Nginx配置http和https的实现步骤
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录