Spring学习:AOP概述

article/2025/9/14 9:25:28

一、AOP概念

        AOP是指面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

        通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 。

示例: 

        上例是一个基本的登录功能,我们在完成其基本流程的代码之后,如果要添加一个权限判断的功能,那么传统的做法就只能修改源代码,添加if判断,判断登陆者权限。但是,采用AOP,我们可以不修改源代码,添加新的功能。我们单独编写独立的权限判断模块,并通过配置,将其配置到登录流程中。

二、AOP底层原理

        AOP底层使用了动态代理,分为两种情况的动态代理。

2.1 有接口情况

        有接口的情况,使用JDK动态代理。 

  • 创建接口实现类的代理对象,增强类的方法。

        如上图所示,有一个接口以及其的一个实现类,用于实现登录功能,我们的目的是不修改源代码,为登录功能添加权限验证,也就是扩展登录功能函数login()其底层的实现原理是,通过JDK动态代理,创建UserDao接口实现类的代理对象,通过代理对象来增强、扩展原功能(登录功能)。

2.2 没有接口情况

        没有接口的情况,使用CGLIB动态代理。

  • 创建子类的代理对象,增强类的方法。 

示例: 

        上例中,User类中有一个add方法,要在不修改源代码的前提下,对该方进行增强,由于其没有接口,所以不能采用上节创建接口实现类的代理对象的方式来增强,其采用的底层原理是创建当前类的子类的代理对象,在其子类中,对方法功能进行增强。

 2.3 JDK有接口动态代理代码示例:

         使用JDK动态代理,需要使用Proxy类里面的方法,来创建代理对象。Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。方法如下:

方法有三个参数: 

  • 第一参数,类加载器 
  • 第二参数,增强方法所在的类,这个类实现的接口,支持多个接口 
  • 第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分 

JDK动态代理代码:

    (1)创建接口,定义方法

/*** 接口*/
public interface UserDao {public int add(int a,int b);public String upData(String id);
}

    (2)创建接口实现类,实现方法

public class UserDaoImpl implements UserDao{@Overridepublic int add(int a, int b) {System.out.println("add方法被执行...");return a+b;}@Overridepublic String upData(String id) {System.out.println("upData方法被执行...");return id;}
}

    (3)使用Proxy类创建接口代理对象(增强原功能)

public class JDKProxy {public static void main(String[] args) {//创建接口实现类的代理对象Class[] interfaces = {UserDao.class};//匿名类的写法
//        Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                return null;
//            }
//        });UserDaoImpl userDao = new UserDaoImpl();UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));int result = dao.add(1,2);System.out.println("result:"+result);}
}//创建代理对象代码
class UserDaoProxy implements InvocationHandler{//1. 把创建的是谁的代理对象,将其传递过来//有参构造函数传递private Object obj;public UserDaoProxy(Object obj){this.obj = obj;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前的增强逻辑System.out.println("方法之前执行的增强逻辑"+method.getName()+" :传递参数..."+ Arrays.toString(args));//被增强的方法执行Object res = method.invoke(obj,args);//方法之后的增强逻辑System.out.println("方法之后的增强逻辑"+obj);return res;}
}

代码执行结果:

方法之前执行的增强逻辑add :传递参数...[1, 2]
add方法被执行...
方法之后的增强逻辑com.wyf.JDKDemo.UserDaoImpl@31cefde0
result:3

三、结束

