这是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对象为空吗?我知道我可以将其作为方法参数传递,但这不是很好。我猜想自动装配不能在静态对象上使用,因为它们尚未创建到自动装配机制的早期。
您不能@Autowired是静态字段。但是有一个棘手的技巧可以解决这个问题:
@Autowired
@Component public class StatisticLogger { private static Dao dao; @Autowired private Dao dao0; @PostConstruct private void initStaticDao () { dao = this.dao0; } }
一句话,就是@Autowired一个实例字段,并在构造对象时将值分配给静态字段。顺便说一句,该StatisticLogger对象也必须由Spring管理。
StatisticLogger