我们应该使用带有静态方法的Spring @Bean吗?

3

在使用静态方法时,使用@Bean是一个好的实践吗?

public class Foo {
}

@Configuration
public FooFactory {

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

}
1个回答

6
通常来说,@Bean 方法不需要是静态的。
当一个@Bean方法不是静态的时候,创建该bean需要先创建其类的一个实例,例如你的示例中的FooFactory。绝大多数情况下这没问题,但有时如果bean是应用程序上下文生命周期非常早期就需要的类型,则可能会出现问题。这些类型的两个示例是 BeanPostProcessorBeanFactoryPostProcessor。在这些情况下,应将@Bean方法声明为静态,以允许在首先创建@Configuration类的实例之前创建bean。
您可以在Spring框架的参考文档的此部分的末尾了解更多信息:
引用块:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接