@Configuration是单例吗

Jos*_*uel 7 java singleton javabeans spring-boot

我正在做我的日常工作,我意识到尽管我经常使用@Configuration,但我不知道它到底是如何工作的,在阅读了 spring.io 文档后,我无法确定 @Configuration 是否是一种制作单例类。

\n\n

所以......我想我的问题是:

\n\n

我应该使用什么来正确创建单例 @Configuration 或 @Component?这是为什么'?

\n\n

我一直在研究这两个选项,并举了两个这样的例子:

\n\n

第一个例子

\n\n
@Configuration\npublic static class Config {\n\n    @Bean\n    public SimpleBean simpleBean() {\n        return new SimpleBean();\n    }\n\n    @Bean\n    public SimpleBeanConsumer simpleBeanConsumer() {\n        return new SimpleBeanConsumer(simpleBean());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个例子

\n\n
@Component\npublic static class Config {\n\n    @Bean\n    public SimpleBean simpleBean() {\n        return new SimpleBean();\n    }\n\n    @Bean\n    public SimpleBeanConsumer simpleBeanConsumer() {\n        return new SimpleBeanConsumer(simpleBean());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一段代码工作正常,并且正如预期的那样,SimpleBeanConsumer 将获得指向单例 SimpleBean 的链接。但不幸的是,它不能在签名环境中工作。

\n\n

第二种配置是完全不正确的,因为spring会创建一个SimpleBean的单例bean,但是SimpleBeanConsumer会获得另一个不受spring上下文控制的SimpleBean实例。

\n\n

这种行为的原因可以解释如下:

\n\n

如果使用 @Configuration,所有标记为 @Bean 的方法都将被包装到 CGLIB 包装器中,该包装器的工作方式就像第一次调用该方法一样,那么原始方法体将是执行后生成的对象将被注册到 spring 上下文中。所有进一步的调用都只返回从上下文中检索到的 bean。

\n\n

所以我想我已经回答了我自己的问题,但不确定我是否遗漏了一些东西。

\n