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框架来协助我们更加方便的解决。
Spring 学习笔记(六)—— AOP的简单理解的更多相关文章
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring学习笔记4——AOP
AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- Spring学习笔记六:Spring整合Hibernate
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html 前言:整合概述 Spring整合Hibernate主要是把Hibernate中常用的S ...
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
一.Spring IoC容器补充(1) Spring IoC容器,DI(依赖注入): 注入的方式:设值方法注入setter(属性注入)/构造子注入(构造函数传入依赖的对象)/字段注入Field(注解) ...
- Spring学习笔记2—AOP
1.AOP概念 AOP(Aspect Oriented Programming):面向切面编程,AOP能够将那些与业务无关,却为业务模块所共同调用的应用(例如事务处理.日志管理.权限控制等)封装起来, ...
- Spring学习笔记之AOP配置篇(一)
[TOC] 1. 创建并声明一个切面 首先,创建一个类,添加@Component注解使其添加到IoC容器 然后,添加@Aspect注解,使其成为一个切面 最后,在配置文件里面,使用<aop:as ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring学习笔记(六)—— SSH整合
一.整合原理 二.整合步骤 2.1 导包 [hibernate] hibernate/lib/required hibernate/lib/jpa 数据库驱动 [struts2] struts-bla ...
随机推荐
- mybatis-generator的maven插件使用异常(mybatis-generator-maven-plugin):generate failed: Exception getting JDBC Driver
使用mybatis的代码生成工具:mybatis-generator,在父model中引入了maven插件的依赖,如下: <!-- Mybatis.generator插件 --> < ...
- MySQL常见错误分析与解决方法总结
MySQL常见错误分析与解决方法总结 一.Can't connect to MySQL server on 'localhost' (10061)翻译:不能连接到 localhost 上的mysql分 ...
- JavaScript: window.onload = function() {} 里面的函数不执行
问题:写了一个最简单的页面.在script标签中使用的 window.onload = function() { function add() { //... } } 页面上:<div oncl ...
- CBCGPImage的GetSize的问题及解决方法
BCGControlBar Pro for MFC 25.10是目前(2018-07-16)网上能够找到的最新能够使用的版本,我配合Visual Studio 2010使用.在单文档MFC程序的视图中 ...
- 【赛时总结】 ◇赛时·I◇ AtCoder ARC-098
◆赛时I◆ ARC-098 ■试题&解析■ ◆本场最水◆ C-Attention 长点儿信心吧-- [AtCoder ARC-098 C] [解析] 既然只存在左右(东西)两个朝向,那么领导右 ...
- Python 遗传算法实现字符串
Python 遗传算法实现字符串 流程 1. 初始化 2. 适应度函数 3. 选择 4. 交叉 5. 变异 适应度函数计算方法 计算个体间的差:分别计算每个元素与目标元素的差取平方和 种群:计算总体均 ...
- 8-1 python 接口开发(提供数据、返回session_id)
1.接口开发,根据不同查询条件返回数据库查询结果 import flask import tools import json server = flask.Flask(__name__) #新建一个服 ...
- spring-mvc.xml的定时器配置
<!-- 设置时间 --> <bean id="myJobTrigger" class="org.springframework.scheduling. ...
- 小游戏banner广告流量量主指引
小程序导航 https://wq.xmaht.top
- tp5.0初入
1.目录结构 |-application 应用目录 是整个网站的核心 |---|---index 前台目录 |---|-----|---controller 控制器 |---|-----|---mod ...