我已经在Spring中使用Dependency Injection已有一段时间了,我了解它的工作原理以及使用它的优缺点。但是,当我创建一个新类时,我常常想知道-该类是否应该由Spring IOC Container管理?
而且我不想谈论@Autowired注释,XML配置,setter注入,构造函数注入等之间的区别。我的问题是一个普遍的问题。
假设我们有一个带有Converter的服务:
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private Converter converter;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
return converter.mapToDto(cars);
}
}
@Component
public class Converter {
public CarDto mapToDto(List<Car> cars) {
return new ArrayList<CarDto>(); // do the mapping here
}
}
显然,转换器没有任何依赖关系,因此无需自动接线。但是对我来说,自动接线似乎更好。代码更干净,更易于测试。如果我在没有DI的情况下编写此代码,则该服务将如下所示:
@Service
public class Service {
@Autowired
private Repository repository;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
Converter converter = new Converter();
return converter.mapToDto(cars);
}
}
现在,要测试它变得更加困难。而且,即使每次转换操作始终处于相同状态,也会为每个转换操作创建新的转换器,这似乎很麻烦。
Spring MVC中有一些众所周知的模式:使用服务的控制器和使用存储库的服务。然后,如果存储库是自动连线的(通常是这样),那么服务也必须自动连线。这很清楚。但是什么时候使用@Component注释?如果您有一些静态util类(例如转换器,映射器),您会自动为其布线吗?
您是否尝试使所有课程自动布线?然后,所有的类依赖关系都易于注入(再次,易于理解和测试)。还是只在绝对必要时才尝试自动接线?
我花了一些时间寻找有关何时使用自动装配的一般规则,但是找不到任何具体提示。通常,人们谈论“您是否使用DI?(是/否)”或“您更喜欢哪种类型的依赖项注入”,但这并不能回答我的问题。
我将不胜感激有关此主题的任何提示!