java 当设置活动配置文件时,Sping Boot 会选择接口的非配置文件实现沿着配置文件实现

qhhrdooz  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(143)

我一直在为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,如果人们想看看。

tjjdgumg

tjjdgumg1#

@Profile annotation限制了bean的创建,在没有@Profile的情况下,如果存在@Service,Spring将创建bean并将其添加到应用程序上下文。现在,它可以像任何其他相同类型的bean一样自动连接。
看看你的用例,看起来你正在创建对i18 n的支持。我不认为你想使用Profiles来驱动这种行为。原因之一是,对于你想要支持的每一种新语言,你必须创建一个全新的GreetingService示例。Spring内置了对i18 n的支持;只需为您想要支持的每种语言创建message文件,例如,阅读他们的MessageSourceSpring Internationalization文档。

pu3pd22g

pu3pd22g2#

总是创建没有@Profile(或任何相关条件)的Bean。
你可以用@Primary标记你的非配置文件限制的实现,这意味着如果没有专用的候选者(通过名称或限定符),可以使用这个。

相关问题