春に静的フィールドを自動ワイヤリングできないのはなぜですか?


96

Spring Beanで静的インスタンス変数を自動配線できないのはなぜですか。これを達成する別の方法があることを知っていますが、以下の方法でそれができない理由を知りたいだけです。

例えば

@Autowired
public static Test test;

あなたが参照している別の方法でいくつかの光を細断できますか?
samshers 2017

コンストラクタを介して自動配線するか、@ PostConstuctを使用できます
gagarwa

回答:


69

静的フィールドを使用すると、静的メソッドの使用が促進されるためです。そして、静的メソッドは悪です。依存関係注入の主な目的は、コンテナがオブジェクトを作成してワイヤリングすることです。また、テストが容易になります。

静的メソッドの使用を開始すると、オブジェクトのインスタンスを作成する必要がなくなり、テストがはるかに困難になります。また、特定のクラスの複数のインスタンスを作成することはできません。それぞれに異なる依存関係が注入されます(フィールドが暗黙的に共有され、グローバルな状態を作成するため、悪です)。


11
これについて私が遭遇した注意点の1つは、テスト中です。@BeforeClassSpringJUnit4ClassRunnerで使用し、そのメソッド@AutowiredにテストでBean にアクセスさせる場合は、基本的にできません。迷惑です。
Jason Polites 2013年

4
この回答は説明なぜそれshouldn "トンしかし、本当の動機は、フレームワークの試みは、Beanに静的クラスを配線するときには、まだクラスローダによってロードされていないことができることである。。
アンドレア・T

51
この答えは完全に無意味です。Springはテスト戦略を強制しません。答えは、静的クラスがクラスローダーによってインスタンス化されたときに、まだSpringライブラリがロードされていないということです。
Andrea T

7
@AndreaTによる回答は、受け入れられた回答でなければなりません。
Chirag Agrawal 2016年

3
静的メソッドはテストが簡単で、難しくはありません。Springが自動的に依存関係を注入するのはいいことのようですが、それは実際にはテストの難しいルートです。モック、スタブ、テストダブルはコードの匂いであり、静的メソッドではありません。
mttdbrd 2017年

150

クラスローダーが静的な値をロードするとき、Springコンテキストは必ずしもロードされていないためです。そのため、クラスローダーはBeanに静的フィールドを適切に挿入せず、失敗します。


46
Java言語の半分は悪い考えであるという意見を表明するだけでなく、実際に質問に答えるように見える回答に感謝します。
ウォーレンデュー

1
「静的クラス」?
Arun Raaj

Mockitoはオブジェクトを静的フィールドに挿入できるため、これは正しくないようです。実装が同じかどうかはわかりませんが、springが自動配線を行う方法と同様です。詳細情報が必要です。
ガガルワ

Mockitoは静的メソッドを模擬できません。静的メソッドをモックするには、Powermockを使用する必要があります
Jaison Varghese

17

OOPの概念によれば、静的変数が自動配線されていると、設計が悪くなります。

静的変数はオブジェクトのプロパティではありませんが、クラスのプロパティです。スプリングの自動配線はオブジェクトに対して行われるため、私の意見ではデザインがきれいになります。自動ワイヤードBeanオブジェクトをシングルトンとしてデプロイし、静的に定義するのと同じことを実現できます。


15

このソリューションにより、春に静的フィールドを自動配線できます。

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinderは、非静的メソッドからの静的フィールドの設定について文句を言うでしょう。
Neftanic

@Neftanic非静的メンバーから静的メンバーを参照することは機能しますが、逆は機能しません
younes zeboudj '24
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.