Spring Frameworkの依存性注入(Dependency Injection)を設定する方法をまとめました。
コンポーネントのスキャン対象指定
デフォルトでは @ComponentScan
が付与されたクラスのパッケージと同階層以下のパッケージをスキャンする。その他のクラスをスキャン対象にしたい場合はscanBasePackage
にパッケージ名を指定する。
// @SpringBootApplicationなどの複合アノテーションに指定することもできる。
@ComponentScan(scanBasePackages={"com.example"})
依存性注入(DI)設定
Springアノテーションを使う場合
依存するオブジェクトを private
final
なメンバとして定義して、コンストラクタで依存オブジェクトを引数で受け取るコンストラクタを定義する。Lombokを使う場合は下記のように記載できる。
コンポーネント定義
@Component
class ComponentA { ...
DI設定
@RequiredArgsConstructor
class ClassA {
// @Autowiredは省略できる。
private final ComponentA componentA;
...
以前はfinal
でないメンバもしくはそのSetterに@Autowired
を指定するのが主流であった。
class ClassA {
@Autowired
private ComponentA componentA;
...
class ClassA {
private ComponentA componentA;
@Autowired
public void setComponentA(ComponentA componenA) {
...
コンストラクタを利用することには以下のメリットがあるため、現在はこちらが推奨されている。
- DIなしでも利用可能なモジュールになる。(利用側でコンストラクタで依存関係を設定すればよい。)
-
final
修飾子を付けられる。(DIオブジェクトを格納する変数を書き換えることは通常ない。)
JSR-330アノテーションを使う場合
Java標準なので他のDIコンテナに乗り換えやすい。
コンポーネント定義
@Named // もしくは@ManagedBean
class ComponentA { ... }
DI設定
コンストラクタ(もしくはSetter)に@Inject
を指定する。(Setterでも可。)
@RequiredArgsConstructor(onConstructor=@__(@Inject))
class ClassA {
private final ComponentA componentA;
...
もしくは、メンバに@Inject
を指定する。
class ClassA {
@Inject
private ComponentA componentA;
...