IOC&&AOP

6 篇文章 0 订阅

一、IOC

一、IOC 和 DI

1、IOC(Inversion of Control):反转控制提供了另一种在应用程序中的组件获取资源的方式:
(1)传统方式:主动的从容器中获取所需要的资源,需要知道特定资源的获取方式,增加了学习成本,降低了开发效率。
(2)反转控制:反转资源的获取方向—由容器主动的将资源推送给需要的组件。不需要知道容器如何创建资源对象,只需要提供接收资源的方式,降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

2、DI(Dependency Injection):依赖注入
是 IOC 的另一种表述方式:
即组件以一些预先定义好的方式(如 setter 方法)接受来自于容器的资源注入。相对于 IOC 而言,这种表述更直接。
实现方式:构造器注入、setter 注入、注解注入、接口注入(侵入性强,目前不再使用)

二、IOC 容器在 Spring 中的实现

在通过 IOC 容器读取 Bean 的实例之前,需要先将 IOC 容器本身实例化。
Spring 提供了 IOC 容器的两种实现方式:
BeanFactory:IOC 容器的基本实现,是 Spring 内部的基础设施,是面向 Spring 本身的,不是提供给开发人员使用的。
ApplicationContext:BeanFactory 的子接口,提供了更多高级特性。是提供给开发人员使用的。
在这里插入图片描述

三、ApplicationContext 的主要实现类

ClassPathXmlApplicationContext对应类路径下的 XML 格式的配置文件FileSystemXmlApplicationContext对应文件系统中的 XML 格式的配置文件 ConfigurableApplicationContext是 ApplicationContext 的子接口,包含一些扩展方法;refresh 和close 让 ApplicationContext 具有启动、关闭和刷新上下文的能力
WebApplicationContext专为 WEB 应用准备,它允许从相对于 WEB 根目录的路径中完成初始化工作

二、AOP

一、概述

1、AOP 是什么
OOP:(Object Oriented Programming)面向对象编程
AOP:(Aspect Oriented Programming)面向切面编程(基于 OOP 基础)

2、AOP 特点
*面向切面编程:在程序运行期间,将某段代码动态的切入到指定方法的指定位置
*AOP 编程操作的主要对象是切面(aspect),而切面模块化横切关注点。
*在应用 AOP 编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的类里——这样的类我们通常称之为“切面”。
在这里插入图片描述
3、AOP 的好处
每个事物逻辑位于一个位置,代码不分散,便于维护和升级
业务模块更简洁,只包含核心业务代码

二、专业术语

在这里插入图片描述
横切关注点:从每个方法中抽取出来的同一类非核心业务。
切面(Aspect):封装横切关注点信息的类,每个关注点体现为一个通知方法。
通知(Advice):切面必须要完成的各个具体工作
目标(Target):被通知的对象
代理(Proxy):向目标对象应用通知之后创建的代理对象
连接点(Joinpoint):横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。
切入点(pointcut):定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物。如果把连接点看作数据库中的记录,那么切入点就是查询条件——AOP可以通过切入点定位到特定的连接点。切点通过aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

三、五种通知

1、前置通知 @Before前置通知:在方法执行之前执行的通知
2、后置通知 @After后置通知:后置通知是在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候。无论连接点是正常返回还是抛出异常,后置通知都会执行。
3、返回通知 @AfterReturning返回通知:如果只想在连接点返回的时候记录日志,应使用返回通知代替后置通知。在返回通知中访问连接点的返回值在返回通知中,只要将 returning 属性添加到 @AfterReturning 注解中,就可以访问连接点的返回值必须在通知方法的签名中添加一个同名参数。在运行时 Spring AOP 会通过这个参数传递返回值原始的切点表达式需要出现在 pointcut 属性中
在这里插入图片描述
4、异常通知 @AfterThrowing异常通知:只在连接点抛出异常时才执行异常通知将 throwing 属性添加到 @AfterThrowing 注解中,也可以访问连接点抛出的异常Throwable 是所有错误和异常类的顶级父类,所以在异常通知方法可以捕获到任何错误和异常如果只对某种特殊的异常类型感兴趣,可以将参数声明为其他异常的参数类型
在这里插入图片描述
5、环绕通知 @Around环绕通知:能够全面地控制连接点,甚至可以控制是否执行连接点连接点的参数类型必须是 ProceedingJoinPoint。它是 JoinPoint 的子接口,允许控制何时执行,是否执行连接点在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed 方法来执行被代理的方法。否则目标方法不会执行环绕通知的方法需要返回目标方法执行之后的结果,即返回 joinPoint.proceed 的返回值,否则会出现空指针异常
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值