【问题标题】:Should we use Spring @Bean with static method?我们应该使用带有静态方法的 Spring @Bean 吗?
【发布时间】:2021-10-20 03:26:36
【问题描述】:

将@Bean 与静态方法一起使用是一种好习惯吗?

public class Foo {
}
@Configuration
public FooFactory {

    @Bean
    public static Foo getFoo() {
        return new Foo();
    }

}

【问题讨论】:

    标签: java spring dependency-injection spring-bean


    【解决方案1】:

    一般来说,@Bean 方法不需要是静态的。

    @Bean 方法不是静态的时,创建bean 需要首先创建其类的实例,在您的示例中为FooFactory。绝大多数情况下这很好,但如果 bean 属于应用程序上下文生命周期早期需要的类型,则有时会导致问题。这种类型的两个示例是BeanPostProcessorBeanFactoryPostProcessor。在这些情况下,您应该将 @Bean 方法声明为静态方法,以便无需先创建 @Configuration 类的实例即可创建 bean。

    您可以在 Spring Framework 的参考文档中this section 末尾处了解更多信息:

    您可以将@Bean 方法声明为静态方法,允许在不将其包含的配置类创建为实例的情况下调用它们。这在定义后处理器 bean(例如,BeanFactoryPostProcessorBeanPostProcessor 类型)时特别有意义,因为这些 bean 在容器生命周期的早期就被初始化,并且应该避免在那个时候触发配置的其他部分。

    由于技术限制,对静态 @Bean 方法的调用永远不会被容器拦截,即使在 @Configuration 类中(如本节前面所述)也不会被拦截:CGLIB 子类化只能覆盖非静态方法。因此,直接调用另一个 @Bean 方法具有标准的 Java 语义,从而导致直接从工厂方法本身返回一个独立的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多