Spring @Bean注解用法
在Spring框架中,當一個@Bean方法的入參需要注入依賴時(如你示例中的DbStateMachineConfig),其依賴解析邏輯遵循Spring的依賴注入規則,核心是“按類型匹配,按名稱兜底”。
1. 基礎邏輯:按類型匹配(byType)
Spring會先根據入參的類型(DbStateMachineConfig) 在容器中查找匹配的Bean。
- 如果容器中只有一個類型為
DbStateMachineConfig或其子類的Bean(因為子類是父類的“is-a”關系,符合類型匹配),Spring會直接將該Bean注入到方法參數中。 - 例如:如果有一個
MyDbStateMachineConfig extends DbStateMachineConfig,且它被注冊為Bean,那么Spring會認為它是DbStateMachineConfig類型的候選者,直接注入。
2. 多個子類Bean的情況:類型沖突與解決
如果容器中存在多個DbStateMachineConfig的子類Bean(即多個候選者),僅按類型無法唯一確定,此時Spring會拋出NoUniqueBeanDefinitionException異常。
需要通過以下方式手動指定具體使用哪個Bean:
方式1:使用@Primary指定優先Bean
在多個子類Bean中,給需要優先注入的子類Bean添加@Primary注解。當類型匹配存在多個候選者時,Spring會優先選擇被@Primary標注的Bean。
示例:
// 子類1:被@Primary標注,優先注入
@Bean
@Primary
public class FirstDbConfig extends DbStateMachineConfig { ... }
// 子類2:不標注@Primary
@Bean
public class SecondDbConfig extends DbStateMachineConfig { ... }
// 此時,stateMachineEngine方法會注入FirstDbConfig
方式2:使用@Qualifier指定Bean名稱
通過@Qualifier注解明確指定需要注入的Bean的名稱(默認是類名首字母小寫,如firstDbConfig、secondDbConfig),實現“按名稱匹配”。
示例:
// 子類1:指定Bean名稱為"firstConfig"
@Bean("firstConfig")
public class FirstDbConfig extends DbStateMachineConfig { ... }
// 子類2:指定Bean名稱為"secondConfig"
@Bean("secondConfig")
public class SecondDbConfig extends DbStateMachineConfig { ... }
// 在入參上通過@Qualifier指定名稱
@Bean
public ProcessCtrlStateMachineEngine stateMachineEngine(
@Qualifier("firstConfig") DbStateMachineConfig dbStateMachineConfig
) {
...
}
// 此時,注入的是名稱為"firstConfig"的FirstDbConfig
總結
- Spring默認按類型解析
@Bean方法的入參依賴,子類Bean會被視為父類類型的候選者。 - 多個子類Bean存在時,必須通過
@Primary(指定優先)或@Qualifier(指定名稱)解決沖突,否則會拋出類型不唯一的異常。

浙公網安備 33010602011771號