Spring 核心基础总结(容器 & 注解开发)
本文依旧参考黑马网课ssm进行总结,上一节课的内容:Spring 中的依赖注入与数据源对象管理详解
📚 目录(点击跳转对应章节)
一、Spring 容器(IoC Container)
二、Bean 相关知识
三、Spring 注解开发
四、Bean 生命周期(重点 ⭐)
五、依赖注入(DI)
六、第三方 Bean 管理(重点 ⭐)
七、@Configuration 注解说明
八、XML 配置 vs 注解配置对比
九、总结
一、Spring 容器(IoC Container)
1️⃣ 什么是 Spring 容器
Spring 容器是管理对象(Bean)创建、依赖注入、生命周期的核心组件。
核心思想:
IoC(控制反转)—— 对象的创建和依赖关系由 Spring 容器统一管理,而不是由程序员手动 new。
2️⃣ 创建容器的方式
常见容器接口:
ApplicationContext(推荐,功能更强)BeanFactory(底层接口)
示例:
ApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");3️⃣ 获取 Bean 对象的方式
BookDaobookDao=(BookDao)ctx.getBean("bookDao");BookDaobookDao=ctx.getBean(BookDao.class);BookDaobookDao=ctx.getBean("bookDao",BookDao.class);二、Bean 相关知识
1️⃣ Bean 的定义
Bean 是由 Spring 容器创建、管理和维护的 Java 对象。
2️⃣ Bean 的作用范围(Scope)
| 作用域 | 说明 |
|---|---|
singleton | 单例(默认) |
prototype | 每次获取都创建新对象 |
request | HTTP 请求级别 |
session | HTTP 会话级别 |
@Scope("singleton")三、Spring 注解开发
1️⃣ 使用注解定义 Bean
常用注解:
| 注解 | 作用 |
|---|---|
@Component | 通用组件 |
@Service | 业务层 |
@Repository | 持久层 |
@Controller | 表现层 |
@RepositorypublicclassBookDaoImplimplementsBookDao{}2️⃣ 纯注解开发(无 XML)
核心注解:
@Configuration@ComponentScan("com.example")publicclassSpringConfig{}ApplicationContextctx=newAnnotationConfigApplicationContext(SpringConfig.class);四、Bean 生命周期(重点 ⭐)
1️⃣ 生命周期控制注解
@PostConstruct:初始化方法@PreDestroy:销毁方法✅ 1.
@PostConstruct作用:
标记一个方法,在Bean 实例化并完成依赖注入之后,自动调用该方法进行初始化操作。
⚠️ 注意:这个方法会在构造函数执行完、所有依赖注入完成后才被调用。
示例代码中的使用:
@PostConstructpublicvoidinit(){System.out.println("book init ...");}- 当
BookDaoImpl这个 Bean 被 Spring 容器创建并注入依赖后,会自动调用init()方法。 - 输出:
book init ...
✅ 常用于:
打开数据库连接
加载配置文件
初始化缓存
其他需要在 Bean “准备好” 后执行的操作
✅ 2.
@PreDestroy作用:
标记一个方法,在Bean 被销毁之前自动调用,用于释放资源或执行清理工作。
⚠️ 注意:只有当容器关闭(如应用停止)或 Bean 被显式销毁时才会触发。
示例代码中的使用:
@PreDestroypublicvoiddestroy(){System.out.println("book destory ...");}- 当
BookDaoImplBean 被 Spring 容器移除或销毁前,会调用destroy()方法。 - 输出:
book destory ...
✅ 常用于:
- 关闭数据库连接
- 释放文件句柄
- 清理线程池
- 日志记录等收尾操作
- 当
- 当
@PostConstructpublicvoidinit(){System.out.println("bean init ...");}@PreDestroypublicvoiddestroy(){System.out.println("bean destroy ...");}2️⃣ Bean 生命周期流程(Singleton)
🔄 整体生命周期流程(以 Singleton Bean 为例)
- 构造函数执行
→BookDaoImpl()被调用
→ 输出:book dao constructor ... - 依赖注入完成
- @PostConstruct 方法执行
→init()被调用
→ 输出:book init ... - Bean 可用(进入运行状态)
- 容器关闭 / Bean 销毁
- @PreDestroy 方法执行
→destroy()被调用
→ 输出:book destory ...
执行构造方法
- 构造函数执行
依赖注入完成
执行
@PostConstructBean 就绪
容器关闭
执行
@PreDestroy
五、依赖注入(DI)
依赖注入 = 由 Spring 容器为 Bean 注入其所依赖的对象或数据。
1️⃣ 引用类型注入(自动装配)
@AutowiredprivateBookDaobookDao;- 默认按类型装配
- 可结合
@Qualifier按名称注入
2️⃣ 简单类型注入
@Value("Java编程思想")privateStringbookName;3️⃣ 使用配置文件解耦(推荐)
配置文件:
book.name=Spring BootJava 中使用:
@Value("${book.name}")privateStringbookName;👉 避免硬编码,降低耦合度。
六、第三方 Bean 管理(重点 ⭐)
1️⃣ 不推荐的方式(耦合高)
DruidDataSourceds=newDruidDataSource();2️⃣ 使用@Bean管理第三方 Bean(推荐)
@ConfigurationpublicclassJdbcConfig{@BeanpublicDataSourcedataSource(){returnnewDruidDataSource();}}3️⃣ 配置类的导入方式
✅ 导入式(推荐)
@Import(JdbcConfig.class)❌ 扫描式(不推荐)
@ComponentScan扫描式隐藏性强,容易忘记使用过哪些配置类。
七、@Configuration注解说明
- 标识当前类是Spring 配置类
- 替代 XML 配置文件
- 配合
@Bean、@ComponentScan使用
八、XML 配置 vs 注解配置对比
| 对比项 | XML 配置 | 注解配置 |
|---|---|---|
| 可读性 | 一般 | 高 |
| 开发效率 | 低 | 高 |
| 解耦 | 强 | 稍弱 |
| 维护成本 | 高 | 低 |
| 推荐程度 | ❌ | ✅ |
九、总结
✅ Spring 的核心价值:
- IoC:对象创建交给容器
- DI:降低耦合、提升可维护性
- 注解开发:简化配置、提升开发效率
- 生命周期管理:资源统一初始化与释放
📌最佳实践建议:
- 使用纯注解开发
- 使用配置文件 +
@Value管理常量 - 第三方 Bean 使用
@Configuration + @Bean - 避免硬编码,降低耦合度