Spring 框架是一个开源的 Java 平台,它提供了全面的基础设施支持,以便您可以更容易地开发 Java 应用程序。Spring 处理了基础设施,这样您就可以专注于您的应用程序。在 Spring 框架中,IoC(Inverse of Control,控制反转)和 DI(Dependency Injection,依赖注入)是两个核心概念。
IoC(控制反转)
IoC 是一种设计原则,它将控制权从对象转移给容器。在传统的编程中,对象自己负责获取它们的依赖关系。而在 IoC 容器中,对象不再需要自己查找或创建依赖关系,而是 IoC 容器负责将这些依赖关系注入到对象中。
IoC 容器管理对象的生命周期和依赖关系,这使得代码更加模块化,更易于测试和维护。IoC 容器通常使用配置文件或注解来描述依赖关系。
DI(依赖注入)
DI 是 IoC 的一种实现方式。它是一种技术,其中一个或多个对象(依赖项)被传递到需要它们的对象(客户端)中,而不是客户端自己创建或查找依赖项。
依赖注入可以通过以下方式实现:
- 构造函数注入:通过构造函数将依赖项传递给对象。
- setter 注入:通过 setter 方法将依赖项设置到对象中。
- 字段注入:直接在对象的字段上注入依赖项(这种方式不推荐,因为它违反了封装性)。
Spring IoC 容器
Spring IoC 容器是 Spring 框架的核心,负责管理应用对象的生命周期和依赖关系。容器使用配置元数据来生成和管理应用对象,这些元数据可以是 XML、Java 注解或 Java 代码。
Spring IoC 容器的关键特征:
- 依赖注入:容器能够自动将组件依赖的关系注入到组件中。
- 容器管理的对象称为 Bean:在 Spring 中,由 IoC 容器管理的对象称为 Bean。Bean 可以是 Java 类的实例,接口实现,或者任何其他你喜欢的对象。
- Bean 生命周期管理:容器管理 Bean 的完整生命周期,从创建、初始化、使用到销毁。
- 作用域:Spring 支持多种 Bean 作用域,如 singleton(单例)、prototype(原型)、request、session 等。
Spring IoC 容器的工作原理:
- 定义 Bean:通过 XML 文件或注解来定义 Bean 的配置。
- 加载配置:容器加载配置信息,可以是 XML 文件、注解或 Java 配置类。
- 创建 Bean:容器根据配置信息创建 Bean 实例。
- 依赖注入:容器解析 Bean 之间的依赖关系,并将它们注入到相应的 Bean 中。
- 初始化:在 Bean 完全初始化之后,调用任何初始化方法(如
@PostConstruct
注解的方法)。 - 使用 Bean:容器将完全初始化的 Bean 提供给应用程序。
- 销毁:在容器关闭时,调用 Bean 的销毁方法(如
@PreDestroy
注解的方法)。
Spring 的其他核心概念:
- @Component:表示一个受 Spring IoC 容器管理的组件。
- @Service:通常用于标注服务层的组件。
- @Repository:用于标注数据访问层的组件,如 DAO(Data Access Object)。
- @Controller:用于标注表现层的组件,如 MVC 控制器。
- @Autowired:用于自动注入依赖项。
- @Qualifier:当有多个同一类型的 Bean 时,用于指定要注入的具体 Bean。
- @Scope:用于指定 Bean 的作用域。
- @Configuration:用于标注配置类,可以替代 XML 配置。
- @Bean:用于在配置类中声明一个 Bean。
Spring IoC 和 DI 的强大之处在于它们提供了一种声明式的配置方法,可以轻松地管理依赖关系,从而使得代码更加简洁、易于测试和维护。通过使用 Spring,开发者可以遵循 SOLID 原则和设计模式,构建出松耦合、可重用的应用程序。