春のコンストラクタ依存性注入

Springのコンストラクター依存性注入

1. 前書き

おそらく、最新のソフトウェア設計の最も重要な開発原則の1つはDependency Injection (DI)であり、これは別の非常に重要な原則から非常に自然に流れ出します。Modularity.

この記事では、Spring内のConstructor-Based Dependency Injectionと呼ばれる特定のタイプのDI手法について説明します。これは、簡単に言えば、インスタンス化時に必要なコンポーネントがクラスに渡されることを意味します。

開始するには、pom.xmlspring-context依存関係をインポートする必要があります。


    org.springframework
    spring-context
    5.1.4.RELEASE

次に、Configurationファイルを設定する必要があります。 このファイルは、POJOまたは必要に応じてXMLファイルのいずれかです。

参考文献:

Springでの制御の反転と依存性注入の概要

Inversion of Control and Dependency Injectionの概念の簡単な紹介に続いて、Spring Frameworkを使用した簡単なデモンストレーション

スプリングフレームワークのよくある質問

就職の面接中に出てくる可能性のある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にあります。