大白话关于Spring的两大核心IOC和AOP详解

Spring

Spring是一个开源的轻量级的Java开发框架,用于简化应用程序的开发。

Spring的两大核心理念

IoC是Inversion of Control的缩写,译为控制反转,是一种设计思想。
IoC理论:借助于“第三方”实现具有依赖关系的对象之间的解耦。降低对象之间的耦合度。更加便于维护。

AOP为Aspect Oriented Programming的缩写
意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

传统程序设计:

当我们在对象内部通过new进行创建对象,是通过程序主动去创建依赖对象。

IOC

而IoC是有专门一个容器来创建这些对象,即由IoC容器来控制对象的创建。

为什么称为反转? 因为容器帮我们查找及注入依赖对象,对象只是被动的接收依赖对象,所以称为反转。

什么反转了呢? 获取对象的过程反转了!!!通俗的讲IOC就是一个对象制造工厂,需要什么对象就直接从IOC容器中取就可以了。

IOC底层原理

xml解析,工厂模式,反射。

IOC实现方式

Spring提供IOC两种实现方式:BeanFactory和ApplicationContext接口。

  1. BeanFactory接口:实现IOC容器Spring内部使用接口,不提供开发人员进行使用。当在加载配置文件的时候不会去创建对象,只有在使用或者使用对象的时候才去创建对象

  2. ApplicationContext接口:BeanFactory的子接口,一般供开发人员使用。从一开始加载配置文件的时候就会把配置文件对象创建。

AOP

AOP为Aspect Oriented Programming的缩写
意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

概念

目标对象(target)

   目标对象指将要被增强的对象,即包含主业务逻辑的类对象。

连接点(JoinPoint)

   程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

连接点由两个信息确定:

   方法(表示程序执行点,即在哪个目标方法)

   相对点(表示方位,即目标方法的什么位置,比如调用前,后等)

   简单来说,连接点就是被拦截到的程序执行点,因为Spring只支持方法类型的连接点,所以在Spring中连接点就是被拦截到的方法。

代理对象(Proxy)

AOP中会通过代理的方式,对目标对象生成一个代理对象,代理对象中会加入需要增强功能,通过代理对象来间接的方式目标对象,起到增强目标对象的效果。

Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。

JDK 动态接口代理

  1. JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类: Proxy 和 InvocationHandler 。
    InvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动 态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建一个符合某一接口的实 例,生成目标类的代理对象。
    CGLib 动态代理
  2. CGLib 全称为 Code Generation Library ,是一个强大的高性能,高质量的代码生成类库,可以 在运行期扩展 Java 类与实现 Java 接口, CGLib 封装了 asm ,可以再运行期动态生成新的 class 。 和 JDK 动态代理相比较: JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通 过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。

通知(Advice)

需要在目标对象中增强的功能,如上面说的:业务方法前验证用户的功能、方法执行之后打印方法的执行日志。

通知中有2个重要的信息:方法的什么地方,执行什么操作,这2个信息通过通知来指定。

方法的什么地方?之前、之后、包裹目标方法、方法抛出异常后等。

如:

在方法执行之前验证用户是否有效。

在方法执行之后,打印方法的执行耗时。

在方法抛出异常后,记录异常信息发送到mq。

切入点(Pointcut )

用来指定需要将通知使用到哪些地方,比如需要用在哪些类的哪些方法上,切入点就是做这个配置的。

切面(Aspect)

通知(Advice)和切入点(Pointcut)的组合。切面来定义在哪些地方(Pointcut)执行什么操作(Advice)。

顾问(Advisor)

 Advisor 其实它就是 Pointcut 与 Advice 的组合,Advice 是要增强的逻辑,而增强的逻辑要在什么地方执行是通过Pointcut来指定的,所以 Advice 必需与 Pointcut 组合在一起,这就诞生了 Advisor 这个类,spring Aop中提供了一个Advisor接口将Pointcut 与 Advice 的组合起来。

Advisor有好几个称呼:顾问、通知器。

其中这4个:连接点(JoinPoint)、通知(advise)、切入点(pointcut)、顾问(advisor),在spring中都定义了接口和类来表示这些对象,下面我们一个个来看一下。

实例



你可能感兴趣的:(JAVA,java,后端)