IoC容器

前言

IoC容器是Spring框架的核心组成部分之一。它是一个负责对象创建、组装和管理的容器,通过控制对象的创建和依赖关系的注入,实现了对象之间的解耦和灵活性。

在传统的编程模型中,对象的创建和控制权通常由开发者负责,开发者需要手动实例化对象、处理对象之间的依赖关系并进行组装,这样的过程非常繁琐且容易出错。

而在IoC容器中,开发者只需要通过配置或注解告诉容器需要创建的对象以及对象之间的依赖关系,容器会负责实例化对象、处理依赖注入,并管理对象的生命周期。这样,开发者只需专注于业务逻辑的编写,而将对象的创建和管理交给IoC容器处理。

Spring框架提供了多种实现IoC容器的方式,最常用的是基于XML和基于注解的配置方式。通过在配置文件或代码中描述Bean的定义、依赖关系和作用域等信息,Spring容器会在应用程序启动时读取配置并将对应的对象实例化和组装起来。在开发中,一般都用注解的方式来实现IoC容器。

什么是IoC容器

IoC容器是Spring框架的核心,通过实现IoC(控制反转)和DI(依赖注入),以降低类与类之间的依赖程度(降低耦合度)。

IoC(控制反转)

控制反转就是应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护是由外部容器负责的。这样控制权就由应用本身转移到了外部容器,控制权的转移就是所谓的反转(降低了业务对象之间的依赖程度,降低耦合度)。

DI(依赖注入)

依赖注入是对象之间的依赖关系是运行时动态注入的(本质是利用Java的反射机制)。

依赖注入的几种方式

  • 构造器注入
  • 方法注入
  • 接口注入

注意:Spring中只支持构造器注入和方法注入。

属性注入

属性注入是直接在属性上面加上@Resource注解或者@Autowired注解。

复制代码
@Component //等价于 <bean id="student" class="bean.Student" /> Bean的默认id是类名的小字母小写,即student
public class Student {
    @Value("张三")
    private String name;
    @Value("9527")
    private int id;
//    @Resource
    @Autowired  //默认采用byType方式,如果byType失效,则采用byName方式,如果byName失效则抛出异常
    private Teacher teacher;

方法注入

方法注入是直接在setter方法加上@Autowired注解。

复制代码
@Component //等价于 <bean id="student" class="bean.Student" /> Bean的默认id是类名的小字母小写,即student
public class Student {
    @Value("张三")
    private String name;
    @Value("9527")
    private int id;
    
    private Teacher teacher;
    
    @Autowired //自动装配Bean(依赖注入的方法注入)
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
}

构造器注入

当两个类属于强关联时,我们可以通过构造器的方式来实现依赖注入。

复制代码
@Component //等价于 <bean id="student" class="bean.Student" /> Bean的默认id是类名的小字母小写,即student
public class Student {
    @Value("张三")
    private String name;
    @Value("9527")
    private int id;
    
    private Teacher teacher;

    @Autowired //自动装配Bean(依赖注入的构造器注入)
    public Student(Teacher teacher) {
        this.teacher = teacher;
    }
}

总结

IoC容器是Spring框架的核心特征,通过它可以实现对象的创建、依赖注入和生命周期管理,帮助开发者更加高效地开发和管理应用程序。使用用IoC容器可以降低代码之间的耦合度、方便进行单元测试和模拟对象、提升代码的可维护性和扩展性。

相关推荐
杨丰玮41812 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
莫得感情 o38 分钟前
踩坑 - 压测三轮后 502:一个默认 10 的连接池如何拖垮整个服务
java
Escalating_xu39 分钟前
【Linux线程】线程控制全解析:终止、join/detach、cancel、线程栈与 NPTL(下篇)
java·linux·运维
2602_959960921 小时前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
吃饱了得干活1 小时前
限界上下文之后:微服务怎么拆、上下文怎么聊?
java·后端·架构
yngsqq1 小时前
窗体快速取消
java·开发语言
岁月如歌77862 小时前
一次讲透 Redis 缓存击穿、穿透、雪崩,从原理到实战解决方案
java·后端·架构
weixin_BYSJ19872 小时前
springboot智慧公共交通系统---附源码51123
java·javascript·spring boot·python·django·flask·php
AI多Agent协作实战派2 小时前
AI多Agent协作系统实战(四十六):改了十次规则,AI员工还是老样子——会话缓存的坑
java·spring·缓存
一知半解仙2 小时前
当机器人学会泛化,而我在写Java:一名后端开发者的2026年8月21日观察手记
java·开发语言·机器人