SpringBoot与IoC容器

张开发
2026/4/17 19:23:24 15 分钟阅读

分享文章

SpringBoot与IoC容器
Spring Boot 本质把 Spring 生态Spring MVC、Spring 等整合好开箱即用。核心思想约定优于配置。IoC容器Inversion of Control控制反转官方名ApplicationContext形象理解Spring 是一个大 MapKey类名 / beanNameValue对象实例Bean所有 Bean 默认单例Singleton整个项目只创建一个对象节省内存。Spring 启动过程扫描包 → 找带特定注解的类实例化对象new将对象放入 IoC 容器MapApplicationContext与BeanFactory的区别核心BeanFactory 是 Spring 的基础版容器ApplicationContext 是 BeanFactory 的功能增强版日常开发 99% 用 ApplicationContext。区别对比对比维度BeanFactoryApplicationContext本质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实现对象的自动装配核心关系总结因为我们把控制权交给了 SpringIoC所以才能实现依赖注入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自定义配置覆盖自动配置的默认值代码审计关联自动配置可能会开启一些默认安全漏洞比如默认接口权限、日志配置需要手动关闭 / 优化

更多文章