核心思想:

spring的核心:

IOC和AOP

用到了哪些设计模式:

bean的创建:

单例模式

工厂模式

ioc:

对ioc的理解?

用ioc容器来控制对象,控制就是对象的创建,初始化,销毁。解决了繁琐的对象生命周期操作。

ioc如何实现的?

依赖注入和容器实现

依赖注入,控制反转分别是什么?

控制反转:流程的控制权从程序员变成了框架

依赖注入:将依赖的类对象通过在外部创建好通过构造函数,函数参数等方式给类使用

如何实现依赖注入:

构造器注入

Setter方法注入

字段注入

spring容器里存储的是什么?

Bean对象

Bean是单例的吗?

默认是单例,也可以通过修改作用域使Bean在每次请求都会创建一个实例。

单例Bean要考虑线程安全问题。

Bean的作用域:

可以通过scope注解自定义实现,默认都是单例,还有像prototype这样的。

Bean的生命周期

生命周期:

1:实例化

2:属性赋值

3:初始化方法:

初始化的前置方法

初始化方法

初始化的后置方法

4:使用

5:销毁

spring如何解决循环依赖?三级缓存结构是什么?为什么用三级缓存解决循环依赖问题?

1:

三级缓存

2:

一级是已经完成实例化的

二级是正在进行属性注入但是发现有循环依赖的

三级是未经加工的工厂,里面创建了原始类,可以通过这个工厂的getObject来获取这个类,如果这个类被代理就会创建代理对象

3:

为了正确处理AOP代理的Bean。
三级缓存只是提前“借调”了一次同样的钩子,保证循环依赖时注入的引用就是最终形态,且不会重复生成代理。

AOP:

AOP的概念:

面向切面编程,能够将与业务无关,却为业务模块所共同调用的逻辑封装起来

大大降低了代码的重复率,降低模块之间的耦合度。

AOP通过什么机制实现的?

动态代理

事务管理:

概念:

spring提供了一致的事务管理接口,支持声明式和编程式事务。

什么时候会失效?

第一种,@Transactional 注解用在非 public 修饰的方法上。

因为:Spring 的 AOP 代理机制决定了它无法代理 private 方法。

第二种,方法内部调用。

原因:使用的是 this 引用,直接访问原始对象的方法,绕过了 Spring 的代理对象,也就导致代理对象中的事务逻辑没有机会执行。

第三种,如果在事务方法内部用 try-catch 捕获了异常,但没有在 catch 块中将异常重新抛出,或者抛出一个新的能触发回滚的异常。

原因:那么 Spring 的事务拦截器就无法感知到异常的发生,也就没办法回滚。

第四种,Spring 事务默认只对 RuntimeException 和 Error 类型的异常进行回滚。

springmvc:

处理流程:

1:用户发起的 HTTP 请求,首先会被 DispatcherServlet 捕获

2:会根据 URL、请求方法等信息,交给 HandlerMapping 进行路由匹配,查找对应的处理器,也就是 Controller 中的具体方法。

3:找到对应 Controller 方法后,DispatcherServlet 会委托给处理器适配器 HandlerAdapter 进行调用。

4:Controller 方法最终会返回结果,比如视图名称、ModelAndView 或直接返回 JSON 数据。

springboot:

springboot比spring好在哪?

提供了自动配置

内嵌多种服务器

自动配置和自动装配:

自动配置:

classpath中有springboot-starter-*就默认注册所需的全套Bean

一些相关配置只需要在yml中改改就可以了

自动装配:

是实现自动配置的方法

约定优于配置:

Spring Boot 先帮 80 % 的场景定好“潜规则”,你按规则放东西就行;只有剩下 20 % 的个性化需求才需要你去改 yml 或写配置。