じどうくみたてbean

4245 ワード

検出可能なBeanの作成


CDはCDプレーヤーに注入して再生する必要があり、CDプレーヤーが正常に動作するようにします.
CDインタフェースクラス
package soundsystem;

public interface CompactDisc {

    void play();
}

CDインタフェースの実装
package soundsystem;

import org.springframework.stereotype.Component;

@Component
public class SgtPepper implements CompactDisc {

    private String title = "Sgt. Pepper's Loney Herts Club Band";
    private String artist = "The Beatles";

    @Override
    public void play() {
        System.out.println("Playing " + title + " by " + artist);
    }
}

このCDの実装クラスは@Component注釈を使用しており、この注釈はクラスがコンポーネントクラスとして機能することを示し、SpringにこのクラスのBeanを作成するように通知している.
コンポーネントスキャン
前のCDの実装クラスに注釈が追加され、コンポーネントクラスとして使用されますが、コンポーネントスキャンのデフォルトはオンではありません.Springを明示的に構成し、@Component注釈のあるクラスを探してbeanを作成するように命令する必要があります.
package soundsystem;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig {
}

注記@ComponentScanはSpringでコンポーネントスキャンを有効にすることができ、他の構成がなければ、@ComponentScanはデフォルトで構成クラスと同じパッケージをスキャンし、Springはこのパッケージとこのパッケージの下のすべてのサブパッケージをスキャンし、@Componentの注記を持つクラスを検索します.

コンポーネントスキャンのbeanに名前を付ける


SpringアプリケーションコンテキストのすべてのbeanにはIDが与えられます.前にSgtPeppers beanにIDを明確に指定していませんが、Springはクラス名に基づいてIDを指定し、デフォルトではクラス名の最初のアルファベットを小文字、つまりsgtPeppersに変更します.
beanに異なるIDを設定する場合は、IDを値として@Component注釈に渡すことができる.
@Component("loneyHeartClub")
public class SgtPepper implements CompactDisc {
   ...
}

コンポーネントスキャンのベースパッケージの設定


前のコードでは、@ComponentScanにプロパティを設定していないので、クラスが存在するパッケージを構成するベースパッケージとしてコンポーネントをスキャンします.しかし、構成クラスを別のパッケージに配置して、他のアプリケーションコードと区別したい場合は、デフォルトではできません.
@Configuration
@ComponentScan("soundsystem")
public class CDPlayerConfig {
}

またはbasePackagesを明示的に指定します.
@Configuration
@ComponentScan(basePackages = "soundsystem")
public class CDPlayerConfig {
}

複数の基本パッケージを同時に指定できます.
@Configuration
@ComponentScan(basePackages = {"soundsystem", "videos"})
public class CDPlayerConfig {
}

上のベースパッケージの指定は文字列形式ですが、この方法はタイプが安全ではありません.コードを再構築すると、エラーが発生する可能性があります.パケットを単純な文字列タイプに設定することに加えて、@ComponentScanは、パケットに含まれるクラスまたはインタフェースとして指定する別の方法を提供します.
@Configuration
@ComponentScan(basePackageClasses = { SgtPepper.class, DVDPlayer.class})
public class CDPlayerConfig {
}

上で指定したクラスにはコンポーネントクラスがありますが、区別をよくするために、これらのパッケージに空のスキャンタグインタフェースを作成し、このインタフェースクラスを使用してスキャンパッケージを指定できます.

beanに注釈を追加することで自動アセンブリを実現


自動アセンブリはSpringがbean依存を自動的に満たす方法であり、この過程でSpringアプリケーションコンテキストであるbean需要の他のbeanを探す.自動アセンブリを宣言するには、@Autowired注記を使用します.
package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CDPlayer implements MediaPlayer {

    private CompactDisc cd;

    @Autowired
    public CDPlayer(CompactDisc cd) {
        this.cd = cd;
    }

    @Override
    public void play() {
    }
}

上記のコードは、SpringがCDPlayer beanを作成すると、このコンストラクタによってインスタンス化され、CompactDiscタイプに設定可能なbeanが入力されることを示す@Autowired注記をコンストラクタに追加した.@Autowiredは、コンストラクタだけでなく、実際には任意の方法で使用することができる.
@Autowired
public void setCompactDisc(CompactDisc cd) {
    this.cd = cd;
}

@Autowired
public void insertDisc(CompactDisc cd) {
    this.cd = cd;
}

Springメソッドパラメータで宣言された依存を満たすことを試みる場合、依存要件に一致するbeanが1つしかない場合、このbeanはパッケージされます.
一致するbeanがない場合、コンテキスト作成を適用するとSpringは例外を放出します.この例外を回避するために、属性requiredをfalseに設定できます.
@Autowired(required = false)
public void insertDisc(CompactDisc cd) {
    this.cd = cd;
}

デフォルトはtrueで、falseに設定すると、コードが使用されている間に空になることを覚えておいてください.
複数の届出が依存関係を満たす場合、Springは異常を投げ出し、どのbeanを選択して組み立てるかを明確に指定していないことを示します.後で自動アセンブリの曖昧性について説明します.
Java依存注入仕様の@Inject@Autowiredは同様の役割を果たし,ほとんどの場合相互利用可能である.