これは、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 によって管理される必要があります。