静的クラスでの@Autowired 質問する

静的クラスでの@Autowired 質問する

これは、Hibernate を使用した Spring MVC プロジェクトです。データベースにログを入力する役割を持つ Logger クラスを作成しようとしています。他のクラスは、いくつかの属性を持つ適切なメソッドを呼び出すだけですが、このクラスはすべての魔法を実行する必要があります。本来、静的メソッドを持つクラスである必要がありますが、これにより、dao オブジェクトの自動配線で問題が発生します。

public class StatisticLogger {
    @Autowired
    static Dao dao;
    public static void AddLoginEvent(LogStatisticBean user){
        //TODO code it god damn it
    }
    public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
        //TODO code it god damn it
    }
    public static void addErrorLog(Exception e, String page,  HashMap<String, Object> parameters){
        ExceptionLogBean elb=new ExceptionLogBean();
        elb.setStuntDescription(e);
        elb.setSourcePage(page);
        elb.setParameters(parameters);
        if(dao!=null){ //BUT DAO IS NULL
            dao.saveOrUpdateEntity(elb);
    }
}

どうすれば正しく作成できますか? DAO オブジェクトを null にしないようにするにはどうすればよいですか? メソッド パラメーターとして渡すことができることはわかっていますが、それはあまり良くありません。静的オブジェクトは、自動配線メカニズムがまだ作成されていないほど早く作成されるため、自動配線は静的オブジェクトでは機能しないのではないかと思います。

ベストアンサー1

@Autowired静的フィールドは使えません。しかし、これに対処するには巧妙なスキルが必要です。

@Component
public class StatisticLogger {

  private static Dao dao;

  @Autowired
  private Dao dao0;

  @PostConstruct     
  private void initStaticDao () {
     dao = this.dao0;
  }

}

一言で言えば、@Autowiredインスタンス フィールドであり、オブジェクトが構築されるときに静的フィールドに値を割り当てます。ちなみに、オブジェクトStatisticLoggerも Spring によって管理される必要があります。

おすすめ記事