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