(1)IoC的目的是为了管理Bean,而Bean是面向对象(OOP)设计的核心。例如,声明一个用户类或插座类都是基于面向对象的思想。
(2)有些情况是面向对象难以解决的。举个例子,消费部门的订单、消费部门和财务部门三者符合OOP的设计理念。订单发出后,消费部门进行审批并准备付款,但财务部门发现订单价格超出预算,需要取消订单。显然,预算超支不仅影响财务部门,还会影响消费部门之前所做的审批,因此需要撤销这些操作。我们将预算超支称为“切面”,它影响了订单、消费部门和财务部门这三个OOP对象。在理想情况下,这样的切面条件跨越多个对象,并影响它们之间的协作。因此,仅靠面向对象编程并不够,还需要面向切面的编程(AOP),通过它来管理这些切面上的对象之间的协作。
(3)Spring AOP经常用于数据库事务管理。许多情况类似于下面的例子:我们在执行第一步数据库更新后,不确定下一步是否会成功。如果下一步失败,我们会利用数据库事务的回滚功能来撤销第一步的更新,从而确保数据的一致性。在Spring AOP实现的数据库事务管理中,异常被用来触发事务回滚。默认情况下(可以通过Spring配置进行更改),只要Spring接收到异常信息,它就会回滚事务,从而保证数据一致性。这意味着在Spring事务管理中,只要接收到异常信息,Spring就会自动回滚事务,无需通过代码手动处理这一过程。
java
/**
* Spring AOP 处理订单伪代码
* @param order 订单
*/
private void processOrder(Order order) {
// 判断消费部门是否通过订单
boolean passFlag = productionDept.isPass(order);
if (passFlag) {
// 如果消费部门通过,继续进行财务部门审批
if (financialDept.isOverBudget(order)) {
// 如果财务审批超限,抛出异常并回滚事务
throw new RuntimeException("预算超限!!");
}
}
}
在这里,我们看不到任何数据库代码,也没有复杂的try-catch-finally语句。在实际应用中,Spring AOP简化了这些细节,使开发者不需要关心这些底层逻辑,只需专注于业务代码即可。当发生异常时,Spring会自动回滚事务。尽管事务管理和业务逻辑非常复杂,但Spring通过提供隔离级别和传播行为等功能,大大简化了这些任务,减少了开发者的代码量和工作量。