首页 > 解决方案 > 我们应该使用带有静态方法的 Spring @Bean 吗?

问题描述

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

public class Foo {
}
@Configuration
public FooFactory {

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

}

标签: javaspringdependency-injectionspring-bean

解决方案


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

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

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

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

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


推荐阅读