Spring Bean で静的インスタンス変数を自動配線できないのはなぜですか。これを達成する別の方法があることは知っていますが、以下の方法でそれを行うことができない理由を知りたいだけです.
例えば
@Autowired
public static Test test;
クラスローダーが静的値をロードするとき、Spring コンテキストがまだロードされているとは限らないためです。そのため、クラス ローダーは Bean に静的フィールドを適切に挿入せず、失敗します。
静的フィールドを使用すると、静的メソッドの使用が促進されるためです。そして、静的メソッドは悪です。依存性注入の主な目的は、コンテナーにオブジェクトを作成させ、それらを接続させることです。また、テストが容易になります。
静的メソッドの使用を開始すると、オブジェクトのインスタンスを作成する必要がなくなり、テストがはるかに困難になります。また、特定のクラスの複数のインスタンスを作成し、それぞれに異なる依存関係を注入することはできません (フィールドが暗黙的に共有され、グローバルな状態が作成されるため、これも悪です)。
OOP の概念によると、静的変数が自動配線されていると設計がうまくいきません。
静的変数はオブジェクトのプロパティではありませんが、クラスのプロパティです。スプリングの自動配線がオブジェクトに施されているので、すっきりとしたデザインになっていると思います。自動ワイヤード Bean オブジェクトをシングルトンとしてデプロイし、それを静的に定義するのと同じことを達成できます。
このソリューションにより、春に静的フィールドを自動配線できます。
@Component
public class TestClass {
private static Test test;
@Autowired
public void setTest(Test test) {
TestClass.test = test;
}
}