专项攻克——spring、springMVC、springBoot、springCloud的启动流程

发布时间:2026/8/23 9:14:26
专项攻克——spring、springMVC、springBoot、springCloud的启动流程 参考文献https://blog.csdn.net/m0_47495420/article/details/114422268?一、spring起源、核心讲解1.1、为什么会出现 SpringSpring要解决什么问题在 Spring 诞生之前Java EEEJB开发存在大量痛点对象耦合严重业务类里面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 面向切面编程把横切公共逻辑事务、日志、权限、埋点监控和业务代码分离。不用把日志写进每一个业务方法在不修改业务源代码前提下给方法增强附加功能。解决通用逻辑到处复制业务代码混杂非业务逻辑。** 案例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容器最核心1BeanDefinitionBean元数据描述类信息、依赖、作用域、初始化销毁方法XML/注解都会解析成BeanDefinition。2BeanFactorySpring最底层容器接口Bean工厂负责Bean实例化。3ApplicationContextBeanFactory的子接口高级容器扩展能力国际化、事件发布、资源加载、注解扫描。4DI依赖注入构造器注入、setter注入、字段注入Autowired推荐构造器注入。5Bean生命周期实例化 → 属性填充 → 初始化 → 使用 → 销毁。6Bean作用域singleton单例、prototype多实例request/sessionweb环境。重要Spring容器默认单例整个容器一份对象。2. AOP 面向切面编程核心概念切面Aspect、连接点JoinPoint、切点Pointcut、通知Advicebefore/after/around/after‑returning/after‑throwing、目标对象Target、代理。两种代理实现JDK动态代理目标必须实现接口生成接口代理类。CGLIB代理SpringBoot默认继承目标类生成子类不需要接口。Spring5.x后默认策略有接口用JDK无接口CGLIBSpringBoot2默认CGLIB。典型应用Transactional事务、Async异步、权限拦截、日志埋点全部基于AOP。代码案例专项案例-AOP实现接口前后打印日志3. 声明式事务PlatformTransactionManager事务管理器接口不同数据库ORM提供不同实现。Transactional注解驱动事务底层AOP拦截方法自动开启、提交、回滚事务。事务传播行为、隔离级别、回滚规则。4. Spring资源 事件机制Resource统一访问资源文件、classpath、网络资源。ApplicationEvent 事件发布订阅容器事件业务也可以自定义事件解耦业务流程。5. Spring体系模块Spring Framework本体spring‑core核心工具类spring‑beansBean工厂IoC基础spring‑contextApplicationContext容器扩展能力spring‑aopAOP实现spring‑tx事务支持spring‑jdbcJDBC模板spring‑web/spring‑webmvcweb模块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定义加载(loadBeanDefinitions)将资源定位阶段找到的Bean定义信息解析并加载到IoC容器中以BeanDefinition的形式存储。Bean注册(BeanDefinitionRegister)将解析后的BeanDefinition注册到BeanDefinitionRegistry中IoC容器可以根据这些信息创建和管理Bean实例。Bean实例化(createBeanInstance)在需要使用Bean时IoC容器根据BeanDefinition创建Bean实例可能会涉及到依赖注入等操作。2.2 Spring MVC启动流程Spring MVC是Spring框架的Web模块其启动过程与Spring框架紧密相关主要步骤如下创建Spring容器在Web应用启动时首先创建Spring的IoC容器加载相关的Bean定义。初始化DispatcherServlet【Dispatcher调度的意思】【ServletServer Applet是Java Servlet的简称】DispatcherServlet作为Spring MVC的核心前端控制器负责接收和分发请求。在初始化过程中它会加载Spring MVC的配置信息如HandlerMapping、ViewResolver等。配置HandlerMappingHandlerMapping负责将请求映射到具体的处理器Controller它会根据请求的URL和配置信息找到合适的处理器。配置ViewResolverViewResolver负责将处理器返回的逻辑视图名解析为具体的视图对象如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档基础版1‑2分钟回答、深入版3‑5分钟加分基于Spring Boot主流底层还是Spring容器refresh()核心。面试基础版必背普通二面Spring Boot应用入口是main方法执行SpringApplication.run()整体分为两大阶段准备环境阶段 刷新Spring容器(refresh)阶段。实例化SpringApplication对象推断应用类型SERVLET/REACTIVE加载META‑INF/spring.factories拿到初始化器、监听器。执行run方法启动引导开启计时器创建SpringApplicationRunListeners发布应用开始启动事件。准备环境Environment加载配置application.yml/properties、系统变量、环境变量激活profile。创建ApplicationContext容器根据环境推断容器类型一般是AnnotationConfigServletWebServerApplicationContext。执行ApplicationContextInitializer对容器做前置初始化。发布环境准备完成事件。核心refresh()刷新容器【Spring最核心流程】// AbstractApplicationContextrefresh()①prepareRefresh()准备刷新设置激活标记初始化属性资源。②obtainFreshBeanFactory()获取/刷新BeanFactory解析所有配置类、扫描Component加载Bean定义BeanDefinition此时还没有实例化Bean只是元数据。③prepareBeanFactory()给BeanFactory设置类加载器、SpEL解析器、注册部分内置Bean后置处理器。④postProcessBeanFactory()BeanFactory后置处理留给子类扩展。⑤invokeBeanFactoryPostProcessors()执行BeanFactory后置处理器重点ConfigurationClassPostProcessor处理Configuration、ComponentScan补全BeanDefinition。⑥registerBeanPostProcessors()注册Bean后置处理器AOP的AnnotationAwareAspectJAutoProxyCreator就在这里注册。⑦initMessageSource()初始化国际化资源。⑧initApplicationEventMulticaster()初始化事件广播器。⑨onRefresh()SpringBoot在这里启动内嵌Tomcat/Web服务器。⑩registerListeners()注册事件监听器。⑪finishBeanFactoryInitialization()实例化所有非懒加载单例Bean执行实例化→依赖注入(Autowired)→初始化方法(PostConstruct、InitializingBean、init‑method)循环依赖主要发生在这里。⑫finishRefresh()完成刷新发布容器刷新完成事件SpringBoot中启动完成后输出banner回调ApplicationRunner、CommandLineRunner。JVM注册关闭钩子容器等待应用启动完成。一句话总结先加载配置元数据BeanDefinition再refresh容器注册各种后置处理器实例化单例Bean最后启动web服务。面试深入版三面/高级岗追问回答面试官喜欢问的点高频追问1BeanDefinition和Bean区别BeanDefinition元数据描述这个bean的class、scope、依赖只是配置信息还没new对象。Bean真正实例化出来的Java对象在finishBeanFactoryInitialization才创建。高频追问2BeanFactoryPostProcessor 和 BeanPostProcessor区别BeanFactoryPostProcessor作用于BeanDefinition阶段Bean还没创建可以修改Bean定义执行在实例化Bean之前。代表ConfigurationClassPostProcessor解析配置类。BeanPostProcessor作用于Bean实例化之后初始化前后对bean对象做增强。代表AOP代理处理器、AutowiredAnnotationBeanPostProcessor处理Autowired注入。记忆口诀Factory改定义Post改对象。高频追问3AOP是什么时候生效registerBeanPostProcessors()阶段注册AOP的后置处理器Bean初始化完成之后判断是否需要代理生成代理对象替换原始Bean。高频追问4循环依赖发生在哪一步三级缓存作用发生在finishBeanFactoryInitialization实例化单例bean阶段。实例化new对象还没赋值→放入三级缓存填充属性Autowired依赖注入执行初始化Spring仅支持单例setter/字段注入循环依赖不支持构造器注入循环依赖。高频追问5refresh里面onRefresh做什么SpringBoot重写该方法创建并启动内嵌Tomcat容器原生Spring框架这里是空实现。高频追问6SpringBoot的run和Spring的区别原生Spring需要手动new ClassPathXmlApplicationContext().refresh()SpringBoot的SpringApplication.run封装了环境准备、自动配置、内嵌web服务器启动。面试精简背诵小抄可以直接口头输出面试官说下Spring的启动流程答SpringBoot入口是main方法调用SpringApplication.run。第一步构建SpringApplication读取spring.factories拿到监听器和初始化器第二步run方法中准备Environment环境加载配置文件第三步创建ApplicationContext容器最核心是refresh()方法1.准备刷新获取BeanFactory扫描解析得到所有BeanDefinition2.执行BeanFactory后置处理器修改Bean定义注册Bean后置处理器AOP在这里注册3.初始化组件、事件广播器onRefresh启动内嵌web容器4.注册监听器然后实例化所有非懒加载单例Bean完成依赖注入、初始化5.最后finishRefresh发布事件注册关闭钩子整个容器启动完成。2.4 Spring Cloud启动流程重要资料专项攻克-springcloud及其组件Spring Cloud是一系列用于构建分布式系统的工具集合其启动流程与各个组件的功能和依赖有关一般步骤如下启动Spring Boot应用Spring Cloud基于Spring Boot构建首先需要按照Spring Boot的启动流程启动应用。配置注册中心如果使用了服务注册与发现组件如Eureka、Consul应用会将自己的服务信息注册到注册中心同时从注册中心获取其他服务的地址。配置网关如果使用了API网关组件如Zuul、Spring Cloud Gateway网关服务会启动并配置路由规则将请求转发到相应的服务。启动分布式配置中心如果使用了分布式配置中心如Spring Cloud Config应用会从配置中心获取配置信息确保各个服务使用统一的配置。启动服务调用组件如果使用了服务调用组件如Feign、RestTemplate应用会初始化这些组件以便在需要时调用其他服务。启动完成当所有组件都启动并配置完成后Spring Cloud应用就可以正常运行实现分布式系统的各个功能。