Bootstrap

java八股笔记-2-Spring

对 Spring 的理解 

Spring 的框架核心包括:

IoC容器:

Spring 通过控制反转实现了创建对象,以及管理对象对象间的依赖关系。开发者定义好 bean 及其依赖关系后,Spring容器会自动创建对象和组装这些对象。例如:java 中常用 @Autowired 等注解来调用 Sping 容器中的 bean

AOP面向切面编程:

面向切面编程,允许开发者定义横切关注点,如食物管理,安全控制等,独立于业务逻辑的代码。

通过 AOP 我们可以将这些关注点模块化,提高代码的可维护性和可重用性

MVC框架:

Spring MVC 是基于 servlet API 构建的 web 框架,采用了 模型-视图-控制器 的架构,分别对应 M-V-C,它支持灵活的 url 到页面控制器的映射,以及多种视图技术

事物管理:

Spring 提供了一致的事物管理接口,支持声明式和编程式的事物。开发者可以轻松的进行事物管理,无需关系具体的事物 API

Spring IoC 是什么?

IoC 是管理对象的

 IoC,即控制反转,它是一种创建和获取对象的技术思想,依赖注入是实现这种技术的一种方式

我们可以不用关心对象的创建和维护,将其全部交给 IoC 容器来处理

IoC 容器会帮我们创建对象,管理 Bean 生命周期

在项目中的常用操作是使用 @Component 和其改名的注解来声明该类交给 IoC 容器管理

通过 @Autowared 等注解来让 IoC 注入对象实例给该变量

AOP 是什么?

AOP 是处理业务逻辑的

AOP 是对 OOP(面向对象编程)的补充,能够将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,以减少代码的重复,以及降低模块间的耦合度

核心概念:

  • 切面(Aspect):切面是一个包含了横切面关注点的模块,它是 AOP 的核心概念。例如,一个日志切面可以包含记录方法调用开始时间、结束时间以及方法参数和返回值等日志信息的逻辑。切面可以使用 Spring 的@Aspect注解来定义,它将多个通知(Advice)组合在一起,形成一个完整的横切面功能。
  • 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用、方法的执行、异常的抛出等。在 Spring AOP 中,方法调用是最主要的连接点类型。这些连接点是切面可以插入逻辑的地方,就像在一条流水线上的各个关键节点,可以在这些节点上进行额外的操作。
  • 通知(Advice):通知是切面在特定连接点上执行的逻辑。Spring AOP 中有五种类型的通知:
    • 前置通知(Before Advice):在目标方法调用之前执行的通知。例如,在一个业务方法调用前,可以通过前置通知来进行权限检查。
    • 后置通知(After Advice):在目标方法调用之后执行的通知,无论目标方法是否抛出异常都会执行。它可以用于清理资源或者记录方法执行后的状态。
    • 返回通知(After - Returning Advice):在目标方法正常返回后执行的通知。可以用于对返回结果进行处理,如对返回数据进行格式化等。
    • 异常通知(After - Throwing Advice):在目标方法抛出异常后执行的通知。可以用于记录异常信息或者进行异常处理的补偿操作。
    • 环绕通知(Around Advice):环绕通知可以在目标方法调用前后都执行逻辑,它就像一个拦截器,可以完全控制目标方法的执行过程,包括是否执行目标方法以及如何处理返回值和异常。
  • 切入点(Pointcut):切入点是一组连接点的集合,它定义了哪些连接点会被切面的通知所处理。通过定义切入点表达式,可以精确地指定在哪些方法上应用 AOP 逻辑。例如,可以使用execution(* com.example.service.*.*(..))这样的切入点表达式,表示对com.example.service包下的所有类的所有方法应用 AOP 逻辑。

依赖注入(DI)是什么?

依赖注入是将其他对象的创建和绑定过程交给外部容器 IoC 进行,对象只需声明它需要的依赖,无需关心这些依赖是被如何创建和提供的

动态代理是什么?

动态代理指在程序运行时动态创建代理对象的一种机制

什么是反射?有哪些使用场景?

反射式一种强大的机制,允许程序在运行时动态的获取类信息

使用场景:

Spring 的 依赖注入 和 IoC

动态代理 和 AOP

配置文件进行可选项的配置

Spring 如何处理循环依赖问题?

循环依赖是指两个依赖互相依赖于对方

只有同过 setter 方法进行依赖注入的单例模式循环依赖会被 Spring 处理,通过构造方法以及多例模式的循环依赖 Spring 并不会处理,会报异常

解决 setter 方法的单利模式循环依赖,通过三重缓存机制:

1.先创建空对象放入一级缓存

2.若发现循环依赖,在未完成赋值操作是提前暴露 Bean

3.完成属性赋值后,将赋值完的 Bean 放入二级缓存

4.继续完成注入,如果发现循环依赖,从二级缓存重拿到 Bean 后赋值

什么是单例模式,什么是多例模式?

单例模式:在程序的生命周期内,Spring 容器只会对一个 Bean 创建一个对象,只存在这一个对象

多例模式:每一次从容器中获取实例对象 Spring 都会创建一个实例,每一个实例都是独立的,有自己的生命周期和状态

什么是生命周期

指一个对象从创建到被最终被销毁的整个过程

;