抽象クラスで@Autowiredを使用する

1. 前書き

このクイックチュートリアルでは、https://www.baeldung.com/java-abstract-class [abstractクラス]。
抽象クラスに_ @ Autowired_を適用し、考慮すべき重要な点に焦点を当てます。

2. セッター注入

セッターメソッドで_ @ Autowired_を使用できます。
public abstract class BallService {

    private LogRepository logRepository;

    @Autowired
    public final void setLogRepository(LogRepository logRepository) {
        this.logRepository = logRepository;
    }
}
セッターメソッドで_ @ Autowired_を使用する場合は、サブクラスがセッターメソッドをオーバーライドできないように、* https://www.baeldung.com/java-final [the _final_ keyword]を使用する必要があります。 そうしないと、注釈は期待どおりに機能しません。

3. コンストラクタインジェクション

*抽象クラスのコンストラクターで_ @ Autowired_を使用できません。*
Springは、抽象クラスのコンストラクターで_ @ Autowired_注釈を評価しません。 サブクラスは、_super_コンストラクターに必要な引数を提供する必要があります。
代わりに、サブクラスのコンストラクターで_ @ Autowired_を使用する必要があります。
public abstract class BallService {

    private RuleRepository ruleRepository;

    public BallService(RuleRepository ruleRepository) {
        this.ruleRepository = ruleRepository;
    }
}
@Component
public class BasketballService extends BallService {

    @Autowired
    public BasketballService(RuleRepository ruleRepository) {
        super(ruleRepository);
    }
}

4. カンニングペーパー

覚えておくべきいくつかのルールをまとめましょう。
まず、*抽象クラスは、具象サブクラスなしではインスタンス化できないため、コンポーネントスキャンされません*。
第二に、* setterインジェクションは抽象クラス*で可能ですが、setterメソッドに_final_キーワードを使用しないと危険です。 サブクラスがセッターメソッドをオーバーライドすると、アプリケーションが安定しない場合があります。
第三に、Springは抽象クラスでのコンストラクター注入をサポートしていないため、*具体的なサブクラスがコンストラクター引数を提供できるようにする必要があります*。 これは、具体的なサブクラスでのコンストラクター注入に依存する必要があることを意味します*。
最後に、必要な依存関係にコンストラクター注入を使用し、オプションの依存関係にセッター注入を使用するのはhttps://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/core.html#beans-factory-collaborators [良い経験則]。 ただし、抽象クラスのニュアンスの一部を見るとわかるように、ここでは一般的に*コンストラクター注入の方が有利*です。
したがって、実際には、具体的なサブクラスが抽象親がどのように依存関係を取得するかを支配していると言えます。 Springは、* Springがサブクラスを接続する限り、注入を行います。*

5. 結論

この記事では、抽象クラス内で_ @ Autowired_を使用して練習し、いくつかの重要なキーポイントについて説明しました。
このチュートリアルのソースコードは、通常どおりhttps://github.com/eugenp/tutorials/tree/master/spring-all[Githubプロジェクト]にあります。