zoukankan      html  css  js  c++  java
  • 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框架来协助我们更加方便的解决。

  • 相关阅读:
    通过vue-cli命令行安装uni-app
    微信小程序中父子通信
    react启动问题
    react 父子通信
    windows下MongoDB的安装和启动服务--转载
    vue中使用骨架 vue-skeleton-webpack-plugin
    像企业一样思考
    Promise原理详解
    如何封装一个Cookie库
    你应该知道的浏览器缓存知识
  • 原文地址:https://www.cnblogs.com/rekent/p/7250339.html
Copyright © 2011-2022 走看看