我们需要 Spring Beans 中的静态字段吗?

Do we need static fields in Spring Beans?

我已经看到将 Logger 实例创建为 class 的静态属性的一般做法,并用任何 Spring 的注释(@Component@Service)进行注释.

因为,所有创建的 bean 本质上都是默认的单例。我们真的需要这个 scnerio 中的静态字段,因为毕竟只有一次实例吗?

我认为对于 final 也可以问同样的问题:“如果我知道我不会通过代码触及它,为什么还要将变量声明为 final?

事实是,您不是唯一接触或阅读代码的人。赋予正确的语义对于可读和可维护的代码至关重要。您可能知道服务 and/or 控制器将是一个单例,因此不需要将变量放在静态中,但通过这种方式您可以显式声明它。

加法:

how are you going to log something during the construction of your singleton, if construction fails :-)

我引用 @dognose 评论只是为了让答案更完整。使记录器静态地址存在一个实际问题:在创建期间记录。

后续:

I simply wanted to know why would we need final static Logger instead of just final Logger. What justifies a logger to be static member instead of just being class member?

让我们假设您的 class 不是单身人士。在这种情况下,Logger 必须只是记录。它与对象无关,它是一个class属性。这意味着如果您实例化一个或一千个对象,记录器不会改变。所以你可以在所有对象之间共享它,从而使其成为静态的。

让我们假设您的 class 是单身人士。永远只有一个实例。静态还有用吗?从实际的角度来看,没有。您将只有一个 class 实例,因此只有一个记录器,无论是否静态。不过,如果您声明它是静态的,那么您就是在声明您希望该记录器是 class 的 属性,而不是 class 的对象。您明确了您的意图和设计,从而提高了代码质量。

希望这能回答您的问题。