我一直在为Udemy上的一门课程做一些说明性编程,旨在展示使用Profiles和Qualifier的Sping Boot 依赖注入的原理。
有一个Test有一个@Autowired
控制器。在Controller中,它为英语GreetingService
指定@ActiveProfiles("EN")
,在构造函数中,它在GreetingService
参数上有一个限定符@Qualifier("i18nService")
,以便Controller的构造函数连接i18nService English GreetingService。
问题是还有一个没有@Profile
设置的GreetingService
,除非我在上面指定一个@Profile
,否则 Boot 将尝试连接英语i18nService * 和 * 默认的非配置文件版本,该版本没有设置限定符或配置文件。
为什么会发生这种情况?有什么好的理由吗?是否有一种方便的方法来指定“如果有一个指定的组件,你已经被明确告知要连接,而另一个更通用的组件,你还没有,连接你已经被告知要连接的组件,而不去管另一个”?
代码在https://github.com/Skiamakhos/Spring6DI/tree/main,如果人们想看看。
2条答案
按热度按时间tjjdgumg1#
@Profile
annotation限制了bean的创建,在没有@Profile
的情况下,如果存在@Service
,Spring将创建bean并将其添加到应用程序上下文。现在,它可以像任何其他相同类型的bean一样自动连接。看看你的用例,看起来你正在创建对i18 n的支持。我不认为你想使用Profiles来驱动这种行为。原因之一是,对于你想要支持的每一种新语言,你必须创建一个全新的GreetingService示例。Spring内置了对i18 n的支持;只需为您想要支持的每种语言创建
message
文件,例如,阅读他们的MessageSource和Spring Internationalization文档。pu3pd22g2#
总是创建没有
@Profile
(或任何相关条件)的Bean。你可以用
@Primary
标记你的非配置文件限制的实现,这意味着如果没有专用的候选者(通过名称或限定符),可以使用这个。