第4章 Spring 核心 任务3 Spring AOP 的简单运用

本文介绍了Spring AOP的基本概念和作用,强调了AOP在处理横切逻辑,如日志和事务管理中的重要性。通过代理模式解释了如何在不改变原有代码的基础上增强功能,包括切面、连接点、增强处理等关键概念,并提到Spring AOP框架在实际应用中的功能。
摘要由CSDN通过智能技术生成

任务3  Spring AOP 的简单运用

关键步骤如下:

掌握 Spring AOP 的原理

使用 Spring AOP 实现自动化的系统日志功能

4.3.1  认识 AOP

     面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展

到一定阶段的产物,是对面向编程(Object Oriented Promming,OOP)的有益补充。

AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能监测等。

    什么是横切逻辑呢?我们先来看下面这段程序代码。

/**
 * 用户业务类,实现对 User 功能的业务管理
 */
public class UserServiceImpl implements UserService {
  private static final Logger log = Logger.getLogger(UserServiceImpl.class);
  public boolean addNewUser(User user){
      log.info("添加用户"+user.getUsername());
      SqlSession sqlSession = null;
      boolean flag = false;
      try {
          sqlSession = MyBatisUtil.createSqlSession();
          if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
              flag = true;
          sqlSession.commit();
          log.info("成功添加用户" + user.getUsername());
      }catch (Exception e){
          log.error("添加用户"+user.getUsername()+"失败",e);
          sqlSession.rollback();
          flag = false;
      }finally {
          MyBatisUtil.closeSqlsession(sqlSession);
      }
      return flag;
  }
}

在该段代码中,UserService 的 addNewUser()方法根据需求增加了日志和事务功能。

这是一个再典型不过的业务处理方法。日志、异常处理、事务控制等,都是一个

健壮的业务系统所必需的。但为了保证系统健壮可用,就要在众多的业务方法中反复

编写类似代码,是的原本就很复杂的业务处理代码变得更加复杂。业务功能的开发

者还要关注这些“额外”的代码是否处理正确,是否有遗漏。如果需要修改日志信息

的格式或者安全验证的规则,或者再增加新的辅助功能,都会导致业务代码频繁而大量

的修改。

      在业务系统中,总有一些散落、渗透到系统各处且不得不处理的事情,这些穿插在

既定业务中的操作就是所谓的“横切逻辑”,也称为切面。怎样才能不受这些附加要求的干扰,

专注于真正的业务逻辑呢?我们很容易想到的就是将这些重复性的代码抽取出来,

放在专门的类和方法中处理,这样就便于管理和维护了。但即使如此,依然无法实现既定

业务的横切逻辑的彻底解耦合,因为业务代码中还要保留对这些方法的调用代码,当

需要增加或减少横切逻辑的时候,还是要修改业务方法中的调用代码才能实现。我们希望的

是无需编写显示的调用,在需要的时候,系统能够'自动”调用所需的功能,这正是AOP

要解决的主要问题。

      面向切面编程,简单地说就是在不改变原有程序的基础上为代码段增加新的功能,

对其进行增强处理。它的设计思想来源于代理设计模式,下面以图示的方式进行简单的

说明。通常情况下调用对象的方法如图 4.7 所示。

   在代理模式中可以为对象设置一个代理对象,代理对象为 fun() 提供了一个代理方法,

当通过代理对象的fun()方法调用原对象的fun()方法时,就可以在代理方法中添加新的功能,

这就是所谓的增强处理。增强的功能既可以插到原对象的 fun() 方法前面,也可以插到

其后面,如图 4.8所示。

                  图4.8   通过代理对象调用方法

     在这种模式下,给编程人员的感觉就是在源于代码乃至原业务流程都不改变的情况

下,直接在业务流程中切入新代码,增加新功能,这就是所谓的面向切面编程。对

面向切面编程有了感性认识后,还需要了解它的一些基本概念。

1.切面(Aspect):一个模块化的横切逻辑(或称横切关注点),可能会横切多个对象。

2.连接点(Join Point):程序执行中的某个具体的执行点。图4.8 中原对象的

fun() 方法就是一个连接点。

3.增强处理(Advice);切面在某个特定连接点上执行的代码逻辑。

4.切入点(Pointcut):对连接点的特征进行描述,可以使用正则表达式。增强处理

和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。

5.目标对象(Target object):被一个或多个切面增强的对象。

6.AOP代理(AOP proxy);由 AOP 框架所创建的对象,实现执行增强处理方法等功能。

7.织入(Weaving);将增强处理连接到应用程序中的类型或对象上的过程。

8.增强处理类型:如图4.8所示,在原对象的 fun() 方法之前插入的增强处理为前置

增强,在该方法正常执行完以后插入的增强处理为后置增强,此外还有环绕增强、

异常抛出增强、最终增强等类型。

     说明:

            切面可以理解为有增强处理和切入点组成,既包含了横切逻辑的定义,也包含

了连接点的定义。面向切面编程主要关心两个问题,即在什么位置执行什么功能。

Spring AOP 是负责实施切面的框架,即由 Spring AOP 完成织入工作。

        Advice 直译为“通知”,但这种叫法并不确定,在此处翻译成“”增强处理”,更便于

理解。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值