参考文献:https://blog.csdn.net/m0_47495420/article/details/114422268?
一、spring起源、核心讲解
1.1、为什么会出现 Spring(Spring要解决什么问题)
在 Spring 诞生之前,Java EE(EJB)开发存在大量痛点:
- 对象耦合严重 :业务类里面
new大量依赖对象,改一个类,多处代码要修改,单元测试很难,硬编码耦合。
例:
UserService内部new UserDao();如果后续换 Dao 实现,要改 Service 源码。
- EJB笨重复杂:早期EJB需要写接口、部署描述文件,依赖容器,测试必须跑服务器,本地main方法跑不了,开发效率极低。
- 重复样板代码多:JDBC、事务管理,到处写获取连接、关闭连接、try‑catch、事务提交回滚,大量重复模板代码。
- 面向侵入式编程:业务代码和框架API强绑定,业务类要实现框架接口、继承框架类,换框架就要大面积改业务代码。
- AOP横切逻辑散落:日志、权限、事务、监控,每个业务方法里复制粘贴,代码重复,修改要改所有地方。
Spring核心目标:做一个轻量级Java企业开发框架,解耦、简化开发、非侵入,把重复通用能力抽离出来。
1.2、Spring怎么解决这些问题
1. IoC 控制反转(Inverse of Control)
- 原来 :程序员自己
new对象,自己管理对象创建、依赖组装(程序主动控制) - Spring做法 :把对象的创建、依赖装配交给Spring容器 。
你只需要告诉容器哪些类需要管理(注解/XML),容器实例化Bean,自动把依赖注入进来。
控制权反转:从应用代码 → Spring容器。
依赖注入DI是IoC的实现手段。
解决:组件之间强耦合,方便单元测试,切换实现类不用改业务代码。
2. AOP 面向切面编程
把横切公共逻辑 (事务、日志、权限、埋点监控)和业务代码分离。
不用把日志写进每一个业务方法;在不修改业务源代码前提下,给方法增强附加功能。
解决:通用逻辑到处复制,业务代码混杂非业务逻辑。
3. 声明式事务
基于AOP封装事务,不需要手写commit/rollback,一个注解@Transactional就开启事务。
解决JDBC事务大量重复样板代码。
4. 非侵入设计
业务类不需要继承Spring类、不需要实现Spring接口;普通POJO就能交给Spring管理。业务代码不依赖Spring API。
5. 统一抽象集成层
对JDBC、MyBatis、ORM、各种第三方框架做封装适配,统一异常体系,屏蔽底层差异。
如 JdbcTemplate,消除JDBC重复关闭资源代码。
1.3、Spring关键核心技术
1. IoC容器(最核心)
1)BeanDefinition :Bean元数据,描述类信息、依赖、作用域、初始化销毁方法;XML/注解都会解析成BeanDefinition。
2)BeanFactory :Spring最底层容器接口,Bean工厂,负责Bean实例化。
3)ApplicationContext :BeanFactory的子接口,高级容器,扩展能力:国际化、事件发布、资源加载、注解扫描。
4)DI依赖注入 :构造器注入、setter注入、字段注入(@Autowired);推荐构造器注入。
5)Bean生命周期 :实例化 → 属性填充 → 初始化 → 使用 → 销毁。
6)Bean作用域:singleton单例、prototype多实例,request/session(web环境)。
重要:Spring容器默认单例,整个容器一份对象。
2. AOP 面向切面编程
- 核心概念:切面Aspect、连接点JoinPoint、切点Pointcut、通知Advice(before/after/around/after‑returning/after‑throwing)、目标对象Target、代理。
- 两种代理实现:
- JDK动态代理:目标必须实现接口;生成接口代理类。
- CGLIB代理:继承目标类生成子类,不需要接口。
Spring5.x后默认策略:有接口用JDK,无接口CGLIB;SpringBoot2默认CGLIB。
典型应用:@Transactional事务、@Async异步、权限拦截、日志埋点全部基于AOP。
3. 声明式事务
- PlatformTransactionManager:事务管理器接口,不同数据库ORM提供不同实现。
- @Transactional:注解驱动事务,底层AOP拦截方法,自动开启、提交、回滚事务。
- 事务传播行为、隔离级别、回滚规则。
4. Spring资源 & 事件机制
- Resource:统一访问资源(文件、classpath、网络资源)。
- ApplicationEvent 事件发布订阅:容器事件,业务也可以自定义事件,解耦业务流程。
5. Spring体系模块(Spring Framework本体)
- spring‑core:核心工具类
- spring‑beans:Bean工厂,IoC基础
- spring‑context:ApplicationContext容器,扩展能力
- spring‑aop:AOP实现
- spring‑tx:事务支持
- spring‑jdbc:JDBC模板
- spring‑web/spring‑webmvc:web模块(SpringMVC)
⚠️区分:Spring Framework(底层框架) vs SpringBoot(自动配置,快速搭建Spring应用)
SpringBoot不是替代Spring,是Spring的脚手架,自动装配、starter简化配置。
1.4、极简总结背诵版
- 为什么出现Spring:解决早期JavaEE耦合重、样板代码多、测试难、EJB笨重;目标:轻量解耦。
- 两大支柱
- IoC:把对象创建交给容器,DI注入依赖,解除硬编码耦合。
- AOP:把日志、事务等公共逻辑抽离,不修改业务代码做功能增强。
- 关键组件:BeanDefinition、BeanFactory、ApplicationContext、JDK/CGLIB代理、PlatformTransactionManager。
- 衍生能力:声明式事务、JdbcTemplate模板、事件机制。
如果你需要,我可以再给你一份面试口述精简版,或者手写模拟IoC简易实现。
二、 关于Spring、Spring MVC、Spring Boot、Spring Cloud启动流程的标准面试回答如下:
2.1 Spring启动流程
Spring框架启动过程主要围绕IoC(控制反转)容器的初始化,核心是创建和管理Bean对象。具体步骤为:
- 资源定位:通过配置文件(如XML)、注解或Java代码等方式,确定Bean定义的来源。
- Bean定义加载:将资源定位阶段找到的Bean定义信息解析并加载到IoC容器中,以BeanDefinition的形式存储。
- Bean注册:将解析后的BeanDefinition注册到BeanDefinitionRegistry中,IoC容器可以根据这些信息创建和管理Bean实例。
- Bean实例化:在需要使用Bean时,IoC容器根据BeanDefinition创建Bean实例,可能会涉及到依赖注入等操作。
2.2 Spring MVC启动流程
Spring MVC是Spring框架的Web模块,其启动过程与Spring框架紧密相关,主要步骤如下:
- 创建Spring容器:在Web应用启动时,首先创建Spring的IoC容器,加载相关的Bean定义。
- 初始化DispatcherServlet:作为Spring MVC的核心控制器,DispatcherServlet负责接收和分发请求。在初始化过程中,它会加载Spring MVC的配置信息,如HandlerMapping、ViewResolver等。
- 配置HandlerMapping:HandlerMapping负责将请求映射到具体的处理器(Controller),它会根据请求的URL和配置信息,找到合适的处理器。
- 配置ViewResolver:ViewResolver负责将处理器返回的逻辑视图名解析为具体的视图对象,如JSP、Thymeleaf模板等。
- 启动完成:DispatcherServlet初始化完成后,Spring MVC框架就可以开始处理客户端的请求了。
2.3 Spring Boot启动流程
Spring Boot的设计目标是简化Spring应用的开发和部署,其启动流程相对简洁:
- 启动主类 :Spring Boot应用通常有一个带有
@SpringBootApplication注解的主类,该类包含main方法,作为应用的入口点。 - 创建SpringApplication实例 :在主类的
main方法中,会创建一个SpringApplication对象,并调用其run方法。 - 自动配置:Spring Boot根据应用的依赖和配置,自动配置Spring框架和相关组件,减少开发者的手动配置。
- 启动嵌入式服务器:如果应用是Web应用,Spring Boot会自动启动一个嵌入式服务器,如Tomcat、Jetty等。
- 加载应用上下文:创建并加载Spring的应用上下文,将所有的Bean注册到容器中。
- 应用启动完成:当应用上下文加载完成后,Spring Boot应用就正式启动,可以接收和处理请求。
2.4 Spring Cloud启动流程
Spring Cloud是一系列用于构建分布式系统的工具集合,其启动流程与各个组件的功能和依赖有关,一般步骤如下:
- 启动Spring Boot应用:Spring Cloud基于Spring Boot构建,首先需要按照Spring Boot的启动流程启动应用。
- 配置注册中心:如果使用了服务注册与发现组件(如Eureka、Consul),应用会将自己的服务信息注册到注册中心,同时从注册中心获取其他服务的地址。
- 配置网关:如果使用了API网关组件(如Zuul、Spring Cloud Gateway),网关服务会启动并配置路由规则,将请求转发到相应的服务。
- 启动分布式配置中心:如果使用了分布式配置中心(如Spring Cloud Config),应用会从配置中心获取配置信息,确保各个服务使用统一的配置。
- 启动服务调用组件:如果使用了服务调用组件(如Feign、RestTemplate),应用会初始化这些组件,以便在需要时调用其他服务。
- 启动完成:当所有组件都启动并配置完成后,Spring Cloud应用就可以正常运行,实现分布式系统的各个功能。