java - 我们应该使用带有静态方法的 Spring @Bean 吗?
问题描述
这是将@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。
您可以在本节末尾的Spring Framework 参考文档中了解更多信息:
您可以
@Bean
将方法声明为静态的,允许在不创建包含它们的配置类作为实例的情况下调用它们。BeanFactoryPostProcessor
这在定义后处理器 bean(例如,类型or )时特别有意义BeanPostProcessor
,因为这些 bean 在容器生命周期的早期就被初始化,并且应该避免在那个时候触发配置的其他部分。由于技术限制,对静态
@Bean
方法的调用永远不会被容器拦截,甚至在@Configuration
类中(如本节前面所述)也不会被拦截:CGLIB 子类化只能覆盖非静态方法。因此,直接调用另一个@Bean
方法具有标准的 Java 语义,从而导致直接从工厂方法本身返回一个独立的实例。
推荐阅读
- flutter - 点击列表视图项目颤动
- ios - 在 Mac、iPad 或 iPod touch 上拨打和接听电话
- javascript - 如何不保存使用 fetch 方法检索到的数据?Javascript
- symfony - DoctrineMigrations 与 Bundle 作为 Vendor-Package
- python - 用多个字符分割字符串(python)
- java - 为什么 Eclipse 内存分析器不显示 InetSocketAddress 字符串值?
- r - 将 RData 保存到不同的目录
- php - 在 Postman 中测试发送文件到 API 时,为什么我的简单发布请求不起作用?
- javascript - 将 zip 上传到即时游戏主机后,我收到以下错误 (blocked:csp)
- typescript - 在 Typescript 和 MySQL 中使用 pool.query 进行嵌套查询