181

@Autowired静的フィールドを使用する方法はありますか。そうでない場合、これを行う他の方法はありますか?

4

11 に答える 11

146

要するに、いいえ。Spring では、静的フィールドを自動配線または手動で配線することはできません。これを行うには、独自のロジックを作成する必要があります。

于 2009-06-19T17:13:28.620 に答える
142
@Component("NewClass")
public class NewClass{
    private static SomeThing someThing;

    @Autowired
    public void setSomeThing(SomeThing someThing){
        NewClass.someThing = someThing;
    }
}
于 2011-05-13T11:33:07.977 に答える
71

@Autowiredセッターで使用できるため、セッターで静的フィールドを変更できます。

最後に1つだけ提案...しないでください

于 2009-06-20T01:27:07.090 に答える
5

副作用として静的変数を初期化する自動配線できる Bean を作成します。

于 2009-06-20T01:21:49.787 に答える
4

自動配線静的フィールド(または定数)は無視されるが、エラーも発生しないという回答に追加したい:

@Autowired
private static String staticField = "staticValue";
于 2019-10-24T08:15:07.387 に答える
3

これは、XML 表記MethodInvokingFactoryBean. 例については、こちらをご覧ください。

private static StaticBean staticBean;

public void setStaticBean(StaticBean staticBean) {
   StaticBean.staticBean = staticBean;
}

これは推奨されるアプローチであるため、可能な場合はスプリング インジェクションを使用することを目指す必要がありますが、スプリング コンテナーからすべてを引き出すことができないか、レガシー システムを扱っている可能性があるため、これが常に可能であるとは限りません。

このアプローチでは、テストもより困難になる可能性があることに注意してください。

于 2009-06-22T09:37:59.167 に答える
0

一般に、オブジェクト インスタンスごとに静的フィールドを設定することはお勧めできません。

オプションの問題を回避するには、synchronized定義を追加して、プライベートな静的ロガーロガーの場合にのみ設定します。

@Autowired
public synchronized void setLogger(Logger logger)
{
    if (MyClass.logger == null)
    {
        MyClass.logger = logger;
    }
}

:

于 2020-11-11T14:14:35.043 に答える