【问题标题】:Spring: Why method annotated with @PostConstruct cannot be static?Spring:为什么用@PostConstruct注解的方法不能是静态的?
【发布时间】:2021-02-18 05:31:18
【问题描述】:

我正在此站点上阅读有关 @PostConstruct 的文档:https://www.baeldung.com/spring-postconstruct-predestroy

是这样写的:

使用@PostConstruct 注解的方法可以有任何访问级别,但 它不能是静态的。

谁能告诉我为什么用这个注解注解的方法不能是静态的?

【问题讨论】:

  • Spring 类默认是单例的,所以只有 1 个实例,没有区别,没有 static 关键字它实际上是静态的。 spring 使用的实际类将是您指定的类周围的代理。
  • @EssexBoy 它让世界变得与众不同。 static 方法不能访问实例变量,这在@PostConstruct 方法中经常使用。如果 bean 具有像请求或会话这样的范围,也会导致问题,因为 static 将在类级别而不是实例级别。

标签: java spring spring-boot postconstruct


【解决方案1】:

嗯,方法的名称已经说明了它的作用。

PostConstruct,这个方法会在构造函数之后调用。它不能是静态的,因为静态方法不能访问非静态变量、方法等。

如果你需要静态的东西运行一次,你可以使用静态块。

【讨论】:

  • 注意:PostConstruct 并不总是在构造函数之后调用。可以在不调用 bean 构造函数的情况下调用 PostConstruct。例如。当我们将同一个 bean 添加到应用程序上下文但具有另一个限定符名称时。在这种情况下,构造函数将被调用一次,而 PostConstruct 将被调用多次。
  • @MaksymPecheniuk “PostConstruct 并不总是在构造函数之后调用。可以在不调用 bean 构造函数的情况下调用 PostConstruct。” - 那没有意义。在构造对象之前,不可能在对象上调用 PostConstruct 方法(或任何其他实例方法)。
  • 对不起,我的错是描述不好。构造函数肯定首先被调用。但是有可能构造函数会被调用一次,而 postConstruct 会被调用多次。
【解决方案2】:

谁能告诉我为什么用这个注解注解的方法不能 是静态的吗?

标有@PostConstruct 的方法是Spring 在创建bean 实例后应该调用的方法。该方法一般用于实例的一些后期构建配置。该方法是静态的是没有意义的,因为静态方法可能不会与类的任何实例中的任何实例状态交互。

【讨论】:

    猜你喜欢
    • 2022-10-23
    • 2014-01-03
    • 2011-03-02
    • 1970-01-01
    • 2011-11-16
    • 2010-09-27
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多