为什么需要依赖注入?这是一个很有意思的问题。在讲解依赖注入之前,需要先了解一下控制反转(Inversion of Control,缩写为IoC)。
控制反转是一种设计模式,它将应用程序中的控制权反转,交给容器托管。一般地,控制权包括对象的创建、对象之间的依赖关系的管理等。控制反转需要借助容器,可以说是容器的手段和策略之一。
而依赖注入就是控制反转的一种表现形式。依赖注入的这个“依赖”就是对象之间的依赖关系。依赖注入可以让对象在创建时就由容器来对它们的依赖关系进行管理,降低了对象之间的耦合度。
需要依赖注入的场景,一般来说是指需要很好地解耦的场景,比如:
-
测试:测试时需要模拟数据、借助注入对象的方式解耦,才能测试到各个层次上的应用;
-
可维护性:依赖注入可以将依赖关系的配置集中化,更好地管理依赖关系;
示例一:使用setter方法进行注入
public class UserService {
private UserDao userDao;
// Setter方法进行依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save(User user){
userDao.save(user);
}
}
以上代码中,UserService
中的userDao
使用setter方法进行注入。可以看到,在方法中,将userDao
赋值给自己的一个成员变量。这里需要注意的是,UserDao
是UserService
所依赖的一个对象。
示例二:使用构造函数进行注入
public class UserService {
private UserDao userDao;
// 构造函数进行依赖注入
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void save(User user){
userDao.save(user);
}
}
以上代码中,UserService
中的userDao
使用构造函数进行注入。可以看到,在构造函数中将UserDao
作为参数传入,这就是依赖注入的方式之一。
总体来说,依赖注入是一种实现控制反转的方式,可以让对象在创建时依赖关系得以管理,从而降低对象之间的耦合度。常见的依赖注入方式有setter方法和构造函数注入。