じどうくみたて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
は同様の役割を果たし,ほとんどの場合相互利用可能である.