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



使用@Bean和静态方法是一个好的做法吗?

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

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

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

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

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

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

最新更新