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(底层接口)
    在这里插入图片描述

示例:

ApplicationContext ctx =
    new ClassPathXmlApplicationContext("applicationContext.xml");

3️⃣ 获取 Bean 对象的方式

BookDao bookDao = (BookDao) ctx.getBean("bookDao");
BookDao bookDao = ctx.getBean(BookDao.class);
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);

二、Bean 相关知识

1️⃣ Bean 的定义

Bean 是由 Spring 容器创建、管理和维护的 Java 对象。


2️⃣ Bean 的作用范围(Scope)

作用域说明
singleton单例(默认)
prototype每次获取都创建新对象
requestHTTP 请求级别
sessionHTTP 会话级别
@Scope("singleton")

三、Spring 注解开发

1️⃣ 使用注解定义 Bean

在这里插入图片描述

常用注解:

注解作用
@Component通用组件
@Service业务层
@Repository持久层
@Controller表现层
@Repository
public class BookDaoImpl implements BookDao {
}

2️⃣ 纯注解开发(无 XML)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

核心注解:

@Configuration
@ComponentScan("com.example")
public class SpringConfig {
}
ApplicationContext ctx =
    new AnnotationConfigApplicationContext(SpringConfig.class);

四、Bean 生命周期(重点 ⭐)

1️⃣ 生命周期控制注解

  • @PostConstruct:初始化方法

  • @PreDestroy:销毁方法

    ✅ 1. @PostConstruct
    作用:

    标记一个方法,在 Bean 实例化并完成依赖注入之后,自动调用该方法进行初始化操作。

    ⚠️ 注意:这个方法会在构造函数执行完、所有依赖注入完成后才被调用。

    示例代码中的使用:
    @PostConstruct
    public void init(){
        System.out.println("book init ...");
    }
    
    • 当 BookDaoImpl 这个 Bean 被 Spring 容器创建并注入依赖后,会自动调用 init() 方法。
    • 输出:book init ...

    ✅ 常用于:

    • 打开数据库连接

    • 加载配置文件

    • 初始化缓存

    • 其他需要在 Bean “准备好” 后执行的操作

      ✅ 2. @PreDestroy
      作用:

      标记一个方法,在 Bean 被销毁之前 自动调用,用于释放资源或执行清理工作。

      ⚠️ 注意:只有当容器关闭(如应用停止)或 Bean 被显式销毁时才会触发。

      示例代码中的使用:
      @PreDestroy
      public void destroy(){
          System.out.println("book destory ...");
      }
      
      • 当 BookDaoImpl Bean 被 Spring 容器移除或销毁前,会调用 destroy() 方法。
      • 输出:book destory ...

      ✅ 常用于:

      • 关闭数据库连接
      • 释放文件句柄
      • 清理线程池
      • 日志记录等收尾操作
@PostConstruct
public void init() {
    System.out.println("bean init ...");
}

@PreDestroy
public void destroy() {
    System.out.println("bean destroy ...");
}

2️⃣ Bean 生命周期流程(Singleton)

  1. 🔄 整体生命周期流程(以 Singleton Bean 为例)
    1. 构造函数执行
      → BookDaoImpl() 被调用
      → 输出:book dao constructor ...
    2. 依赖注入完成
    3. @PostConstruct 方法执行
      → init() 被调用
      → 输出:book init ...
    4. Bean 可用(进入运行状态)
    5. 容器关闭 / Bean 销毁
    6. @PreDestroy 方法执行
      → destroy() 被调用
      → 输出:book destory ...

    执行构造方法

  2. 依赖注入完成

  3. 执行 @PostConstruct

  4. Bean 就绪

  5. 容器关闭

  6. 执行 @PreDestroy


五、依赖注入(DI)

依赖注入 = 由 Spring 容器为 Bean 注入其所依赖的对象或数据。


1️⃣ 引用类型注入(自动装配)

@Autowired
private BookDao bookDao;
  • 默认按 类型 装配
  • 可结合 @Qualifier 按名称注入外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2️⃣ 简单类型注入

@Value("Java编程思想")
private String bookName;

3️⃣ 使用配置文件解耦(推荐)

配置文件:

book.name=Spring Boot

Java 中使用:

@Value("${book.name}")
private String bookName;

👉 避免硬编码,降低耦合度。


六、第三方 Bean 管理(重点 ⭐)

1️⃣ 不推荐的方式(耦合高)

DruidDataSource ds = new DruidDataSource();

2️⃣ 使用 @Bean 管理第三方 Bean(推荐)

@Configuration
public class JdbcConfig {

    @Bean
    public DataSource dataSource() {
        return new DruidDataSource();
    }
}

3️⃣ 配置类的导入方式

✅ 导入式(推荐)
@Import(JdbcConfig.class)
❌ 扫描式(不推荐)
@ComponentScan

扫描式隐藏性强,容易忘记使用过哪些配置类。


七、@Configuration 注解说明

  • 标识当前类是 Spring 配置类
  • 替代 XML 配置文件
  • 配合 @Bean、@ComponentScan 使用

八、XML 配置 vs 注解配置对比

在这里插入图片描述

对比项XML 配置注解配置
可读性一般高
开发效率低高
解耦强稍弱
维护成本高低
推荐程度❌✅

九、总结

✅ Spring 的核心价值:

  • IoC:对象创建交给容器
  • DI:降低耦合、提升可维护性
  • 注解开发:简化配置、提升开发效率
  • 生命周期管理:资源统一初始化与释放

📌 最佳实践建议:

  • 使用 纯注解开发
  • 使用 配置文件 + @Value 管理常量
  • 第三方 Bean 使用 @Configuration + @Bean
  • 避免硬编码,降低耦合度

更多推荐