跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring IoC 容器核心机制与注解配置实战

Spring IoC 容器通过描述而非代码硬编码来管理对象生命周期与依赖关系。核心接口包括底层的 BeanFactory 和扩展功能更强的 ApplicationContext。通过@Configuration 和@Bean 注解配合 AnnotationConfigApplicationContext,开发者可以构建全注解式的 IoC 环境,实现 Bean 的定义、注册与获取。掌握容器机制是深入理解 Spring 框架的基础。

DockerOne发布于 2025/1/19更新于 2026/10/2592 浏览
Spring IoC 容器核心机制与注解配置实战

Spring 的核心价值在于其设计理念而非单纯的技术实现。控制反转(IoC)与面向切面编程(AOP)是两大基石,其中 IoC 更是 Spring 的根基。本章聚焦于基于注解的 IoC 实践,这也是 Spring Boot 开发的主流方式。

核心概念

传统开发中,对象通常通过 new 关键字直接实例化。而在 Spring 体系中,对象的创建和依赖管理交由容器处理。我们通过描述(如注解或 XML)来定义 Bean,容器负责装配这些对象及其关系。例如,一个'班级'对象依赖于多个'老师'和'同学',这种依赖关系同样由容器维护。

在 Spring 中,所有需要管理的对象统称为 Bean,而管理它们的容器被称为 IoC 容器。它主要承担两个职责:

  • 管理 Bean 的生命周期(定义、发布、获取、销毁);
  • 管理 Bean 之间的依赖关系。

容器的两大接口

IoC 容器的底层核心是 BeanFactory 接口。虽然实现类众多,但理解其基本方法足以应对大部分场景。

public interface BeanFactory {
    // 根据名称获取 Bean
    Object getBean(String name) throws BeansException;
    // 根据类型获取 Bean
    <T> T getBean(Class<T> requiredType) throws BeansException;
    // ... 其他方法
}

实际开发中,更常用的是 ApplicationContext,它是 BeanFactory 的子接口。相比基础接口,它扩展了国际化支持、事件发布、资源解析等高级功能。

从架构上看,ApplicationContext 继承了 BeanFactory 的所有能力,并增加了消息源、环境配置和应用事件发布等功能。在 Spring Boot 环境下,推荐使用 AnnotationConfigApplicationContext 进行全注解配置,这与生产环境的容器行为最为接近。

实战:构建第一个 IoC 容器

1. 定义 Bean

首先创建一个简单的角色类作为被管理的对象。

package com.example.demo.po;

public class Role {
    private Long id;
    private String roleName;
    private String note;

    public Long getId() { return id; }
    public   { .id = id; }
     String  {  roleName; }
       { .roleName = roleName; }
     String  {  note; }
       { .note = note; }
}
void
setId
(Long id)
this
public
getRoleName
()
return
public
void
setRoleName
(String roleName)
this
public
getNote
()
return
public
void
setNote
(String note)
this

2. 配置容器

使用 Java 配置类替代传统的 XML,这更符合现代 Spring Boot 的开发习惯。

package com.example.demo.conf;

import com.example.demo.po.Role;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    
    @Bean("role")
    public Role initRole() {
        var role = new Role();
        role.setId(1L);
        role.setRoleName("admin_role");
        role.setNote("system_admin");
        return role;
    }
}

这里有两个关键注解:

  • @Configuration:标识该类为配置类,用于定义 Bean 的生成逻辑。
  • @Bean:标注在方法上,表示该方法的返回值将注册到 IoC 容器中,默认 Bean 名称为方法名,此处显式指定为 "role"。

3. 启动与获取

最后编写主程序,初始化容器并获取 Bean。

package com.example.demo;

import com.example.demo.conf.AppConfig;
import com.example.demo.po.Role;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        // 初始化容器,传入配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        
        try {
            // 通过类型获取 Bean
            Role role = ctx.getBean(Role.class);
            System.out.println(role.getRoleName());
        } finally {
            // 关闭容器,释放资源
            ctx.close();
        }
    }
}

运行后,控制台会输出 Bean 的初始化日志及最终结果:

role_name_1

这表明容器已成功加载配置,创建了 Role 实例并注入了属性值。整个过程展示了从定义 Bean 到容器管理再到最终使用的完整链路。后续我们会进一步探讨组件扫描等更便捷的配置方式。

目录

  1. 核心概念
  2. 容器的两大接口
  3. 实战:构建第一个 IoC 容器
  4. 1. 定义 Bean
  5. 2. 配置容器
  6. 3. 启动与获取

更多推荐文章

查看全部
  • Python 核心知识点速查:31 个基础要点
  • 昇腾 NPU 运行 Llama 模型:环境搭建与性能测试
  • NSP 新范式:AI 世界模型构建与物理规律建模指南
  • C++ 继承入门 (下):友元、静态成员与菱形继承的底层逻辑
  • 基于 Coze 构建 AI 应用及 Web 部署指南
  • HarmonyOS6 RcInput 组件核心架构与类型系统设计
  • Python 核心语法速查:数据类型与基础操作
  • VS Code SSH 远程环境中 Copilot 无模型选项问题修复
  • Git 版本控制基础操作指南
  • JavaSE 基础:JVM 内存、类加载与 GC 机制
  • 深入辨析 PLC 编程语言:ST、STL 与 SCL 的区别
  • 嵌入式与工控核心技术解析:C#, PLC, STM32, FPGA, DSP 及 HMI
  • Java 智能仿真无人机项目 4.0 核心实现
  • 企业级 AIGC 生图落地方案:如何平衡质量、成本与速度
  • Testsigma开源自动化测试平台部署与使用指南
  • AI 创作入门:普通人如何通过 AMA 互动实现成长
  • MySQL 事务与锁机制深度解析
  • DooTask 融合 AI 技术重构企业任务管理流程
  • 大模型落地应用的关键基础设施与行业实践
  • Git 入门教程:安装、配置与分支管理

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online