系统中的业务可以分为核心关注点横切关注点

  核心关注点时业务处理的主要流程,而横切关注点是与核心业务无关但更为通用的业务。

  各个横切关注点离散地穿插于核心业务之中,导致系统地每一个模块都与这些业务具有很强的依赖性,当需要添加新的横切功能时,需要大幅修改已有的代码,这些都严重影响了系统的可维护性和可拓展性。

  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的简单理解的更多相关文章

  1. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  2. Spring学习笔记4——AOP

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  3. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  4. Spring学习笔记六:Spring整合Hibernate

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html  前言:整合概述 Spring整合Hibernate主要是把Hibernate中常用的S ...

  5. [Spring学习笔记 4 ] AOP 概念原理以及java动态代理

    一.Spring IoC容器补充(1) Spring IoC容器,DI(依赖注入): 注入的方式:设值方法注入setter(属性注入)/构造子注入(构造函数传入依赖的对象)/字段注入Field(注解) ...

  6. Spring学习笔记2—AOP

    1.AOP概念 AOP(Aspect Oriented Programming):面向切面编程,AOP能够将那些与业务无关,却为业务模块所共同调用的应用(例如事务处理.日志管理.权限控制等)封装起来, ...

  7. Spring学习笔记之AOP配置篇(一)

    [TOC] 1. 创建并声明一个切面 首先,创建一个类,添加@Component注解使其添加到IoC容器 然后,添加@Aspect注解,使其成为一个切面 最后,在配置文件里面,使用<aop:as ...

  8. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  9. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  10. Spring学习笔记(六)—— SSH整合

    一.整合原理 二.整合步骤 2.1 导包 [hibernate] hibernate/lib/required hibernate/lib/jpa 数据库驱动 [struts2] struts-bla ...

随机推荐

  1. OC#import和#include的异同

    1.#import和#include相同1.1都可以用在OC程序中起到导入文件的作用1.2同样的 包含系统文件都是<>,是包本地文件都用""例如:系统文件#import ...

  2. caffe怎么把全连接层转成convolutional层

    caffe中有把fc层转化为conv层的,其实怎么看参数都是不变的,对alex模型来说,第一个fc层的参数是4096X9216,而conv的维度是4096x256x6x6,因此参数个数是不变的,只是需 ...

  3. machine learning trends from nips14

    from John Platt, Deputy Managing Director and Distinguished Scientist at Microsoft Research http://b ...

  4. react(一):组件的生命周期

    最近兄弟团队让我去帮忙优化两个页面,前端用的react全家桶,后端用的python,上一次写react代码都过去一年了,顺着以前的的学习思路,再捋顺一下react的要点 组件的生命周期就是Reac的工 ...

  5. 5.Spring Cloud初相识-------Hystrix熔断器

    前言: 1.介绍Hystrix 在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情.Hy ...

  6. linux下安装xtrabackup

    下载需要的版本的xtrabackup软件包,链接如下: https://www.percona.com/downloads/XtraBackup/LATEST/ percona-xtrabackup- ...

  7. JAVAOOP多态

    概念:不同对象对于同一个操作做出的相应不同 实现方法:父类:抽象类 抽象方法 子类:普通类 重写抽象方法 同名 父类:普通类 普通方法 子类:普通类 普通方法 同名 父类:接口 抽象方法 实现类:普通 ...

  8. Deepin15.7 更改软件的jdk

    最近更新了系统,发现smartsvn.smartgit.Dbeaver都无法打开了,上网googlel一下,发现是java9的问题,需要把软件的java版本更改一下就可以了 先上jdk的位置 一.sm ...

  9. 将Komodo Edit打造成Python开发的IDE

    Komodo Edit 支持Python 界面清爽, 将Komodo Edit 设置成Python的IDE,具体操作方法如下: 先添加自定义命令. 再设置命令行参数 设置高级选项 设置快捷键 完成.

  10. ubuntu配置命令

    sudo apt-get update 更新源 sudo apt-get install package 安装包 sudo apt-get remove package 删除包 sudo apt-ca ...