Spring & SpringBoot & MyBatis

Spring

单例Bean线程安全

详解
Spring 中的单例 bean 默认不保证线程安全。
因为 singleton 只表示容器中只有一个实例,这个实例会被多个线程共享访问。

如果 bean 中存在可变的成员变量,并且在业务方法中被多个线程同时修改,就会发生线程安全问题。
但在实际开发中,大多数 Spring bean 都会设计成无状态的,
只使用方法参数和局部变量,所以通常可以安全使用。

如果 bean 必须保存状态,可以通过去状态化、加锁、使用原子类、ThreadLocal,或者调整 bean 作用域等方式处理。

AOP

AOP详解

可以无侵入式地添加功能 & 更好实现代码的复用

  • 场景: 记录操作日志
  • 缓存处理
  • spring中内置的事务处理
Pasted image 20260314214704

事务失效

Spring事务 = AOP代理 + 方法拦截 + 异常触发回滚

  • AOP代理

    1. 自己new对象, 非spring bean
    2. 类内部自调用, 没有经过AOP代理
    3. final、private不能Override, CGLIB代理(生成子类来加强)失效
  • 方法拦截

    1. 非public不拦截 , Spring AOP默认只拦截public方法

    private 不满足 可被代理增强的方法可见性条件,外部代理调不到它。 –> 可见性
    final 不满足 可被子类重写增强 这个条件,CGLIB 没法覆盖它。 –> 子类增强
    static 不满足 基于对象实例调用代理链 这个条件,它属于类,不属于对象。–>对象调用代理链

  • 异常触发

    1. 非RuntimeException 失效 —> @Transactional(rollbackFor=Exception.class)
    2. 自行处理异常 失效 —> throw new RuntimeException(e)

Spring Bean lifeCircle

Pasted image 20260316085028

Spring Bean的生命周期

Spring 首先会解析配置生成 BeanDefinition。
然后实例化 Bean,调用构造函数创建对象。
接着进行依赖注入,完成属性填充。
如果 Bean 实现了 Aware 接口,Spring 会回调相关方法注入容器对象。
随后进入初始化阶段,包括 BeanPostProcessor 的 before 方法、初始化方法以及 after 方法。
在 after 阶段如果需要 AOP,Spring 会创建动态代理对象。
最后 Bean 初始化完成并加入容器。
容器关闭时会执行销毁方法。

bean的循环依赖

Pasted image 20260316174805
  • 只有一级缓存的情况下
Pasted image 20260316092122
  • 一级二级缓存

    可以解决一般对象的循环依赖问题, 但不能解决代理对象的循环依赖问题

Pasted image 20260316103152
  • 三级缓存
Pasted image 20260316174228
  • 构造方法产生的循环依赖, spring无法解决, 用懒加载解决
1
2
3
4
public A(@ Lazy B b){
"这是A的构造方法".sout;
this.b = b;
}

SpringMVC执行流程

视图版本

Pasted image 20260316210624

SpringMVC 是 Spring 提供的 Web 层框架,主要负责处理客户端请求和响应。

请求到达后会先进入 DispatcherServlet,它作为统一前端控制器负责整体调度。
接着 DispatcherServlet 会通过 HandlerMapping 根据请求路径找到对应的 Handler,
也就是 Controller 中能处理该请求的方法,同时返回包含拦截器的 HandlerExecutionChain。
之后 DispatcherServlet 再交给 HandlerAdapter,由它完成参数绑定、类型转换、方法调用和返回值处理,最终执行目标 Handler。

如果返回的是页面,则会经过 ViewResolver 进行视图解析并渲染.
如果返回的是对象,则通常通过消息转换器转成 JSON 响应给前端.
SpringMVC 的本质就是把 HTTP 请求映射成 Java 方法调用,再把结果封装成 HTTP 响应。

前后端分离阶段

没有视图解析器和视图展示

Pasted image 20260316231626

SpringBoot自动配置