@Autowired
静的フィールドを使用する方法はありますか。そうでない場合、これを行う他の方法はありますか?
11 に答える
要するに、いいえ。Spring では、静的フィールドを自動配線または手動で配線することはできません。これを行うには、独自のロジックを作成する必要があります。
@Component("NewClass")
public class NewClass{
private static SomeThing someThing;
@Autowired
public void setSomeThing(SomeThing someThing){
NewClass.someThing = someThing;
}
}
@Autowired
セッターで使用できるため、セッターで静的フィールドを変更できます。
最後に1つだけ提案...しないでください
副作用として静的変数を初期化する自動配線できる Bean を作成します。
自動配線静的フィールド(または定数)は無視されるが、エラーも発生しないという回答に追加したい:
@Autowired
private static String staticField = "staticValue";
これは、XML 表記とMethodInvokingFactoryBean
. 例については、こちらをご覧ください。
private static StaticBean staticBean;
public void setStaticBean(StaticBean staticBean) {
StaticBean.staticBean = staticBean;
}
これは推奨されるアプローチであるため、可能な場合はスプリング インジェクションを使用することを目指す必要がありますが、スプリング コンテナーからすべてを引き出すことができないか、レガシー システムを扱っている可能性があるため、これが常に可能であるとは限りません。
このアプローチでは、テストもより困難になる可能性があることに注意してください。
一般に、オブジェクト インスタンスごとに静的フィールドを設定することはお勧めできません。
オプションの問題を回避するには、synchronized
定義を追加して、プライベートな静的ロガーロガーの場合にのみ設定します。
@Autowired
public synchronized void setLogger(Logger logger)
{
if (MyClass.logger == null)
{
MyClass.logger = logger;
}
}
: