1. ホーム
  2. java

[解決済み] Autowiredとスタティックメソッド

2022-08-30 20:27:03

質問

私は @Autowired サービスがありますが、これは静的メソッド内から使用する必要があります。これが間違っていることは分かっていますが、多くの作業を必要とするため、現在のデザインを変更することはできませんので、そのための簡単なハックが必要です。私は変更することができません randomMethod() を非静的なものに変更することはできず、私はこの自動配線ビーンを使用する必要があります。それを行う方法のいずれかの手がかりは?

@Service
public class Foo {
    public int doStuff() {
        return 1;
    }
}

public class Boo {
    @Autowired
    Foo foo;

    public static void randomMethod() {
         foo.doStuff();
    }
}

どのように解決するのですか?

いずれかの解決策に従うことで、これを行うことができます。

コンストラクタ @Autowired を使用する

この方法は、コンストラクタのパラメータとしていくつかのビーンを必要とするビーンを構築します。コンストラクタのコード内で、コンストラクタ実行のためのパラメータとして取得した値を静的フィールドに設定します。サンプルです。

@Component
public class Boo {

    private static Foo foo;

    @Autowired
    public Boo(Foo foo) {
        Boo.foo = foo;
    }

    public static void randomMethod() {
         foo.doStuff();
    }
}

PostConstructを使って静的フィールドに値を渡す

ここでは、SpringでBeanを設定した後、静的フィールドにBeanを渡すというものです。

@Component
public class Boo {

    private static Foo foo;
    @Autowired
    private Foo tFoo;

    @PostConstruct
    public void init() {
        Boo.foo = tFoo;
    }

    public static void randomMethod() {
         foo.doStuff();
    }
}