107

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

例えば

@Autowired
public static Test test;
4

4 に答える 4

164

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

于 2014-02-19T08:49:24.237 に答える
75

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

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

于 2012-06-07T19:27:51.100 に答える
17

OOP の概念によると、静的変数が自動配線されていると設計がうまくいきません。

静的変数はオブジェクトのプロパティではありませんが、クラスのプロパティです。スプリングの自動配線がオブジェクトに施されているので、すっきりとしたデザインになっていると思います。自動ワイヤード Bean オブジェクトをシングルトンとしてデプロイし、それを静的に定義するのと同じことを達成できます。

于 2012-06-08T07:35:40.313 に答える
17

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

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
于 2016-09-20T08:53:31.673 に答える