SpringBoot与IoC容器
-
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自定义配置,覆盖自动配置的默认值 -
代码审计关联:自动配置可能会开启一些默认安全漏洞(比如默认接口权限、日志配置),需要手动关闭 / 优化
-
-
更多推荐
所有评论(0)