编程新贵——AOP,你不得不知道的事

2023-11-01

简介

        AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态同意添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一个实现。

        主要可以应用在日志记录、性能统计、安全控制、事务处理、异常处理等等。意图为将日志记录、性能统计、安全控制、事务处理、异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

        AOP在Spring中得到了丰富支持,应用对象只实现它们应该做的——完成业务逻辑,仅此而已。它们并不负责(甚至是意识)其他的系统级关注点,例如日志或事物支持。

        有了这些,我对此的理解为:一个好的系统进行设计,可以让码农做出完美的系统。他们不需要考虑事务,不需要考虑日志,不需要考虑安全,不需要考虑性能,只是关注自己实现的那一部分业务逻辑即可。


那么AOP和OOP又有什么区别和联系呢?

        可以说AOP是对OOP一个很好的补充。我们平时编程的过程中,难免会遇到一些代码,这些代码我们无法抽象成一个父类或者方法,因为他们分布在每个类的角落、每个类的边边角角。

        在软件开发中,我觉得最重要的思想就是:面对写了3遍以上的代码,一定要考虑是否可以将其进行抽象,当我们再复制粘贴的时候,我们就已经失去了思考。

        正是因为这种思想,所以不断有新的名词涌进我们的视野,从面相过程到面相对象,再到现在的面相切面,这些名词的出现,没有一个不使得我们的代码一步步的在减少,相反的就是系统复杂度高了。一个功能不再是只有一个模块就可以完成,往往需要调用好几个类才可以完成一个功能。实现了由一体式房屋到搭积木式房屋的过度。

        所以AOP和OOP不是对立的,只是一个很好的补充而已。OOP没有AOP可以做出系统,只是有了之后,代码结构更加清晰。AOP如果缺少了OOP的支持,那么它的存在可以说就没有那么多的价值了


说的这么热闹,那么AOP到底应该如何进行开发呢?

        1.发现切面,也称关注点,这也是最最关键的,发现的窍门就是查找你那重复了不只3便的代码吧。

        2.实现关注点,简单的说就是将你那重复了不只3便的代码同意放到一个类里。

        3.组合关注点,就是确定在什么时候执行关注点。例如你关注点里有3个动作,这3个动作分别是在某个方法的执行成功、失败、异常执行的,那么只需要简单的配置一下即可。


下面通过一个示例来进一步说明一下如何开发AOP(分别通过注解和配置文件来实现)

接口和实现类:

public interface UserManager {
	public void addUser(String username,String password);
}

public class UserManagerImpl implements UserManager {
	@Override
	public void addUser(String username, String password) {
		System.out.println("UserManagerImpl.addUser()");
	}
}

采用注解方式实现:

@Aspect  //发现切面
public class SecurityHandler {
	
	/**
	 * 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数
	 * 该方法就是一个标识,不进行调用
	 */
	@Pointcut("execution(* add*(..))")  //组合关注点
	private void addAddMethod(){};
	
	/**
	 * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
	 */
	@Before("addAddMethod()")   //组合关注点
	//@After("addAddMethod()")
	private void checkSecurity() {  //实现关注点
		System.out.println("-------checkSecurity-------");
	}		
}

采用配置文件方式实现(将上述类中的注解、addAddMethod方法去掉,在applicationContext.xml中进行配置):

<!-- 声明使得在程序可以认识关于AOP的注解 -->
	<aop:aspectj-autoproxy />
	<bean id="userManager" class="com.jianxin.spring.UserManagerImpl" />
	<bean id="securityHandler" class="com.jianxin.spring.SecurityHandler"/>
	<aop:config>
		<aop:aspect id="securityAspect" ref="securityHandler">
			<aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/>
			<aop:before method="checkSecurity" pointcut-ref="addAddMethod"/>
		</aop:aspect>
	</aop:config>

测试程序

public class Client {
	public static void main(String[] args) {
		BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserManager userManager=(UserManager)factory.getBean("userManager");
		userManager.addUser("张三", "123");
	}
}

        至此,示例就完成了,最后再说一下,有了AOP,OOP显得更加完美。AOP做的更多的是服务性的工作,OOP做的是主要工作。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程新贵——AOP,你不得不知道的事 的相关文章

