• Spring Boot 本质

    • 把 Spring 生态(Spring MVC、Spring 等)整合好,开箱即用。

    • 核心思想:约定优于配置

  • IoC 容器(Inversion of Control控制反转

    • 官方名:ApplicationContext

    • 形象理解:Spring 是一个大 Map

      • Key:类名 / beanName

      • Value:对象实例(Bean)

    • 所有 Bean 默认单例Singleton:整个项目只创建一个对象,节省内存。

  • Spring 启动过程

    • 扫描包 → 找带特定注解的类

    • 实例化对象(new

    • 将对象放入 IoC 容器(Map)

  • ApplicationContext与BeanFactory的区别

    • 核心

      BeanFactory 是 Spring 的基础版容器,ApplicationContext 是 BeanFactory 的功能增强版,日常开发 99% 用 ApplicationContext。

    • 区别对比

      对比维度 BeanFactory ApplicationContext
      本质 IoC 容器的最底层接口,只提供最基础的 Bean 管理能力 继承 BeanFactory,是功能完整的企业级容器
      加载方式 懒加载:用到 Bean 时才实例化,启动快、占内存少 饿加载:启动时一次性实例化所有单例 Bean,启动慢、更稳定
      核心功能 仅支持 Bean 的创建、获取、依赖注入 内置 AOP、国际化、事件机制、资源加载、Web 上下文等全套功能
      适用场景 嵌入式设备、内存极度受限的环境 日常 SpringBoot 项目、Web 项目、企业级开发
      SpringBoot 默认 不直接使用 默认使用 AnnotationConfigApplicationContext
    • 补充

      • BeanFactory 是 Spring 的根容器ApplicationContext 是它的超级子类

      • SpringBoot 启动时,默认创建的就是 ApplicationContext 实例,所有 Bean 启动时就初始化好,避免运行时异常

  • 依赖注入DI)与控制反转(loC)的关系

    • 核心

          IoC 是设计思想,DI 是实现方式;IoC 是目标,DI 是手段。

    • 什么是 IoC(控制反转)

      • 以前:我们自己 new UserService()对象的创建、生命周期完全由我们自己控制

      • 现在:把对象交给 Spring 容器管理,控制权从我们自己反转给了Spring

    • 本质:对象的创建权、管理权交给容器,不再手动 new

    • 什么是 DI(依赖注入)

      • Controller 要用到 Service,不是自己 new,而是让 Spring 把容器里的 Service 对象注入进来

      • 本质:IoC 思想的具体落地,通过注解(@Autowired/@Resource)实现对象的自动装配

    • 核心关系总结

      • 因为我们把控制权交给了 Spring(IoC),所以才能实现依赖注入(DI)

      • 两者不是同一个概念:IoC 是设计原则DI 是实现该原则的具体技术

  • Springboot自动配置原理

    • 核心

          启动时自动扫描、加载、配置所有第三方组件,帮我们把环境搭好。

    • 入口:@SpringBootApplication 注解

      • 这个注解是自动配置的总开关,它包含 3 个核心注解:

        // 本质是@Configuration,标记这是配置类 
        @SpringBootConfiguration 
        // 自动配置的核心开关 
        @EnableAutoConfiguration 
        // 包扫描,加载项目里的Bean 
        @ComponentScan
      • 核心就是 @EnableAutoConfiguration,它会触发自动配置流程。

    • 自动配置的加载机制

      • 旧版本(SpringBoot 2.7 之前):通过 META-INF/spring.factories 文件,里面写死所有要自动配置的类,启动时加载

      • 新版本(SpringBoot 2.7+ 推荐):通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加载自动配置类

      • 原理:SpringBoot 启动时,会扫描所有 Jar 包下的这个文件,把里面的配置类全部加载到容器中

    • 条件注解:按需加载(@Conditional 系列)

      • 自动配置不是无脑加载,而是满足条件才加载,核心靠 @Conditional 系列注解:

      • @ConditionalOnClass:类路径下存在指定类,才加载(比如有 MySQL 驱动,才加载数据源配置)

      • @ConditionalOnProperty:配置文件中存在指定配置,才加载

      • @ConditionalOnMissingBean:容器中没有手动创建的 Bean,才加载自动配置的 Bean(我们可以自定义 Bean 覆盖自动配置)

    • 约定优于配置的落地

      • 我们只需要加一个 spring-boot-starter-web 依赖,SpringBoot 就自动帮我们配置好 Tomcat、SpringMVC、JSON 解析等所有组件

      • 不用写一行 XML 配置,直接写 Controller 就能跑接口,这就是约定优于配置的本质:SpringBoot 帮我们约定好默认配置,不用手动写

    • 补充

      • 自动配置的核心:@EnableAutoConfiguration + 条件注解 + 配置文件

      • 我们可以通过 application.yml 自定义配置,覆盖自动配置的默认值

      • 代码审计关联:自动配置可能会开启一些默认安全漏洞(比如默认接口权限、日志配置),需要手动关闭 / 优化

更多推荐