【问题标题】: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 属于应用程序上下文生命周期早期需要的类型,则有时会导致问题。这种类型的两个示例是BeanPostProcessor 和BeanFactoryPostProcessor。在这些情况下,您应该将 @Bean 方法声明为静态方法,以便无需先创建 @Configuration 类的实例即可创建 bean。
您可以在 Spring Framework 的参考文档中this section 末尾处了解更多信息:
您可以将@Bean 方法声明为静态方法,允许在不将其包含的配置类创建为实例的情况下调用它们。这在定义后处理器 bean(例如,BeanFactoryPostProcessor 或 BeanPostProcessor 类型)时特别有意义,因为这些 bean 在容器生命周期的早期就被初始化,并且应该避免在那个时候触发配置的其他部分。
由于技术限制,对静态 @Bean 方法的调用永远不会被容器拦截,即使在 @Configuration 类中(如本节前面所述)也不会被拦截:CGLIB 子类化只能覆盖非静态方法。因此,直接调用另一个 @Bean 方法具有标准的 Java 语义,从而导致直接从工厂方法本身返回一个独立的实例。