Spring 学习笔记(六)—— AOP的简单理解
时间:2022-06-09
本文章向大家介绍Spring 学习笔记(六)—— AOP的简单理解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
系统中的业务可以分为核心关注点和横切关注点。
核心关注点时业务处理的主要流程,而横切关注点是与核心业务无关但更为通用的业务。
各个横切关注点离散地穿插于核心业务之中,导致系统地每一个模块都与这些业务具有很强的依赖性,当需要添加新的横切功能时,需要大幅修改已有的代码,这些都严重影响了系统的可维护性和可拓展性。
AOP要解决的就是整个问题,使用AOP框架后,能够将这些影响多个类的通用性服务抽取出来(即切面),并通过配置的方法明确再哪些位置插入这些服务;系统运行后,AOP框架会在指定的时机自动运行这些服务;从而达到将核心业务逻辑和服务性逻辑分离的目的,减少了重复代码。
场景模拟
首先我们建立一个可以使用AOP的场景———一个简化的购买过程以及退货过程模拟
建立一个Service来处理这两个请求:
package aop_part.Demo1;
/**
* Created by Richard on 2017/7/28.
*/
public interface BuyService {
/*
* 模拟购买商品的过程
* @param:username,productname
* @return orderNum
*/
int buy(String username,String productname);
/*
*模拟退货过程
* @param:orderNum
*/
void returnGod(int orderNum);
}
其实现类:
package aop_part.Demo1;
/**
* Created by Richard on 2017/7/28.
*/
public class BuyServiceImpl implements BuyService {
private static int Order_Num=1000;
private TransactionManager transactionManager=new TransactionManager();
@Override
public int buy(String username, String productname) {
try{
transactionManager.transaction_start();
System.out.println("用户"+username+"购买了"+productname);
transactionManager.transaction_submit();
}catch (Exception e){
e.printStackTrace();
transactionManager.transaction_rollback();
}
return Order_Num++;
}
@Override
public void returnGod(int orderNum) {
try {
transactionManager.transaction_start();
System.out.println("订单"+orderNum+"申请退回");
transactionManager.transaction_submit();
}catch (Exception e) {
e.printStackTrace();
transactionManager.transaction_rollback();
}
}
}
因为购买和退货的实际操作中会涉及到数据库,所以我们引入事务整个概念,来控制整个流程,现在创建一个TransactionManager来管理事务:
package aop_part.Demo1;
/**
* 模拟简单的数据库事务操作的三个状态
* Created by Richard on 2017/7/28.
*/
public class TransactionManager {
public void transaction_start(){
System.out.print("【事务开始】");
}
public void transaction_submit(){
System.out.println("【事务提交】");
}
public void transaction_rollback(){
System.out.println("【事务回滚】");
}
}
创建一个Test类,来模拟两个操作,假设购买用户为rekent,购买产品为AOP_Study,之后再执行退货操作,操作订单为1100,其输出结果为:
【事务开始】用户rekent购买了AOP_Study
【事务提交】
【事务开始】订单1100申请退回
【事务提交】
Process finished with exit code 0
上面的示例演示了AOP的应用场景:
(1)存在多个业务操作(如示例中的购买商品和退货业务)
(2)多个核心操作中都需要完成某个相同的操作(如示例中的事务操作),并且这些操作和核心业务功能没有直接关系。
即上述的事务操作可以使用AOP框架来协助我们更加方便的解决。
- 与Ajax同样重要的jQuery(1)
- Java中Class类详解、用法及泛化
- python 函数编程的位置参数、默认参数、关键字参数以及函数的递归
- Java子类的父类和要实现的接口有相同的方法/函数会冲突吗
- Java关键字 Finally执行与break, continue, return等关键字的关系
- #if 和#ifdef的区别
- python高阶函数:map(f,[list]),reduce(f,[list],可选初始值),
- 深入探讨 Java 类加载器
- 斐波那契查找原理详解与实现
- 增量数据丢失的原因分析(二)(r8笔记第76天)
- pycharm 之模块与模块引用
- 判断栈的出栈顺序合法性
- Combination Sum II 组合数求和之2-Leetcode
- Combination Sum 组合数求和-Leetcode
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 详解flink 1.11中的新部署模式-Application模式
- 浙大版《C语言程序设计(第3版)》题目集 习题10-2 递归求阶乘和
- hadoop源码解析之RPC分析
- 存储过程和触发器
- hadoop源码学习之namenode启动
- 浙大版《C语言程序设计(第3版)》题目集 习题10-3 递归实现指数函数
- hadoop2.7.3源码解析之datanode注册和心跳机制
- 审核/审计
- flink教程-聊聊 flink 1.11 中新的水印策略
- 浙大版《C语言程序设计(第3版)》题目集 习题10-4 递归求简单交错幂级数的部分和
- JSP分页显示(前端处理)
- 拓扑排序-HDU2647 Reward
- hadoop2.7.3源码解析之HA架构分析
- hadoop源码解析之hdfs内部结构分析
- 浙大版《C语言程序设计(第3版)》题目集 习题10-5 递归计算Ackermenn函数