しばらくの間、SpringでDependency Injectionを使用してきましたが、それがどのように機能し、それを使用することの長所と短所を理解しています。しかし、新しいクラスを作成するとき、よく疑問に思う-このクラスはSpring IOC Containerによって管理されるべきか?
また、@ Autowiredアノテーション、XML構成、セッターインジェクション、コンストラクターインジェクションなどの違いについては説明しません。私の質問は一般的なものです。
コンバーター付きのサービスがあるとしましょう:
@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を使用しますか(はい/いいえ)」または「どのタイプの依存性注入を好みますか」について話しますが、これは私の質問には答えません。
このトピックに関するヒントに感謝します!