Spring 的 ioc 控制反转

口语化回答

好的,面试官,控制反转通过将对象的创建和依赖关系的管理交给SpringIoC 容器,极大地提高了代码的模块化和可维护性。IoC 的主要实现方式是依赖注入DI,其中通过构造函数注入、Setter方法注入和字段注入等形式来注入,这样 Spring容器能够自动管理对象的依赖关系,使得应用程序代码更加简洁。

题目解析

重点高频题。主要思路就是聊 ioc 是什么,再说说 di 的形式,最后说一下好处即可。

面试得分点

反转,解耦,注入

题目详细答案

什么是控制反转(IoC)?

在传统的编程模型中,应用程序代码通常直接控制对象的创建 和依赖关系。例如,一个对象需要依赖另一个对象时,通常会在代码中直接创建依赖对象。这种方式使得代码紧密耦合,不利于测试和维护。

控制反转 的理念是将这种控制权从应用程序代码中移除,转而交给一个容器来管理。这个容器就是Spring IoC容器。通过这种方式,对象的创建 和依赖 关系的管理被反转了,应用程序代码不再负责这些new 对象 和创建依赖关系的任务,而是由容器来处理。

依赖注入(DI)

依赖注入是实现控制反转的一种方式。它主要有以下几种形式:

构造函数注入:

通过构造函数将依赖对象传递给被依赖对象。

复制代码
public class Service {
    private final Repository repository;

    public Service(Repository repository) {
        this.repository = repository;
    }
}

Setter方法注入:

通过Setter方法将依赖对象注入到被依赖对象中。

复制代码
public class Service {
    private Repository repository;

    public void setRepository(Repository repository) {
        this.repository = repository;
    }
}

字段注入:

直接在字段上使用注解进行注入。

复制代码
public class Service {
    @Autowired
    private Repository repository;
}

Spring IoC 容器

Spring IoC容器负责管理应用程序中对象的生命周期 和依赖关系。它的主要职责包括:

对象的创建:根据配置文件或注解创建对象。

依赖注入:将对象的依赖注入到相应的对象中。

对象的销毁:在适当的时候销毁对象,释放资源。

配置方式

Spring IoC容器可以通过多种方式进行配置:

XML配置:

通过XML文件定义Bean及其依赖关系。

复制代码
<beans>
    <bean id="repository" class="com.example.Repository"/>
    <bean id="service" class="com.example.Service">
        <constructor-arg ref="repository"/>
    </bean>
</beans>
@Configuration+@Bean注解配置:

通过Java类和注解定义Bean及其依赖关系。

复制代码
@Configuration
public class AppConfig {
    @Bean
    public Repository repository() {
        return new Repository();
    }

    @Bean
    public Service service() {
        return new Service(repository());
    }
}

@Bean****方法默认单例, 所以Service****中绑定的 Repository****和上面定义的 Repository****是同一个 Bean。这是 Spring 的默认行为。等价于以下写法

复制代码
@Bean
public OrderService orderService(UserDao userDao) { // 参数由Spring自动注入
    return new OrderService(userDao);
}
@Component+@Autowired注解配置:

通过注解(如@Component,@Autowired)自动扫描和注入Bean。

复制代码
@Component
public class Repository {
}

@Component
public class Service {
    @Autowired
    private Repository repository;
}
相关推荐
邪修king2 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料2 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y3 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
曹牧8 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头8 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记8 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
紧跟先前的步伐9 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵9 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨9 小时前
spring auth 核心流程详解
java·后端·spring
文丑颜不良啊11 小时前
LeetCode201~225题目解析
java·leetcode