一尘不染

@Autowired在静态类中

hibernate

这是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对象为空吗?我知道我可以将其作为方法参数传递,但这不是很好。我猜想自动装配不能在静态对象上使用,因为它们尚未创建到自动装配机制的早期。


阅读 241

收藏
2020-06-20

共1个答案

一尘不染

您不能@Autowired是静态字段。但是有一个棘手的技巧可以解决这个问题:

@Component
public class StatisticLogger {

  private static Dao dao;

  @Autowired
  private Dao dao0;

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

}

一句话,就是@Autowired一个实例字段,并在构造对象时将值分配给静态字段。顺便说一句,该StatisticLogger对象也必须由Spring管理。

2020-06-20