随机推荐

  • HTTP抓包利器Fiddler基础及进阶教程(四)---- 修改请求和响应+FiddlerCore使用

    本文将进一步介绍Fiddler的进阶功能 修改Http请求或响应 并使用FiddlerCore将其应用在代码当中 一 修改Http请求 使用Fiddler 将原本访问地址 https blog csdn net qq 29556507 的请
  • Ubuntu(elementary os)因为环境变量 /etc/profile 配置错误,导致登录界面无限循环,无法进入系统的解决方案

    在配置elementary os 的 etc profile 的时候因为配置错误 导致在登录界面无限循环 无法进入系统 下面是解决方案 1 在登录界面 按 Ctrl Alt F1 进入命令行模式 2 用户名输入root 然后密码输入root
  • C++ 中字节对齐总结

    背景 C 中最基本的存储单位是字节 C 中所有的数据都是由对象组成的 每一个对象都包含了一个或多个内存位置 类对象按其成员变量的声明顺序分配内存空间 普通类的内存大小为其所有非静态成员变量内存大小之和 忽略内存对齐 成员顺序不同类的大小不一
  • 分页算法(Java)

    分页的实现可分为两大类 一 数据在Java代码中进行分页 然后取得当前页数据 二 在数据库中直接取得当前页数据 不同的数据库有不同的实现 计算总页数的方法是 总页数 数据总行数 每页数据行数 1 每页数据行数 举例如下 如果数据库中有10条
  • 编译C++ makefile ZXing-cpp生成条型码 二维码及识别 再试验证成功vs2022

    下载ZXing cpp源码及vs2022 cmake help看看支持的vs 为什么没有win32呢 进到目录 新建编译目录 生成vs工程 mkdir build cd build cmake 中间提示opencv和qt等缺东西不要紧 我只
  • LS-DYNA系列_Mie-Gruneisen状态方程

    目录 引言 历史发展 状态方程描述 引言 计算机仿真计算中 对于真实世界中的力学过程的模拟 一直是研究热点之一 在科研 工程应用方面都有着重要的意义 但计算机专业毕业的学生 由于缺乏力学专业知识 因此在制作仿真程序时对基础概念不清楚 本系列
  • STM32——GPIO输出

    1 GPIO简介 2 GPIO基本结构 其中寄存器是三十二位的 但是高十六位是没有用到的 3 GPIO位结构 其中两个开关 上面导通下面断开为上拉输入模式 默认高电平输入 下面导通上面断开为下拉输入模式 默认低电平输入 两个均断开为浮空输入
  • Java中的反射

    反射 1 1 反射的概念 专业的说法是在运行状态中 对于任意一个类 都能够知道这个类的所有属性和方法 对于任意一个对象 都能够调用它的任意属性和方法 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制 1 2 反射学习的内
  • java 盖章透明_java实现图片上传后裁剪,把白色背景变成透明图(电子印章)

    应用场景 企业在白纸上盖上印章 然后软件实现透明的电子印章 在后续业务流程中使用 A4纸 处理后 gt 电子印章 gt 实现共分为3步 1 图片上传后预览 上传图片 POST file upload commons fileupload 1
  • 【Cadance allegro 16.6软件操作流程的总结】

    Cadance allegro 16 6软件操作流程的总结
  • 慕课网python学习笔记:2.迭代对象

    文章目录 1 迭代器与可迭代对象 2 迭代判断方法 1 判断是不是可以迭代 用Iterable 2 判断是不是迭代器 用Iterator 3 实现迭代器与可迭代对象 1 迭代器与可迭代对象 1 迭代器 iterator是一个表示数据流的对象
  • 测试中

    初始块 config chainId 12345 homesteadBlock 0 eip155Block 0 eip158Block 0 coinbase 0x000000000000000000000000000000000000000
  • OpenCL入门

    个人博客地址 https cxx001 gitee io OpenCL框架 OpenCL是一个异构平台编程框架 也是异构并行计算的行业标准 由Khronos Group来维护 旨在充分利用GPU强大的并行计算能力以及CPU的协同工作 更高效
  • 彻底卸载alibabaprotect

    1 卸载阿里系软件 2 全局搜索pc sdk set 删除所在阿里目录 3 强制删除alibabaprotect所在目录
  • maven打包上传到私有仓库的步骤

    1 背景 最近有些自己制作的工具包 需要单独抽取出来之后 在打包的时候 同时上传到自己的maven私服仓库 供别人引用 并且还能够引用的时候看到源码 但是 在上传的过程中总是失败不成功 特别上火 最后总算成功 记录下步骤 希望能够帮助到需要
  • Java—包及访问权限

    包是一个文件夹 它是类的一种特殊的性质 可以更合理地管理大量的类文件 设置他人对类成员的访问权等 包的概念及使用 包的基本概念 在之前所编写的所有代码实际上都有一个问题 发现所有程序都直接保存在同一目录之中 但是 当一个大型程序由多个不同的
  • IDEA创建maven多级模块项目

    一 创建一个空项目 二 在空项目中创建模块 作为maven的parents 选择刚刚创建的空项目 并且给新模块起名字 三 设置JDK的版本 依赖方式 在pom xml文件中添加
  • antv-g2学习手册-上

    G2所构建出的图表是由一系列独立的图形元素组合而成的 数据Data 可视化最基础的部分 图形属性Attribute 负责将数据中的变量映射到图形空间 几何标记Geometry 即在图表中实际看到的图形元素 如点 线 多边形等 每个几何标记对
  • jquery ajax 回调函数里面再执行ajax函数,jQuery AJAX 和其回调函数

    1 什么是 AJAX AJAX 异步 JavaScript 和 XML Asynchronous JavaScript and XML 简短地说 在不重载整个网页的情况下 AJAX 通过后台加载数据 并在网页上进行显示 2 最基本的三个方法
  • 编程新贵——AOP,你不得不知道的事

    简介 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 也叫面向方面 可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态同意添加功能的一种技术 AOP实际是GoF设计模式的延续 设