Springのコンストラクター依存性注入
1. 前書き
おそらく、最新のソフトウェア設計の最も重要な開発原則の1つはDependency Injection (DI)であり、これは別の非常に重要な原則から非常に自然に流れ出します。Modularity.
この記事では、Spring内のConstructor-Based Dependency Injectionと呼ばれる特定のタイプのDI手法について説明します。これは、簡単に言えば、インスタンス化時に必要なコンポーネントがクラスに渡されることを意味します。
開始するには、pom.xmlにspring-context依存関係をインポートする必要があります。
org.springframework
spring-context
5.1.4.RELEASE
次に、Configurationファイルを設定する必要があります。 このファイルは、POJOまたは必要に応じてXMLファイルのいずれかです。
参考文献:
Springでの制御の反転と依存性注入の概要
Inversion of Control and Dependency Injectionの概念の簡単な紹介に続いて、Spring Frameworkを使用した簡単なデモンストレーション
春の配線:@ Autowired、@ Resource、@ Inject
この記事では、依存性注入に関連するアノテーション、つまり@ Resource、@ Inject、@ Autowiredアノテーションの使用を比較対照します。
2. 注釈ベースの構成
Java構成ファイルは、いくつかの追加の注釈を備えた平凡なJavaオブジェクトによく似ています。
@Configuration
@ComponentScan("com.example.constructordi")
public class Config {
@Bean
public Engine engine() {
return new Engine("v8", 5);
}
@Bean
public Transmission transmission() {
return new Transmission("sliding");
}
}
ここでは、アノテーションを使用して、このクラスがBean定義のプロバイダー(@Beanアノテーション)であり、追加のBeanのコンテキストスキャンをパッケージcom.example.springで実行する必要があることをSpringランタイムに通知しています。 次に、Carクラスを定義します。
@Component
public class Car {
@Autowired
public Car(Engine engine, Transmission transmission) {
this.engine = engine;
this.transmission = transmission;
}
}
Springは、パッケージスキャンの実行中にCarクラスに遭遇し、@Autowiredアノテーション付きコンストラクターを呼び出すことによってそのインスタンスを初期化します。
Engine and Transmissionのインスタンスは、Configクラスの@Beanアノテーション付きメソッドを呼び出すことによって取得されます。 最後に、POJO構成を使用してApplicationContextをブートストラップする必要があります。
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = context.getBean(Car.class);
3. 暗黙的なコンストラクター注入
Spring 4.3以降、単一のコンストラクターを持つクラスは、@Autowiredアノテーションを省略できます。 便利でボイラープレートの削除が少し便利です!
さらに、4.3以降では、コンストラクターベースのインジェクションを@Configurationのアノテーション付きクラスで活用できます。 はい、そのようなクラスにコンストラクターが1つしかない場合は、@Autowiredアノテーションも省略できます。
4. XMLベースの構成
コンストラクターベースの依存性注入を使用してSpringランタイムを構成する別の方法は、xml構成ファイルを使用することです。
constructor-argはリテラル値または別のBeanへの参照を受け入れることができ、オプションの明示的なindexおよびtypeを提供できることに注意してください。 Type属性とindex属性を使用して、あいまいさを解決できます(たとえば、コンストラクターが同じタイプの複数の引数を取る場合)。
name属性は、xmlからjava変数へのマッチングにも使用できますが、コードmustは、デバッグフラグをオンにしてコンパイルされます。
この場合、SpringアプリケーションコンテキストはClassPathXmlApplicationContextを使用してブートストラップする必要があります。
ApplicationContext context = new ClassPathXmlApplicationContext("example.xml");
Car car = context.getBean(Car.class);
5. 結論
このクイックチュートリアルでは、Springフレームワークを使用してConstructor-Based Dependency Injectionを使用する2つの異なる方法の基本を紹介しました。
このチュートリアルのfull implementationは、over on Githubにあります。