hosochinの技術ブログ

【Spring】staticなメソッドからbeanを参照する

はじめに

お世話にになります、hosochinです

さて、今回は
「staticなメソッドからbeanを参照する」
です

まああんまりないとは思いますが…最近出会したのでメモです

やってみる

たとえばこんな感じでSampleComponentをコンストラクタインジェクションしているSampleUtilクラスがあったとして

@Component
@RequiredArgsConstructor
public class SampleUtil {
    private final SampleComponent sampleComponent;

    public String getMessage() {
        return sampleComponent.getSampleComponentMessage();
    }
}

getMessageメソッドをstaticなメソッドにしたくなったとき、以下のようにすればいけるよっていう話です👍

@Component
public class SampleUtil {
    // finalは除去, staticを付与
    private static SampleComponent sampleComponent;

    // コンストラクタを追加(lombokだと意図したコンストラクタが生成されないためちゃんと記述する)
    public SampleUtil(SampleComponent sampleComponent) {
        SampleUtil.sampleComponent = sampleComponent;
    }

    // staticメソッドに変更
    public static String getMessage() {
        return sampleComponent.getSampleComponentMessage();
    }
}

残念ながらfinalはつけられないです…まあそりゃそうですね

また、staticの初期化 -> bean読み込み -> DI(コンストラクタインジェクション)の順番だと思うんで、SampleUtilのコンストラクタが呼ばれる前にsampleComponent.getSampleComponentMessage()を使えばぬるぽになるはずなので注意が必要ですね

ついでにセッターインジェクションでやる方法も載せときます

@Component
public class SampleUtil {
    private static SampleComponent sampleComponent;

    @Autowired
    public void setSampleComponent(SampleComponent sampleComponent) {
        SampleUtil.sampleComponent = sampleComponent;
    }

    public static String getMessage() {
        return sampleComponent.getSampleComponentMessage();
    }
}