私は以下のクラスを持っています:
クラスバリデーター{ プライベート最終SchemaFetcher schemaFetcher; @注入 Validator(SchemaFetcher schemaFetcher) {...} } クラス DatabaseSchemaFetcher は SchemaFetcher を実装します { @オーバーライド スキーマ loadSchema(最終的な SchemaDefinition schemaDef); @オーバーライド boolean compareSchemaWithSource(最終的な SchemaDefinition schemaDef、最終的なスキーマ updatedSchema); }
これは例の 1 つにすぎません。依存関係として他のクラスに注入する、このような他のクラスがいくつかあります。しかし、それは私の SchemaFetcher クラスをシングルトンのようにし、そのすべてのメソッドに schemaDefinition を渡し続けます。これは非常に手続き的なようで、実際に SchemaDefinition を DatabaseSchemaFetcher クラスのインスタンス変数にしたいのですが、その場合、SchemaFetcher オブジェクトを Validator クラスに挿入できず、代わりに行う必要があります
検証(文字列スキーマ名){ SchemaDefinition schemaDef = buildSchemaDefinitionFrom(schemaName); SchemaFetcher fetcher = 新しい DatabaseSchemaFetcher(schemaDef); }
しかし、これにより、フェッチャーと密接に結びついてしまうため、最初に依存性注入を使用したいと考えました。
DatabaseSchemaFetcher のデフォルトのコンストラクターと setSchemaDefintion() セッターを使用してこれを実現できる可能性があることがわかりますが、それはコンストラクターを使用してオブジェクトを完全に構築するという原則に違反しています。
これを改善して、手続き型のフェッチャーを持たないようにするだけでなく、依存関係をコンストラクターに注入するにはどうすればよいですか? ファクトリーまたはサービスロケーターを使用する場合、誰もクラスの実装を調べてクラスが使用する依存関係を把握することなく、依存関係を明確に定義するため、コンストラクター注入を好みます。