理解Spring IoC与AOP

众所周知,Spring框架是目前很流行的轻量级框架。轻量级框架的重点在于减小了开发的复杂度。Spring是如何做到的呢?这取决于控制反转和面向切面的编程思想的特点。如何理解IoC和AOP呢?

IoC (Inversion of Control)

控制反转:是面向对象编程中很常见的一种原则,旨在将对象的控制权交给容器或框架。对于开发者来说,想要扩展自己的行为和功能,只需要添加框架已有的类和自己所需有的对象即可。
只说定义可能有些抽象,可能会有几点疑问:谁控制谁?控制什么?反转的是什么?

  1. 谁控制谁?
    IoC容器控制对象。
    Spring框架的核心是Spring容器,容器的作用是创建对象,并对其进行配置和组装和管理他们的整个生命周期,这些对象称之为Spring Beans。IoC容器通过依赖注入(DI)的方式创建对象。Spring提供了BeanFactory和ApplicationContext两个接口来定义Spring容器,BeanFactory为DI提供了基本的支持,而ApplicationContext 是 BeanFactory 的子接口。ApplicationContext在BeanFactory的基础上,拓展了一些企业所需的功能,例如从属性文件中解析文本信息。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  1. 控制什么?
    控制所需要被依赖的对象。
    在传统的面向对象编程中,想要使用某对象的行为或属性,需要对其先进行初始化,对于对象的控制权掌握在开发者自己的手中。而再Spring中IoC容器掌握了创建对象的控制权,开发者在使用对象前,无需再手动进行初始化。

  2. 反转的是什么?
    由主动创建(对象)变为被动接受。

  3. DI是什么?
    依赖注入是控制反转的实现,DI的本质就是IoC。
    IoC是从容器角度,DI是从应用程序。
    IoC是设计思想,DI是实现方式。



AOP (Asepct-Orentid-Programming)

面向切面编程:是一种编程思想,是面向对象编程的补充和完善。面向对象编程是将程序抽象成对象,而面向切面编程是将程序抽象成切面,是将程序逻辑分解成不同的部分称为所谓的关注点。想要理解AOP,就必须先理解一些基本的概念。

概念(可忽略)

切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。
连接点(Join point): 在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。
通知(Advice): 在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。
切点(Pointcut): 匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。
引入(Introduction): 声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。
目标对象(Target object): 被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。
织入(Weaving): 把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。


我们可以参照下图和简单的例子来理解这些概念。例如目前有一个具有登陆、结账、换货、退货功能的销售系统,我们想在这些功能的前后加上日志输出的功能。我们并不能在每个方法执行前后加上一段代码来实现这一功能,这会使代码严重冗余,这时AOP便是最佳实践。
图中每个粉色的箭头表示4个功能对应的实现方法,这4个方法就是连接点
我们的关注点是日志的输出,这一动作称为通知,将关注点抽象化,便是切面
切面和连接点交叉的地方,即我们需要加日志输出的地方称为切点

这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

理解AOP

AOP通知的类型

前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。
后置返回通知(After returning advice):在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)。
后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。
后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。
环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型,环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。

AOP的应用场景
  • 日志管理
  • 权限认证
  • 安全检查
  • 事务控制

希望这篇文章能对理解IoC和AOP有一定的帮助,不足之处还需各位大佬及时指正~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值