Java中的面向切面编程(AOP)
一、什么是AOP?
Aspect Oriented Programming ,即面向切面编程。
- AOP是对面向对象编程的一个补充。
- 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中解决。
- 它的实际含义是在运行时将代码切入到类的指定方法、指定位置上,将不同方法的同一个位置抽象为一个切面对象,并对该对象进行编程。
下面是AOP的一个示意图
二、AOP的优点和一些概念
1、AOP的优点
- 降低模块之间的耦合度
- 使系统更容易扩展
- 更好的代码复用
- 非业务代码更加集中,不分散,便于统一管理
- 业务代码更加简洁纯粹,不掺杂其他的代码的影响
2、AOP中出现的一些概念
- 切面:横切关注点,被模块化的抽象对象
- 通知:切面对象完成的工作(非业务代码)
- 目标:被通知的对象(即被横切的对象)
- 代理:切面、通知、目标混合之后的对象
- 连接点:通知要插入业务代码的具体位置(如Spring实现中的JoinPoint)
- 切点:AOP通过切点定位到连接点
三、使用动态代理实现AOP
1、添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.0.11.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.11.RELEASE</version>
</dependency>
2、创建一个计算器接口Cal,定义四个方法
动态代理的类的方法应当都由接口来实现,这样才方便使用动态代理对象执行方法
3、创建接口的实现类CalImpl
高耦合的写法,每次打印日志都要手动完成:
4、使用动态代理进行优化
上方代码中,日志信息和业务逻辑的耦合性很高,不利于代码的维护。使用AOP可以进行优化,我们可以使用动态代理实现AOP:
给业务代码找一个代理,打印日志信息的工作交给代理来做。这样的话业务代码就只需要关注自身业务即可。
(1)去掉手动输出的日志信息
(2).代理辅助类的编写和使用(动态代理的核心)
我们创建的并不是所谓的代理类,而是一个可以帮助我们返回代理对象的辅助类,这个辅助类有两个功能
- 接收委托对象并依次返回代理对象
- 处理代理对象调用方法的过程
值得注意的是:
- 注意别忘了给委托对象赋值的那一步
- 创建代理动态代理对象时传入的方法保证了代理类拥有原类的全部功能
- 调用代理对象的方法时会自动调用invoke方法
(3)测试
四、使用Spring实现AOP
动态代理实现AOP比较复杂,不易理解。Spring框架对AOP进行了封装,使用Spring框架可以用面向对象的思想实现AOP。Spring框架中不需要创建辅助类,只需要创建一个切面对象,将所有的非业务代码在切面对象中完成即可(但实际上Spring框架底层依然会根据切面类和代理类来生成代理对象。)
1、添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.0.11.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.11.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.11.RELEASE</version></dependency>
2、创建一个计算器接口Cal,定义四个方法
当使用Spring实现时,这一步非必须!直接在实体类里面定义方法也可
3、定义实体类,实现方法
注意需要加上Component注解把他交给IoC
4、创建切面类
类定义处的两个注解
@Aspect
表示该类是一个切面类@Component
将该类的对象注入到IoC容器(切面类和实体类都需要加上这个注解)
方法处的注解
@Before
表示方法执行的具体位置和时机是方法开始时@After
类似Before,不过位置是方法的最后
@AfterReturning
在下文有作解释@AfterThrowing
在下文有作解释
5、在spring.xml中进行配置
context:component-scan
指扫描com.pedro包中的所有类,如果该类同时添加了component注解,则将该类扫描IoC容器中。即IoC管理它的对象aop:aspectj-autoproxy
让Spring容器结合切面类和目标类自动生成代理对象
6、使用
用代理对象调用方法就会自动执行它本身的方法和切面类中的非业务代码
为什么类名首字母要小写?
当使用注解配置bean时,默认id(别名)就是首字母改为小写的类名。若想修改,就在实体类的注解处加上自定义的名字即可。如@Component("test")
,这样的话在getBean的时候就可以使用自定义的别名了,即xx.getBean("test")
7、两个特殊的After注解
(1)AfterReturning
用于在获取返回值后执行一段非业务代码
注:因为有两个参数,这里的value标签名被标出,而上面的before、after等注解只有一个参数,所以省略了value
结合上面的其他注解,会输出:
div方法的参数是[6,2]
div方法执行完毕
div方法的结果是3
(2)AfterThrowing
切面类的AfterThrowing注解,用于在抛出异常后执行一段非业务代码
结合上面的其他注解,会输出:
div方法的参数是[6,0]
div方法执行完毕
div方法抛出的异常:java.lang.ArithmeticException: / by zero
2021.4.3
Java中的面向切面编程(AOP)相关推荐
- java切面编程 切面概念,面向切面编程(AOP)初探
面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...
- Spring in Action 入门之面向切面编程AOP
注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...
- Spring-学习笔记08【面向切面编程AOP】
Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...
- Spring(四):面向切面编程AOP
2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...
- Spring之面向切面编程AOP(八)
介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...
- 服务端第三次课程:面向切面编程AOP
3:面向切面编程AOP 1:回顾 bean的组装方式 规划的装配 component autowired sacn是在configuration底下的 Java config 使用configurat ...
- Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ
面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...
- 九、面向切面编程AOP
本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...
- Java 中的面向数据编程
近年来, Amber项目为 Java 带来了许多新特性-- 局部变量类型推断. 文本块. 记录类. 封印类. 模式匹配 等等.虽然这些特性都是独立的,但也可以组合在一起使用.具体地说,记录类.封印类和 ...
最新文章
- vim编辑器操作命令大全-绝对全
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
- 【游山玩水】三清山旅游行程
- 工业交换机是什么?矿用交换机采用的是工业级交换机吗?
- oracle 锁表 and 解锁
- Flutter PageView 使用详细概述
- Visual Studio 跨平台開發實戰(5) - Xamarin Android 多頁面應用程式開發 (转帖)
- 【Head First 设计模式】-简单工厂模式读后总结
- ImportError: cannot import name ‘Optional‘
- 跑了 13 种编程语言的 Hello World,可视化后有了新发现!
- 高薪、稀缺人才必备哪些技能?BDTC大会告诉你,附最新议程!
- 按头安利 好看又实用的手绘图标素材看这里
- Mac快速录制音频工具:Recordia
- YIT-CTF—密码学
- VUE3-Cesium(视角操作、时钟设置)
- python对钉钉考勤旷工的数据填入excel
- 顺口溜:国足欢迎你(贬)
- win7开机后资源管理器未响应或者停止问题
- Cocos技术派 | TS版属性面板定义高级用法
- 红米android10参数,红米10x5g手机参数 红米10x5g手机参数有哪些