Spring缓存从bean方法返回的对象
Spring caches the object returned from a bean method
假设我有以下 bean 方法:
@Bean
public Queue invoiceRegenerationQueue() {
return new Queue(configurationManager.getQueue().getInvoiceRegenerationQueueName(), true);
}
并在我的代码中的某处调用此方法:
var binding = BindingBuilder
.bind(invoiceRegenerationQueue())
我刚刚发现,当我调用这个方法时,我总是会得到相同的对象,而不是我预期的不同对象。当我使用 @Autowired
注释时,我预计 Spring 只会从上下文中注入对象,但它似乎还缓存了从 bean 方法返回的对象。我的意思是我调试了那个并且每次调用那个方法 returns 同一个对象就像 spring 拦截对该方法的调用和 returns 来自缓存的对象。
我尝试 google 但尚未在文档中找到对此的任何引用。为什么会这样?有谁知道我可以在哪里阅读文档中的此类行为?
I have only just discovered that when I call this method I will always get the same object instead of different objects as I expected.
没错。 Spring 使用字节码操作技术修改 @Configuration
类 中的 @Bean
方法,以便对此类方法的多次调用将 return 同一个实例 - 如果你看起来很奇怪查看源代码本身。
原因是大多数 Spring bean 都是单例,当相应的 @Bean
方法被多次调用时,您不希望创建这些 bean 的多个实例。
Spring 参考文档的以下部分对此进行了解释:Further Information About How Java-based Configuration Works Internally
假设我有以下 bean 方法:
@Bean
public Queue invoiceRegenerationQueue() {
return new Queue(configurationManager.getQueue().getInvoiceRegenerationQueueName(), true);
}
并在我的代码中的某处调用此方法:
var binding = BindingBuilder
.bind(invoiceRegenerationQueue())
我刚刚发现,当我调用这个方法时,我总是会得到相同的对象,而不是我预期的不同对象。当我使用 @Autowired
注释时,我预计 Spring 只会从上下文中注入对象,但它似乎还缓存了从 bean 方法返回的对象。我的意思是我调试了那个并且每次调用那个方法 returns 同一个对象就像 spring 拦截对该方法的调用和 returns 来自缓存的对象。
我尝试 google 但尚未在文档中找到对此的任何引用。为什么会这样?有谁知道我可以在哪里阅读文档中的此类行为?
I have only just discovered that when I call this method I will always get the same object instead of different objects as I expected.
没错。 Spring 使用字节码操作技术修改 @Configuration
类 中的 @Bean
方法,以便对此类方法的多次调用将 return 同一个实例 - 如果你看起来很奇怪查看源代码本身。
原因是大多数 Spring bean 都是单例,当相应的 @Bean
方法被多次调用时,您不希望创建这些 bean 的多个实例。
Spring 参考文档的以下部分对此进行了解释:Further Information About How Java-based Configuration Works Internally