黑马八股--spring框架学习

【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】

1.Spring-单例bean是线程安全的吗

单例 Bean 是否线程安全,核心看有没有多线程共享的可变成员变量 。 没有可变共享变量就是安全的;存在可变成员变量,并发访问会出现线程安全问题。

解决方式:

优先使用局部变量;

需要线程独立数据用 ThreadLocal;

共享读写可以加锁;

也可以设置为多例 Bean,但一般不推荐

问:改成 prototype 多例就一定线程安全吗? 答:不一定!多例只是容器每次获取新建对象,如果业务代码手动共享对象引用,依旧会存在并发问题。线程安全本质看对象是否被多线程共享,不是单例、多例。

2.Spring-AOP相关面试题

事务->AOP->动态代理

案例

该案例就是将记录日志的时候将 业务代码和记录日志的代码耦合分离

Spring中的事务是如何实现的

总结

3.Spring-事务失效的场景

情况四:

this 导致事务失效:

带@Transactional的 Bean,Spring 存到 IOC 容器里的是代理对象 ,只有调用代理,AOP 才会拦截、开启事务。 this是 Java 原生关键字,永远指向原始裸对象,不走代理,切面拦截失效,事务直接不生效

失效代码示例:

复制代码
@Service
public class AccountService {
    public void outer() {
        // this = 原生对象,绕过代理
        this.inner(); 
    }
    @Transactional
    public void inner() {
        // 事务完全失效,报错不会回滚
    }
}

3 种快速解决办法:

  1. 外层方法也加 @Transactional(最简单)
  2. 自注入自己 :@Autowired private AccountService self; 用self.inner()调用
  3. 拆分逻辑到另一个 Service,跨类调用(最优架构方案)

一句话总结:

外部@Autowired注入拿的是代理;类内this是原生对象,自调用事务失效。

4.Spring-bean的生命周期(难)

掌握spring的框架,可以方便调试和解决问题,掌握框架

记忆

造对象(构造)→ 填属性(注入)→ 认容器(Aware)→ 前置增强 → 三段初始化(注解→接口→自定义)→ 后置生成代理 → 停机销毁

结合生命周期流程图,启动项目打印顺序:

  1. 构造函数(先 new 空对象)
  2. 依赖注入(@Autowired 属性赋值)
  3. Aware 接口回调(先setBeanFactory → 再setApplicationContext)
  4. BeanPostProcessor #before 前置方法
  5. 初始化方法区(固定顺序) ① @PostConstruct注解方法 ② InitializingBean 的afterPropertiesSet() ③ 自定义 init 方法(@Bean (initMethod))
  6. BeanPostProcessor #after 后置方法(这里生成 AOP 代理)
  7. 项目关闭时执行销毁:@PreDestroy销毁方法'

为什么 Aware 在注入之后、初始化之前?

因为 Aware 要给 Bean 传递容器对象,必须等属性全部注入完成后,再让 Bean 感知 Spring 容器;此时对象属性已经填充完毕。

Spring 把你配置的依赖(比如在 XML 里 <property>,或者用注解 @Autowired)填充到 Bean 中,让它"有东西可用"。它解决了依赖注入的问题。如果一个类需要另一个类(比如 UserService 需要 UserRepository),通过这一阶段,Spring 会自动把依赖注入进去,你不用手动 new 了。

这里aop错了

JDK 动态代理:基于接口

CGLIB 动态代理:生成子类、基于继承

5.Spring-bean的循环依赖(循环引用)

二级缓存解决普通对象

首先就是

三级缓存解决大多数对象创建问题

总结:看这个即可

6.Springmvc-执行流程

此流程是jsp的

现在前后端的流程

8.Springboot-自动配置原理

9.spring框架常见的注解

spring

springmvc

springboot

10.MyBatis-执行流程

MyBatis 首先加载xml 配置 和 Mapper 映射 ,构建 SqlSessionFactory ; 利用工厂创建 SqlSession ;SqlSession 通过Executor 执行 SQ L; MappedStatement 保存 SQL 以及对象映射信息,负责 Java 对象 和数据库数据转换,完成数据库操作

11.Mybatis-延迟加载使用及原理(看看即可)

第一第二张图就好

局部延迟加载

全局延迟加载

12.Mybatis-一级、二级缓存

注意:一级缓存仅仅存在于同一个事务中。

开启二级缓存

相关推荐
kkkkkkkkkk_Z6 分钟前
新手自学嵌入式 | 学习日记:ARM架构初探与基础概念梳理
arm开发·学习·架构
caoerzhong14 分钟前
跨境海外仓怎么管:JeeWMS 开源 Java 仓库管理系统打通头程、海外仓与尾程
java·开发语言·开源
MayBaymax20 分钟前
Elasticsearch 原理与用法
java·elasticsearch
鬓戈21 分钟前
开源中文输入法技术调研与自建方案
学习·开源
马剑威(威哥爱编程)22 分钟前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
IT枫斗者枫哥24 分钟前
AI返回合法JSON,字段就可信吗?给抽取结果补一道业务校验
java·人工智能·后端
用户31268748772026 分钟前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java
IT枫斗者枫哥28 分钟前
同一个requestId换了参数,为什么不能直接返回旧结果?
java·后端
天天被压力29 分钟前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #06】Python实时行情总报错?五档盘口+逐笔一次跑通
java·人工智能·python
今年下半年42 分钟前
【网站连通性检测】java项目telnet、curl命令的使用
java·curl·telnet