在静态方法中使用Bean



我有一个Utility类,我需要在Utility类中注入一个bean,并在Utility类的静态方法中使用它。我找到了一些解决方案,但它们在我们的项目中不起作用。然而,当我在一个新的演示项目中尝试建议的解决方案时,建议的解决方案是有效的。

这是演示实现:

控制器类:

@RestController
@RequestMapping("demo")
public class HelloController {
@GetMapping("convert")
public LocalDate hello(String value) {
return Utility.convert(value);
}
}

实用工具类:

@Component
public class Utility {
private static DateConverter staticDateConverter;
@Autowired
public Utility(DateConverter dateConverter) {
Utility.staticDateConverter = dateConverter;
}
public static LocalDate convert(String value) {
return staticDateConverter.convert(value);
}
}

在Utility类中需要的Bean:

@Component
public class DateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String value) {
return LocalDate.parse(value);
}
}

这个演示实现在我们的项目中完全实现了,但它的工作并不有趣。因此,如果您考虑这个例子,在我们的项目中,staticDateConverter是空的。

我的问题是,静态bean注入在我们的项目中不起作用的原因是什么?

如果我在某处自动使用Utility类,staticDateConverter会初始化。否则,staticDateConverter未初始化,因此给出空指针异常。

您展示的示例不是正确的解决方案。您不应该将假设只有静态方法的实用程序类声明为bean(组件)。这将创建一个Utility类的实例,并且所有注入的属性都是实例的属性,您不应该从静态方法访问这些属性。静态方法应该只执行无状态逻辑,也就是说,它只能依赖于通过方法传递给它的参数,不应该访问没有传递给方法的内部属性。否则它就变成了"邪恶的静态方法"。你会因此而带来更多的麻烦。如果你需要使用内部逻辑,如注入bean,你必须使用非静态方法的常规bean,也就是说,你的逻辑不适合Utils静态方法

最新更新