中山网站优化营销,门户网站系统设计,做网站的意义,本地用织梦做网站1. 什么是依赖注入#xff08;Dependency Injection#xff0c;DI#xff09;#xff1f;
依赖注入 是 Spring IoC#xff08;控制反转#xff09;容器的核心功能。它的目标是将对象的依赖#xff08;如其他对象或配置#xff09;从对象本身中剥离#xff0c;由容器负…1. 什么是依赖注入Dependency InjectionDI
依赖注入 是 Spring IoC控制反转容器的核心功能。它的目标是将对象的依赖如其他对象或配置从对象本身中剥离由容器负责注入这些依赖。
关键概念
依赖 一个对象需要的其他对象或资源。例如UserController 需要 UserService。注入 Spring 容器在创建对象时将依赖对象传递给它而不是对象自己去创建。 2. Bean 创建与依赖注入的关系
Bean 创建
Spring 容器根据定义如 XML 配置、注解或 Java 配置实例化一个类生成一个对象。
依赖注入
创建 Bean 之后Spring 容器会检查这个对象是否有依赖项并将所需的依赖注入进去。
两者的区别
Bean 创建 生成一个对象的实例。依赖注入 为创建的对象注入其所需的依赖。
联系
依赖注入是 Bean 创建过程中的一部分必须先创建 Bean 才能注入依赖。 3. 依赖注入的三种方式
Spring 提供了三种主要的依赖注入方式构造器注入、Setter 注入 和 字段注入。 (1) 构造器注入
通过类的构造器将依赖传递给对象。
优点
保证依赖在对象创建时就被注入避免空指针异常。强制依赖项必须提供增强对象的不可变性。
示例代码
Component
public class UserController {private final UserService userService;// 使用构造器注入Autowiredpublic UserController(UserService userService) {this.userService userService;}
}XML 配置方式
bean iduserController classcom.example.UserControllerconstructor-arg refuserService/
/bean(2) Setter 注入
通过 Setter 方法注入依赖。
优点
更灵活可以在对象创建后设置或修改依赖。适合可选依赖的场景。
示例代码
Component
public class UserController {private UserService userService;// 使用 Setter 注入Autowiredpublic void setUserService(UserService userService) {this.userService userService;}
}XML 配置方式
bean iduserController classcom.example.UserControllerproperty nameuserService refuserService/
/bean(3) 字段注入
直接将依赖注入到类的字段上。
优点
简洁代码更少。不需要显式构造器或 Setter 方法。
缺点
难以单元测试因为字段是私有的不能通过构造器或方法替换依赖。不符合 SOLID 原则中的单一责任原则。
示例代码
Component
public class UserController {Autowiredprivate UserService userService; // 字段注入
}推荐使用 构造器注入 Setter 注入 字段注入特殊情况可用。 4. Spring 容器如何管理 Bean 的生命周期
Spring 容器通过以下几个阶段管理 Bean 的生命周期
(1) Bean 的定义和加载
通过配置文件XML、Java 配置、注解加载 Bean 定义。容器解析 Bean 的依赖关系。
(2) Bean 的实例化
容器根据定义通过构造器或工厂方法实例化 Bean。
(3) 依赖注入
容器将所需的依赖对象注入到 Bean 中。
(4) 初始化
容器调用初始化方法如 PostConstruct 或 init-method进行初始化逻辑。
(5) Bean 的使用
Bean 准备就绪后由应用程序调用。
(6) 销毁
容器关闭时调用销毁方法如 PreDestroy 或 destroy-method。 5. 示例场景和常见问题
示例场景用户登录
Component
public class UserController {private final UserService userService;Autowiredpublic UserController(UserService userService) {this.userService userService;}public User login(String username, String password) {return userService.authenticate(username, password);}
}依赖注入过程
Spring 容器加载 UserController 和 UserService 的定义。容器创建 UserService 的实例。容器创建 UserController 的实例并将 UserService 注入到它的构造器中。
常见问题
循环依赖问题A 依赖 B而 B 也依赖 A会导致 Bean 无法创建。 解决方案 将其中一个依赖改为 Setter 注入或使用 Lazy。 依赖注入失败 如果 Spring 容器中没有找到需要注入的 Bean会抛出异常。 解决方案 确保所有需要的 Bean 都被正确注册。 6. 总结
依赖注入的本质 容器负责将对象需要的依赖注入进来解除了对象之间的紧耦合。Bean 创建与依赖注入 Bean 创建是依赖注入的前提依赖注入是 Bean 生命周期中的一个步骤。三种注入方式 构造器注入优先其次是 Setter 注入字段注入仅适用于特定场景。Spring 容器的管理 通过完整的生命周期管理Spring 容器让开发者专注于业务逻辑。