Spring依赖注入(Dependency Injection,DI)是IoC容器的核心功能之一,可以用来解决对象的依赖关系。在传统的Java程序中,对象之间的依赖关系通常是由对象自己控制的,而DI则是通过IoC容器来管理对象之间的依赖关系,从而实现了对象解耦和可重用性。
在Spring中,依赖注入可以通过构造函数注入、Setter方法注入、接口注入、注解注入等方式来实现。
- 构造函数注入
Spring通过构造函数注入实现依赖注入,即在创建对象的时候,通过构造函数的参数来指定对象之间的依赖关系。在这种方式下,需要在配置文件或注解中指定依赖Bean的名称,Spring容器会在创建当前Bean的同时,自动注入其依赖的Bean。
下面是一个使用构造函数注入的例子:
public class CustomerService {
private CustomerDao customerDao;
public CustomerService(CustomerDao customerDao) {
this.customerDao = customerDao;
}
// ...
}
<bean id="customerDao" class="xyz.CustomerDaoImpl"/>
<bean id="customerService" class="xyz.CustomerServiceImpl">
<constructor-arg ref="customerDao"/>
</bean>
在这个例子中,CustomerService依赖于CustomerDao,通过在构造函数中传入CustomerDao实例来实现注入。
- Setter方法注入
Spring还可以通过Setter方法注入实现依赖注入。在这种方式下,需要定义Bean的Setter方法,通过Setter方法来注入Bean的依赖关系。
下面是一个使用Setter方法注入的例子:
public class CustomerService {
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
// ...
}
<bean id="customerDao" class="xyz.CustomerDaoImpl"/>
<bean id="customerService" class="xyz.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
在这个例子中,CustomerService依赖于CustomerDao,通过定义setCustomerDao方法来实现注入。
- 接口注入
Spring还支持通过接口注入实现依赖注入。即创建一个接口,定义依赖的Bean必须实现该接口,然后将接口注入到需要依赖的Bean中。这种方式通常在需要多态性的情况下使用。
下面是一个使用接口注入的例子:
public interface CustomerDao {
// ...
}
public class CustomerDaoImpl1 implements CustomerDao {
// ...
}
public class CustomerDaoImpl2 implements CustomerDao {
// ...
}
public class CustomerService {
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
// ...
}
<bean id="customerDao1" class="xyz.CustomerDaoImpl1"/>
<bean id="customerDao2" class="xyz.CustomerDaoImpl2"/>
<bean id="customerService" class="xyz.CustomerServiceImpl">
<property name="customerDao" ref="customerDao1"/>
</bean>
在这个例子中,CustomerService依赖于CustomerDao接口,通过将不同实现的CustomerDao注入到CustomerService中,实现了多态性。
- 注解注入
Spring还可以通过注解注入实现依赖注入。通过注解将需要注入的Bean标记出来,Spring容器会自动识别注解,并将相应的Bean对象注入到需要的地方。
下面是一个使用注解注入的例子:
public class CustomerService {
@Autowired
private CustomerDao customerDao;
// ...
}
<bean id="customerDao" class="xyz.CustomerDaoImpl"/>
<bean id="customerService" class="xyz.CustomerServiceImpl"/>
在这个例子中,通过@Autowired注解标记了需要注入的CustomerDao对象,Spring容器会自动将CustomerDao对象注入到CustomerService中。