目录
Spring DI(Dependency Injection,依赖注入)是一种设计模式,用于实现控制反转(Inversion of Control,IoC)。在Spring框架中,DI是核心特性之一,通过将对象的创建和管理从应用程序代码中抽离出来,使得程序的组件之间能够更松散地耦合。
一、主要概念
1. 依赖
在面向对象程序中,一个对象(类)通常需要其他对象来完成某些功能,这些需要的对象称为依赖。
2. 控制反转(IoC)
IoC是指将对象的创建和管理权交给容器(如Spring容器),而不是在应用程序代码中直接创建对象。这样可以提高代码的灵活性和可测试性。
3. 注入方式
(1)构造函数注入:依赖通过构造函数传入。适用于强制要求依赖的场景。
public class MyService {
private MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
(2)Setter方法注入:依赖通过公开的setter方法设置。适用于可选依赖的场景。
public class MyService {
private MyRepository myRepository;
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
(3)接口注入:通过接口方法提供依赖。
4. Spring容器
负责对象的创建、配置和生命周期管理。Spring容器会根据配置文件或注解来创建和管理对象。
二、优点
(1)解耦:通过DI,类之间的依赖关系通过容器管理,减少了类间的直接依赖。
(2)可测试性:可以轻松地替换依赖,便于单元测试。
(3)灵活性:可以通过配置文件或注解快速修改依赖对象,而不需要修改源代码。
三、示例
UserService依赖于UserRepository:
public interface UserRepository {
void save();
}
public class UserRepositoryImpl implements UserRepository {
public void save() {
// 保存用户
}
}
public class UserService {
private UserRepository userRepository;
// 构造函数注入
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void registerUser() {
userRepository.save();
}
}
在xml文件中配置这些类:
<beans>
<bean id="userRepository" class="com.example.UserRepositoryImpl" />
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository" />
</bean>
</beans>
或者使用注解:
@Component
public class UserRepositoryImpl implements UserRepository {
// ...
}
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}