每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Spring学习笔记(三)-AOP-传统方法面临的问题

Spring学习笔记(三)-AOP-传统方法面临的问题

传统开发方式面临的问题:
  • 定义一个接口与实现类,该类中除了要实现接口中的方法外,还要再写两个非业务的方法(daTransaction:用于事务管理,daLog用于日志管理),再使用接口方法进行调用

  •  @Override
        public List<Account> findAllAccount() {
            try {
                //1.开启事务
                txManager.beginTransaction();
                //2.执行操作
                List<Account> accounts = accountDao.findAllAccount();
                //3.提交事务
                txManager.commit();
                //4.返回结果
                return accounts;
            }catch (Exception e){
                //5.回滚操作
                txManager.rollback();
                throw new RuntimeException(e);
            }finally {
                //6.释放连接
                txManager.release();
            }
    
        }
    
  • 繁琐、重复、耦合高、对于业务的拓展、维护、更改非常不友好

  • 一个解决思路:使用动态代理对方法进行增强

  • IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
                    producer.getClass().getInterfaces(),
                    new InvocationHandler() {
                        /**
                         * 作用:执行被代理对象的任何接口方法都会经过该方法
                         * 方法参数的含义
                         * @param proxy   代理对象的引用
                         * @param method  当前执行的方法
                         * @param args    当前执行方法所需的参数
                         * @return        和被代理对象方法有相同的返回值
                         * @throws Throwable
                         */
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            //提供增强的代码,可以在此进行事务管理,日志记录
                            Object returnValue = null;
                            //1.获取方法执行的参数
                            Float money = (Float)args[0];
                            //2.判断当前方法是不是销售
                            if("saleProduct".equals(method.getName())) {
                                returnValue = method.invoke(producer, money*0.8f);
                            }
                            return returnValue;
                        }
                    });
    
AOP面向切面编程
  • Aspect Orient Programming,给业务增加功能为切面,一般为非业务功能,k可复用如:日志、事务管理、权限检查、参数检查、信息统计... ...
  • oop:以对象为核心,考虑对象的属性、对象的交互
  • aop:以切面为核心,在设计项目时,就需要找出切面的功能,安排切面执行的时间,以及执行的位置
  • AOP的作用:
    • 让切面功能复用
    • 使开发专注逻辑,提高效率
    • 实现业务功能与非业务功能的解耦合
    • 给与存在的功能以增强
  • JoinPoint连接点:连接切面的-业务方法,在该业务方法执行时,会同时执行切面的功能
  • Pointcut切入点:一个或多个连接点的集合,在这些方法执行时都能够增加切面的功能,是切面执行的位置
  • target目标对象:给谁增加切面功能,谁就是目标对象
  • Advice通知/增强:表示切面执行的时机
  • AOP最重要的三要素:Aspect、Pointcut、Advice,在Advice时机于Pointcut位置执行Aspect
posted @ 2020-12-09 13:56  雨下整夜~  阅读(106)  评论(0)    收藏  举报