一、Spring中的依赖注入和依赖反转
- 依赖注入(Dependency Injection)
- 概念
- 依赖注入是一种设计模式,它允许在对象创建时将其依赖的对象传递给它,而不是让对象自己去创建或查找依赖对象。在Spring中,依赖注入是控制反转(Inversion of Control,IoC)的一种具体实现方式。
- 注入方式
- 构造函数注入
- 通过类的构造函数来注入依赖对象。例如:
- 构造函数注入
- 概念
java
public class MyClass {
private MyDependency dependency;
public MyClass(MyDependency dependency) {
this.dependency = dependency;
}
}
在Spring配置中,可以这样配置:
xml
<bean id="myDependency" class="com.example.MyDependency"/>
<bean id="myClass" class="com.example.MyClass">
<constructor-arg ref="myDependency"/>
</bean>
或者使用Java配置:
java
@Configuration
public class AppConfig {
@Bean
public MyDependency myDependency() {
return new MyDependency();
}
@Bean
public MyClass myClass() {
return new MyClass(myDependency());
}
}
- **Setter方法注入**
- 通过类的Setter方法来注入依赖对象。例如:
java
public class MyClass {
private MyDependency dependency;
public void setDependency(MyDependency dependency) {
this.dependency = dependency;
}
}
在Spring配置中:
xml
<bean id="myDependency" class="com.example.MyDependency"/>
<bean id="myClass" class="com.example.MyClass">
<property name="dependency" ref="myDependency"/>
</bean>
或者Java配置:
java
@Configuration
public class AppConfig {
@Bean
public MyDependency myDependency() {
return new MyDependency();
}
@Bean
public MyClass myClass() {
MyClass myClass = new MyClass();
myClass.setDependency(myDependency());
return myClass;
}
}
- **接口注入(不常用)**
- 通过实现特定的接口来注入依赖对象。这种方式在实际应用中相对较少使用。
- 依赖反转(Dependency Inversion)
- 概念
- 依赖反转原则(DIP)是面向对象设计的五大原则之一。它强调高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。在Spring中,依赖反转主要体现在将对象的创建和依赖关系的管理交给容器来完成。
- 在Spring中的体现
- 对象创建的反转
- 在传统的编程方式中,对象通常是由使用它的类自己创建的。例如:
- 对象创建的反转
- 概念
java
public class MyService {
private MyRepository repository = new MyRepository();
public void doSomething() {
repository.saveData();
}
}
在Spring中,对象的创建由容器负责。例如:
java
@Service
public class MyService {
private MyRepository repository;
@Autowired
public MyService(MyRepository repository) {
this.repository = repository;
}
public void doSomething() {
repository.saveData();
}
}
这里的MyRepository
对象不是由MyService
自己创建,而是由Spring容器创建并注入到MyService
中。
-
依赖关系管理的反转
-
传统方式下,对象之间的依赖关系是在代码中硬编码的。而在Spring中,依赖关系由容器根据配置来管理。通过配置文件(如XML配置文件)或注解(如
@Autowired
、@Qualifier
等)来指定对象之间的依赖关系,使得代码更加灵活和易于维护。例如,在XML配置中可以指定多个不同实现的依赖关系:
xml
<bean id="myRepositoryImpl1" class="com.example.MyRepositoryImpl1"/>
<bean id="myRepositoryImpl2" class="com.example.MyRepositoryImpl2"/>
<bean id="myService" class="com.example.MyService">
<property name="repository" ref="myRepositoryImpl1"/>
</bean>
可以通过修改配置文件轻松地切换MyService
所依赖的MyRepository
的具体实现。