快递100 是专业的快递物流互联网平台,为数以亿计的用户提供快递物流的查、寄件服务。快递100 的各种服务已经稳定高效的运行了多年,为中国的快递物流行业的快速发展做出了很大的贡献,这一切都离不开背后默默贡献的程序猿们。
从第一个独立站点上线至今,快递100 已经走过了10个年头,10年沧海桑田,10年经历了一次又一次的技术、架构升级。近年来,由于spring-boot、spring-cloud技术的兴起,快递100 技术团队也开始对后端服务进行重构,基于spring-boot、spring-cloud技术,对原有的系统进行微服务化改造。在改造的前期,由于许多开发人员对spring系列的技术缺少系统性的认知,所以我们编辑整理了一个spring系列技术使用的手册,帮助开发人员可以快速的上手。
文章目录
1. Spring AOP简介
AOP是Aspect Oriented Programming(面向切面编程)的简写。与传统OOP自上而下的开发模式相比,AOP是一种“横向”的编程技术,其解决的问题,是OOP自上而下的编程方式所不能解决的横切性的问题。
举个例子,假如我们有两个业务逻辑模块A和B,在处理这两个模块的数据更新时,均需要经过:①获取连接->②开启事务->③执行业务数据更新操作->④记录日志->⑥提交(回滚)事务 等几个步骤,这几个步骤中,除了“③执行业务更新操作”是各个业务模块所独有的操作,其他几个步骤,对于不同的业务模块来说都是可以通用的。基于OOP的设计方式,只能够将这些步骤对应的操作封装成对象,然后在A、B两个业务模块中去进行调用。比如开启和提交、回滚事务的操作,可以封装成事务管理器(TransactionManager)对象,提供beginTransaction()、commitTransaction()、rollbackTransaction()方法,在A、B的业务代码中分别调用,这会导致事务管理的代码散落在不同的模块,增加后面维护的难度,同时这也会使业务模块的关注点偏离自身的核心业务。
AOP正是为了解决这样的问题而设计,在AOP的编程模式中,通过对应用系统进行横向的切割,将系统中的不同业务模块共同的部分进行抽象,形成横向的切面,将类似记录日志、事务管理这些各个业务逻辑处理中都涉及到的部分,集中到切面中进行处理,方便进行维护,同时也让业务模块将关注点集中到自身的业务逻辑。
Spring AOP是spring框架的两大核心理念之一(另外一个是IoC),spring生态中许多组件,都是基于Spring AOP的理念,将一些通用的功能从业务代码中分离出来,在无需侵入应用代码的情况下,对应用代码进行增强。Spring AOP基于IoC容器,通过Bean的后置处理器(BeanPostProcessor接口实现类)对满足切面逻辑的Bean进行增强处理,实现AOP。
2. 相关名词说明
2.1 连接点(Joinpoint)
连接点是指程序运行中的特定位置,如类开始初始化、初始化后、方法调用前、方法调用后、方法返回前、方法抛出异常前等等,连接点是程序代码中拥有特定边界性质的特定的点,AOP编程可以通过连接点对业务代码进行增强。Spring AOP仅支持方法级别的连接点,只能在方法调用前、方法调用后、方法返回前、方法抛出异常和方法调用前后这几个连接点对应用代码进行增强。
连接点由两个信息确定:一是用方法表示的程序的执行点,二是用相对点表示的方位。
2.2 切点(Pointcut)
切点是指AOP编程是对特定连接点的定位。程序中每个类都有很多个连接点,比如一个类拥有多个方法,每个方法都是一个连接点,但并不是每个连接点都需要进行增强,因此AOP中通过切点来描述需要进行增强的连接点。
切点和连接点不是一一对应的关系,一个切点可以匹配多个连接点,Spring AOP中,切点通过org.springframework.aop.PointCut接口实例进行描述,使用类和方法来定位连接点。但由于只能定位到方法,而连接点是方法执行前、执行后、返回前、抛出异常前和执行前后,因此还需要方位信息,才能定位到对应的连接点。
2.3 通知(Advice)
通知是织入到连接点的一段代码,是AOP编程中需要业务实现的主体部分。除此之外,在Spring AOP中,通知还包含方位信息,这样,结合切点的信息,就可以定位到具体的连接点。简单来说,就是切点可以定位到方法,结合不同的通知类型,就可以定位到方法中不同的连接点。如前置通知定位到方法执行前的连接点,后置通知则可以定位到方法执行后的连接点。
Spring AOP支持的通知有如下几种:
- 前置通知:在方法调用前的连接点增强
- 后置通知:在方法调用后的连接点增强
- 异常通知:在方法抛出异常后的连接点增强
- 返回通知:在方法返回后的连接点增强
- 环绕通知:在方法调用前后的连接点增强
从几种通知的描述我们可以看到,通知的类型本身,就包含了方位信息,在切点定位到方法的前提下,结合通知的方位信息,就可以定位连接点。
2.4 目标对象(Target)
目标对象是指AOP