在使用静态方法时,使用@Bean是一个好的实践吗?
public class Foo {
}
@Configuration
public FooFactory {
@Bean
public static Foo getFoo() {
return new Foo();
}
}
在使用静态方法时,使用@Bean是一个好的实践吗?
public class Foo {
}
@Configuration
public FooFactory {
@Bean
public static Foo getFoo() {
return new Foo();
}
}
@Bean
方法不需要是静态的。@Bean
方法不是静态的时候,创建该bean需要先创建其类的一个实例,例如你的示例中的FooFactory
。绝大多数情况下这没问题,但有时如果bean是应用程序上下文生命周期非常早期就需要的类型,则可能会出现问题。这些类型的两个示例是 BeanPostProcessor
和 BeanFactoryPostProcessor
。在这些情况下,应将@Bean
方法声明为静态,以允许在首先创建@Configuration
类的实例之前创建bean。您可以将@Bean
方法声明为静态方法,从而允许在没有将其包含的配置类作为实例创建的情况下调用它们。这特别适用于定义后处理器bean(例如,BeanFactoryPostProcessor
或BeanPostProcessor
类型),因为这样的bean在容器生命周期的早期得到初始化,并且应避免在那个时候触发配置的其他部分。
容器从未拦截对静态的@Bean
方法的调用,即使在@Configuration
类中也是如此(如本节前面所述),这是由于技术限制:CGLIB子类化只能覆盖非静态方法。因此,对另一个@Bean
方法的直接调用具有标准Java语义,直接从工厂方法本身返回独立的实例。