面向切面编程 AOP

news2024/11/26 20:27:24

AOP

  • AOP的概念
  • AOP (底层原理)
    • AOP 底层使用动态代理
  • AOP ( JDK 动态代理)

首先我们来看一下 Spring 的百度百科
  Spring 框架是一个开放源代码的 J2EE 应用程序框架,由 Rod Johnson 发起,是针对 Bean 的生命周期进行管理的轻量级容器( lightweight container )。 Spring 解决了开发者在 J2EE 开发中遇到的许多常见的问题,提供了功能强大的 IOC 、 AOP 及 Web MVC 等功能。 Spring可以单独应用于构筑应用程序,也可以和 Struts 、 Webwork 、 Tapestry 等众多 Web 框架组合使用,并且可以与 Swing 等桌面应用程序 AP 组合。因此, Spring 不仅仅能应用于 J2EE 应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。 Spring 框架主要由七部分组成,分别是 Spring Core , Spring ORM , Spring DAO , Spring Context , Spring Web 和 Spring Web MVC 。

  • 所以我们接下来要讲的就是 AOP 的概念。

AOP的概念

同样的,我们先查一下百度百科
  在软件行业, AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理的实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个特点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生泛型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

  • 主要意图
      将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
  • 什么是 AOP ?
    (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

拿我们的登录过程来举例

Created with Raphaël 2.3.0 开始 用户名密码 数据库查询 判断 主页面 结束 yes no

在登录功能基础之上添加功能

  • 权限判断
  • 原始方式:修改源代码进行实现(if 管理员 *** else if 普通用户

  • AOP:不通过修改源代码的方式添加新的功能(增加权限判断模块到判断到主页面之间)

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

AOP (底层原理)

AOP 底层使用动态代理

  • 第一种 有接口的情况,使用 JDK 的动态代理

动态代理有接口

interface UserDao {
	public void login();
}
class UserDaoImpl implements UserDao {
	public void login () {
		// 登录过程的实现过程
	}
}

JDK 动态代理
创建 UserDao 接口实现类代理对象(创建一个代理对象)

  • 第二种 没有接口的情况,使用 CGLIB 动态代理

动态代理没有接口的情况

class User {
	public void add ()
}
// 子类
class.Person extends User {
	public void add () {
		supper.add();
		// 增强逻辑
	}
}

_ CGLIB 动态代理_
创建当前子类中的代理对象,增强类的方法

AOP ( JDK 动态代理)

  1. 使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象
java.lang.reflect
Class Proxy
java.lang.Object
	java.lang.reflect.Proxy

(1)调用 newProxyInstance 方法

static Object
newProxyInstance(ClassLoader loader,<?>[] interfaces,InvocationHandler h)
//返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序

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

  1. JDK 动态代理代码
    (1)创建接口,定义方法
package com.fairykunkun.dao;
public interface UserDao {
	public String update ( String id );
	public int add ( int a , int b );
}

(2)创建接口的实现类

package com.fairykunkun.dao;
public class UserDaoImpl implements UserDao {
	@Override
	public String update ( String id ) {
		System.out.println ( "update()方法执行了" );
		return id;
	}
	@Override
	public int add ( int a , int b ) {
		System.out.println ( "add方法执行了" );
		return a + b;
	}
}

(3)使用 Proxy 类创建接口的代理对象

package com.fairykunkun.proxy;
import com.fairykunkun.dao.UserDao;
import com.fairykunkun.dao.UserDaoImpl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
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 {
	// 把创建的是谁的代理对象,把谁传递过来
	// 有参数构造传递
	public Object object;

	public UserDaoProxy ( Object o ) {
		this.object = o;
	}

	// 增强的逻辑
	@Override
	public Object invoke ( Object proxy , Method method , Object[] args ) throws Throwable {
		// 方法之前
		System.out.println ( "方法之前执行..." + method.getName ( ) + ":传递的参数..." + Arrays.toString ( args ) );
		// 被增强的方法执行
		Object res = method.invoke ( object , args );
		// 方法之后
		System.out.println ( "方法之后执行..." + res );
		return res;
	}
}
  • 测试
    实验结果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cpp项目中遇到的一些错误

1.解决由于找不到xxx.dll&#xff0c;无法继续执行代码的问题 解决由于找不到xxx.dll&#xff0c;无法继续执行代码的问题_happylife_mini的博客-CSDN博客_由于找不到emp.dll无法继续执行代码在用vs写项目&#xff0c;或者你下载github上的C代码的时候&#xff0c;是不是经常遇…

【Redis技术探索】「底层架构原理」探索分析服务系统的网络架构和线程模型

Redis网络基础架构 网络编程离不开Socket&#xff0c;网络I/O模型最常用的无非是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞&#xff0c;高性能网络服务器最常见的线程模型也就是基于EventLoop模式的单线程模型。 Redis基础组建结构 Redis网络层基础组件主要包括四个部分&a…

acm是什么?你准备好去打了吗?(未完结)

1.引言2.acm究竟是什么&#xff1f;3.acm的时间安排4.acm该如何准备1.引言 作为一个零基础的小白&#xff0c;acm这条路走的并不顺畅&#xff0c;接触的信息很少&#xff0c;以至于在这条道路上走了不少弯路&#xff0c;浪费了大量的时间&#xff0c;现在也快要退役的阶段&…

Linux基础-软件包管理器RPM与yum

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【参考文章】 参考文章&#xff1a;https://howard2005.blog.csdn.net/article/details/127131286?spm1001.2014.3001.5502 文章目录一、使用RPM软件包管理器1. RPM安装软件包2. RPM更新与升级软件包3. RPM查询软件包…

Qt-Web混合开发-Qt读写Json数据(5)

Qt-Web混合开发-Qt使用内置json库读写json示例&#x1f34f; 文章目录Qt-Web混合开发-Qt使用内置json库读写json示例&#x1f34f;1、概述&#x1f353;2、实现效果&#x1f345;3、实现功能&#x1f95d;4、关键代码&#x1f33d;5、源代码&#x1f346;更多精彩内容&#x1f…

面试怎么回答MySQL索引问题,看这里

前言 小A在宿舍里跟哥们开五黑打排位中&#xff0c;突然收到女神小美的消息&#xff1a;“小A&#xff0c;我今天面试碰到索引问题了&#xff0c;我没回答好”。小A顾不上游戏抓紧回复到&#xff1a;“到你宿舍某某咖啡店吧&#xff0c;我帮你一起看下”。 小A抓紧时间换了衣…

物联公司网页设计制作 简单静态HTML网页作品 静态企业网页作业成品 学生网站模板

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux系统部署

Linux系统部署 下载vmware centos7 xshell6 xftp6新建虚拟机&#xff0c;注意设置网络连接&#xff0c;设置登录名&#xff1a;root,密码&#xff1a;root,等待登录&#xff0c;输入用户名和密码&#xff08;注意密码输入不显示&#xff09;登录成功&#xff0c;执行命令Ifc…

【网管日记】MySQL主从复制

MySQL主从复制 基本介绍 MySQL 主从复制是一个异步的复制过程&#xff0c;底层是基于 Mysql 数据库自带的 二进制日志 功能。 一台或多台 MySQL 数据库&#xff08;slave&#xff0c;即 从库 &#xff09;从另一台 MySQL 数据库&#xff08; master&#xff0c;即 主库 &…

餐饮后台管理系统

一、项目介绍&#xff1a; 用于每天的菜品数据分析&#xff0c;客户的管理&#xff0c;员工的管理&#xff0c;查看订单信息&#xff0c;菜品的添加或者下架管理 二、项目使用技术栈&#xff1a; vue2全家桶、element-ui、axios、js、es6、echarts 三、主页效果图&#xff…

pytorch深度学习实战一书,tensorboard可视化踩坑

书评&踩坑[TOC](书评&踩坑) 提示&#xff1a;纯个人观点&#xff0c;仅供参考前言一、源码学习&#xff0c;又是版本问题&#xff08;省略内心独白...&#xff09;二、步骤1.安装tensorflow2.思考&#xff0c;看代码&#xff0c;看书求证总结提示&#xff1a;纯个人观点…

卧兔CEO胡煜受邀参加2022世界直播电商大会

首届全球数字贸易博览会于12月11日在国际博览中心盛大开幕。在这个国家级、全球性、专业性的舞台上&#xff0c;“2022世界直播电商大会”作为分论坛&#xff0c;精彩启幕。 “2022世界直播电商大会”由浙江省人民政府和商务部联合主办&#xff0c;杭州市人民政府和浙江省商务…

借款久期还款久期 简述

借款久期&还款久期 简述 在工作的时候&#xff0c;在资产使用遇到三个指标&#xff0c;分别是生息资产、借款久期、还款久期&#xff0c;有点不清楚其中的含义&#xff0c;查阅相关资料后做个简短的总结&#xff0c;可能有错&#xff0c;先放这。 1 久期 久期&#xff0…

【STM32】GPIO的工作原理和配置

目录一、GPIO是什么&#xff1f;二、GPIO的8种工作模式1. 浮空输入模式&#xff08;GPIO_Mode_IN_FLOATING&#xff09;2. 上拉输入模式&#xff08;GPIO_Mode_IPU&#xff09;3. 下拉输入模式&#xff08;GPIO_Mode_IPD&#xff09;4. 模拟输入模式&#xff08;GPIO_Mode_AIN&…

kubernetes学习之路--BadPods(Part2)

在我看来&#xff0c;现在关于k8s的攻击面很小&#xff0c;除了容器逃逸&#xff0c;敏感信息和配置不当&#xff0c;很难有其他有效的横向移动的手段了吧&#xff0c;反正据我了解暂时是这样子的&#xff0c;慢慢积累吧还是。 回顾一下Pod中那几项不安全的配置 &#xff1a; …

原地起飞,华为内部都在强推的435页网络协议文档,附讲解

#为什么要学习网络协议&#xff1f; 相信大家都听过通天塔的故事&#xff0c;上帝为了阻止人类联合起来&#xff0c;让人类说不同的语言&#xff0c;人类没法沟通&#xff0c;达不成“协议”&#xff0c;通天塔的计划就失败了。 但是千年以后&#xff0c;有一种叫“程序猿”的…

基于VBA实现电缆结构自动出图(三) —— 多芯线

大家敢相信吗&#xff0c;原来VBA竟然可以实现电缆结构自动出图&#xff0c;换句话说&#xff0c;只要输入数据&#xff0c;VBA会自动将电缆的结构画出来&#xff0c;同时还可以渲染&#xff0c;结果竟然不输画图软件&#xff0c;真真让我刮目相看。这里我就不过多介绍VBA了&am…

重点| 系统集成项目管理工程师考前50个知识点(5)

本文章总结了系统集成项目管理工程师考试背记50个知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 30、活动之间的四种依赖关系&#xff1a; 强…

[附源码]Node.js计算机毕业设计高校互联网班级管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Redis 压力测试 服务监控

Redis 压力测试 & 服务监控 Redis 压力测试 Redis 安装成功后&#xff0c;会在 /usr/local/bin/目录下生成redis-benchmark压测工具。该工具模拟N个客户端同时执行Redis指令&#xff0c;默认提供一组默认测试参数&#xff0c;用户可以自定义其属性&#xff0c;更改测试行…