当前位置: 首页 > 面试题库 >

@Autowired在静态类中

容宏逸
2023-03-14
问题内容

这是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是静态字段。但是有一个棘手的技巧可以解决这个问题:

@Component
public class StatisticLogger {

  private static Dao dao;

  @Autowired
  private Dao dao0;

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

}

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



 类似资料:
  • 问题内容: 我有必须从静态方法中使用的服务。我知道这是错误的,但是我无法更改当前的设计,因为这需要大量的工作,因此我需要一些简单的技巧。我不能更改为非静态的,而需要使用此自动装配的bean。有什么线索怎么做? 问题答案: 您可以通过执行以下解决方案之一来做到这一点: 使用构造函数@Autowired 这种方法将构造需要一些bean作为构造函数参数的bean。在构造函数代码中,您可以将静态字段的值设

  • 我在看一个项目,我发现了一些很奇怪的东西。 现在,我认为唯一的两个优点是,在非静态容器中封装时,命名更加清晰,并且可以传递的参数更少。 但我想知道这是不是一个好主意,通过设计来包装静态类与非静态?如果有的话,还有哪些其他原因?因为我认为创建一个静态并对其进行调用是可以的。但是这个项目特意将所有静态类打包;我也不知道为什么。

  • 问题内容: 我有一个充满实用程序功能的类。实例化它的实例没有语义,但是我仍然想调用它的方法。处理此问题的最佳方法是什么?静态课?抽象? 问题答案: 标记为final的类上的私有构造函数和静态方法。

  • 我在静态类中存储游戏的纹理。它们从管理器加载到此类的静态数组中。 每个屏幕都有一个dispose方法,但我应该在纹理上的何处调用dispose。libGDX是否只在应用程序退出时处理,因此我应该在每个屏幕中处理纹理?

  • 问题内容: 有什么像在Java中吗? 这样的课是什么意思。静态类的所有方法都需要吗? 是否需要反过来,如果一个类包含所有静态方法,那么该类也应该是静态的吗? 静态类有什么用? 问题答案: Java具有静态嵌套类,但听起来你正在寻找顶级静态类。Java无法将顶级类设为静态,但是你可以像这样模拟静态类: 声明你的课程-阻止扩展课程,因为扩展静态课程没有意义 创建构造函数-防止通过客户端代码实例化,因为

  • 静态类有什么好处?