静的メソッドにbeanを注入する

4569 ワード

@Componentpublic class ScriptExecuteContent {
@Autowired
private static SignRepository signRepository;

public static String checkSign(String certNo, String acctNo, String instCode) { Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode); if (null != sign && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code()) && DateUtil.getCurrentDate().before(sign.getExpireTime())) { return "1"; } else { return "0"; } }

}
このセグメントコードはまぶしく見ても問題ないが、実行するとnullが異常になる.ここで注入されるsignRepositoryはnullであるからである.これは静的メソッドがクラスに属し、一般的なメソッドがオブジェクトに属し、spring注入は容器の中で変数をインスタンス化し、静的がオブジェクトより先に存在するため、直接静的メソッドで注入された静的変数を呼び出すのはnullである.この点はよく分からないが、Javaの基礎を自分で補うことができます.しかし,現実には,注入されたbeanオブジェクトを静的メソッドで呼び出す必要がある場合が多いが,どのように実現すればよいのだろうか.私が今知っている方法は2つあります.
問題解決:1.@Autowiredはコンストラクション関数で@Autowiredコメントを知っています.クラスメンバー変数、メソッド、コンストラクション関数に寸法を付けて、自動アセンブリの作業を完了することができます.この方法は、コンストラクション関数で@Autowiredを使用することです.コード参照:
@Componentpublic class ScriptExecuteContent {
private static SignRepository signRepository;

@Autowired
public ScriptExecuteContent(SignRepository signRepository) { ScriptExecuteContent.signRepository = signRepository; } public static String checkSign(String certNo, String acctNo, String instCode) { Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode); if (null != sign && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code()) && DateUtil.getCurrentDate().before(sign.getExpireTime())) { return "1"; } else { return "0"; } }

}
2.@PostConstruct注釈を使用@PostConstructは、Java EE 5によって導入されたサーブレットライフサイクルに影響を与える注釈であり、非静的void()メソッドを修飾するために使用され、@PostConstructは関数を構築した後に実行され、init()メソッドの前に実行される.コード参照:
@Componentpublic class ScriptExecuteContent {
@Autowired
private SignRepository signRepository;

private static ScriptExecuteContent scriptExecuteContent;

@PostConstruct public void init() { scriptExecuteContent = this; scriptExecuteContent.signRepository = this.signRepository; } public static String checkSign(String certNo, String acctNo, String instCode) { Sign sign = scriptExecuteContent.signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode); if (null != sign && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code()) && DateUtil.getCurrentDate().before(sign.getExpireTime())) { return "1"; } else { return "0"; } }

}
まとめ:以上の2つの方式はいずれも静的方法で注入したbeanオブジェクトを直接使用することができ,実現方式はこの2つだけでなく,自分の基礎が悪くなったに違いないが,現在はこの2つしか知られていない.