RuoYi框架中Bean依賴注入:DataSource是如何在沒有顯式定義實體類的情況下注入的?

RuoYi框架中Bean依賴注入:DataSource是如何在沒有顯式定義實體類的情況下注入的?

RuoYi框架巧妙的Bean依賴注入機制:DataSource無需顯式定義

RuoYi框架以其簡潔高效的代碼風格而聞名,但其Bean依賴注入的實現方式,特別是DataSource的注入,常常讓初學者困惑。本文將深入剖析RuoYi框架如何實現DataSource的依賴注入,無需顯式定義實體類。

問題:DataSource的隱式注入

在模仿RuoYi框架的com.ruoyi.framework.config.mybatisconfig時,開發者可能會遇到找不到DataSource類型的Bean的錯誤。然而,代碼中并沒有顯式的DataSource實體類定義,這正是問題的關鍵所在。

解決方案:spring的@Configuration和@Bean注解

RuoYi框架巧妙地利用了spring框架的@Configuration和@Bean注解。以DruidConfig.Java為例,關鍵代碼如下:

@Configuration public class DruidConfig {     @Bean     @ConfigurationProperties("spring.datasource.druid.master")     public DataSource masterDataSource(DruidProperties druidProperties) {         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();         return druidProperties.dataSource(dataSource);     }      // ... (slaveDataSource方法類似) ...      @Bean(name = "dynamicDataSource")     @Primary     public DynamicDataSource dataSource(DataSource masterDataSource) {         Map<Object, Object> targetDataSources = new HashMap<>();         targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);         // ... (設置slaveDataSource) ...         return new DynamicDataSource(masterDataSource, targetDataSources);     } }

@Configuration注解將DruidConfig類標記為Spring配置類。@Bean注解則表明masterDataSource和slaveDataSource方法會創建并返回DataSource類型的Bean。spring容器會在需要注入DataSource類型Bean時,自動調用這些方法,并將返回的Bean注入到依賴的地方。

slaveDataSource方法使用了@ConditionalOnProperty注解,只有當配置文件中spring.datasource.druid.slave.enabled屬性為true時,才會創建slaveDataSource Bean。

dataSource方法創建dynamicDataSource Bean,它依賴于masterDataSource Bean。Spring容器會先創建masterDataSource Bean,然后利用它創建dynamicDataSource Bean。

結論:Spring的自動裝配機制

RuoYi框架并非通過顯式定義DataSource實體類實現依賴注入,而是利用Spring容器的自動裝配機制,在DruidConfig類中定義Bean的創建方法,并通過@Configuration和@Bean注解實現Bean的依賴注入。 如果開發者遇到錯誤,很可能是DruidConfig類或相關配置缺失,導致Spring容器無法找到DataSource類型的Bean。 務必檢查項目配置,確保DruidConfig類正確加載并運行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享