对 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 都会创建一个实例,每一个实例都是独立的,有自己的生命周期和状态
什么是生命周期
指一个对象从创建到被最终被销毁的整个过程