        本文主要介绍了AOP的基本概念,以及其实现的底层基本原理。 


http://chatgpt.dhexx.cn/article/VKM9pjcs.shtml

相关文章

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。 Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC…

图文详解Spring AOP,你学会了吗?

如果说 IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心,需要重点掌握mikechen 本篇主要会详解以下六点: 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念Spring AOP 通知分类S…

Spring AOP全面详解(超级详细)

如果说IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心mikechen AOP的定义 AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP&…

mysql执行SQL脚本

方法一 【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】 示例&#xff1a; 如果mysql配了全局变量&#xff0c;就不需要到Mysql的bin目录下执行&#xff0c;可以在任何地方使用用户名、密码、指定数据库等参数值与参数名不需要隔空格 不…

SpringBoot 实现SQL脚本自动执行

SpringBoot 实现配置SQL脚本自动执行 一. 背景 我们可能遇到过这种情况: 在公网开发时, 新增数据表非常容易, 直接登录到对应服务器的mysql / 使用Navicat访问mysql服务器. 然后去执行sql语句或脚本即可在内网开发时, 由于都在一个网段, 所以操作也比较方便但是在公网开发, 部…

flink-sql-client提交sql脚本文件

标题: flink-sql-client提交sql脚本文件 日期: 2021-10-22 22:11:34 标签: [flink,sql-client] 分类: flink 我们知道&#xff0c;sql-client.sh可以提供给我们一个sql交互界面&#xff0c;让我们没执行一个sql&#xff0c;就可以看到执行结果&#xff0c;也可以交互式查询表的…

如何在mysql中执行sql脚本文件

一、sql脚本文件 简介 xxxx.sql这种文件被称为sql脚本文件。sql脚本文件中编写了大量的sql语句。我们执行sql脚本文件的时候&#xff0c;该文件中所有的sql语句会全部执行&#xff01;批量的执行SQL语句&#xff0c;可以使用sql脚本文件。 上面这个vip.sql就是sql脚本文件&am…

使用sql脚本创建数据库表

准备脚本语句&#xff1a; CREATE TABLE test (title varchar(100) DEFAULT NULL,author varchar(10) DEFAULT NULL,digest varchar(255) DEFAULT NULL,content text,content_source_url varchar(500) DEFAULT NULL,thumb_media_id varchar(255) DEFAULT NULL,need_open_comme…

PowerDesigner生成Sql脚本

点击工具栏上的“Database”&#xff0c;选择“Change Current DBMS”进行修改导出脚本类型&#xff0c;可以选择mysql、sql server/ oracle 、db2等主流的数据库。 在DBMS中点击下拉菜单&#xff0c;选择要导出的数据库脚本&#xff0c;对名字进行自定义&#xff0c;点击确定即…

PowerDesigner导入sql脚本

一个好的数据库建模,不但可以让人直观的理解模型,充分的利用数据库技术,优化数据库的设计,而且还可以让新员工快速的熟悉数据库表结构与业务之间的关系.无奈的是随着开发过程中,数据库表结构字段的增删以及关联关系的变动给数据库模型带来维护上的巨大工作量.现为了维护上的简单…

dbeaver导入sql脚本

新建数据库 执行脚本 选择脚本文件 选择mysql 然后按确定就行了

springboot + mybatis启动时执行sql脚本

目录 1. 创建数据版本表&#xff0c;结构如下&#xff1a; 2. 创建HdVersion对象 3. 创建执行sql的dao 4. 创建dao对应的xml 5.创建sql执行器&#xff0c;实现ApplicationRunner 6. 结语 背景&#xff1a;项目开发或发布阶段修改表结构&#xff0c;项目更新时需要手动执行脚…

SpringBoot启动自动执行sql脚本

在开发当中我们每次发布服务都需要手动执行脚本&#xff0c;然后重启服务&#xff0c;而SpringBoot有服务启动自动执行sql脚本的功能的&#xff0c;可以为我们省去手动执行脚本的这一步&#xff0c;只需要部署新的服务即可。 这个功能是SpringBoot自带的不需要引入额外的依赖&a…

Excel数据转化为sql脚本

在实际项目开发中&#xff0c;有时会遇到客户让我们把大量Excel数据导入数据库的情况。这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库。 1 在数据前插入一列单元格&#xff0c;用来拼写sql语句。 具体写法&#xff1a;"insert into t_student (id,name,ag…

MySQL导出sql脚本文件

⭐️前言⭐️ sql脚本文件在我们做项目时&#xff0c;特别是学习别人的开源项目时经常需要进行导入导出操作&#xff0c;才能在自己的系统上跑起来&#xff0c;这篇文章主要介绍如何导出sql脚本文件&#xff0c;具体操作如下&#xff0c;附带截图详解。 &#x1f349;博客主页…

dataGrip导出sql脚本

1.打开dataGrip。 2.选择要导出的数据库表。 3.点击右键->选择"Dump Data to File(s)", 同时选择&#xff0c;Skip Computed Columns(sql),Add Table Definition(sql),Overwrite Exsting Files和Single File。 4.点击sql Inserts 5.选择文件保存位置 6.生成sql脚…

linux下plsql怎么执行sql脚本,plsql怎么执行sql脚本

首先,我们需要登录需要执行sql文件的用户,在我们确保sql文件无误的情况下,进入plsqldeveloper: 1,找到tools---》import tables ---》选择sql insert,不要选中sqlplus,选择最下面的那个导入sql文件,选中好sql文件后,点击import就会执行sql语句,生成日志。 2,如果执行…

DBeaver执行SQL脚本文件

1、右键库名&#xff0c;点击工具-->执行脚本 2、在弹出窗口中选择输入文件&#xff0c;并修改Extra command args:--default-character-setutf8&#xff0c;防止中文乱码&#xff0c;点击开始按钮。 3、执行完成。

kettle执行SQL脚本

参考一下kettle官方文档 kettle什么时候需要创建临时表呢 SELECT * WHERE cid IN(xxx) 的数据太多&#xff0c;占了很大内存。 目标表有没有必要做逻辑删除&#xff0c;如果做逻辑删除&#xff0c;后期数据量增长过快。 目标表增量更新&#xff1a;1、sql直接插入&#xff1…

SQL Server SQL脚本

本节的主要内容是要教大家怎么通过编写 SQL 脚本来查询、更新并且运行数据库。 利用 SQL 脚本我们能做很多事情&#xff0c;比如插入数据、读取数据、更新数据以及删除数据等&#xff1b;它们也可以用于创建数据库对象&#xff0c;如表&#xff0c;视图&#xff0c;存储过程&a…