RuoYi框架如何實(shí)現(xiàn)Bean依賴注入而無需顯式編寫DataSource實(shí)現(xiàn)類?

RuoYi框架如何實(shí)現(xiàn)Bean依賴注入而無需顯式編寫DataSource實(shí)現(xiàn)類?

RuoYi框架巧妙的Bean依賴注入:無需顯式DataSource實(shí)現(xiàn)類

RuoYi框架以其簡(jiǎn)潔的代碼和高效的開發(fā)體驗(yàn)而聞名。然而,初學(xué)者可能會(huì)對(duì)它如何實(shí)現(xiàn)Bean依賴注入而不顯式編寫DataSource實(shí)現(xiàn)類感到困惑。本文將通過分析RuoYi框架的代碼,闡明其背后的機(jī)制。

許多開發(fā)者在模仿RuoYi框架的com.ruoyi.framework.config.MybatisConfig時(shí),常遇到“無法自動(dòng)裝配,找不到’datasource’類型的bean”的錯(cuò)誤。這是因?yàn)樗麄冊(cè)噲D直接注入DataSource對(duì)象,而RuoYi框架并沒有直接定義DataSource的實(shí)現(xiàn)類。

RuoYi框架的核心在于巧妙地利用了spring框架的依賴注入機(jī)制和@Configuration注解。它并非省略了DataSource的定義,而是將DataSource的創(chuàng)建和配置委托給了DruidConfig.Java這個(gè)配置類。

讓我們深入分析DruidConfig.java的關(guān)鍵代碼:

/**  * Druid 多數(shù)據(jù)源配置  *  * @author ruoyi  */ @Configuration public class DruidConfig {     @Bean     @ConfigurationProperties("spring.datasource.druid.master")     public DataSource masterDataSource(DruidProperties druidProperties) {         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();         return druidProperties.dataSource(dataSource);     }      @Bean     @ConfigurationProperties("spring.datasource.druid.slave")     @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")     public DataSource slaveDataSource(DruidProperties druidProperties) {         DruidDataSource dataSource = DruidDataSourceBuilder.create().build();         return druidProperties.dataSource(dataSource);     }      @Bean(name = "dynamicDataSource")     @Primary     public DynamicDataSource dataSource(DataSource masterDataSource) {         Map<Object, Object> targetDataSources = new HashMap<>();         targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);         setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");         return new DynamicDataSource(masterDataSource, targetDataSources);     }     // ... }

@Configuration注解將DruidConfig標(biāo)記為Spring配置類。@Bean注解則指示方法會(huì)創(chuàng)建一個(gè)Bean并注冊(cè)到spring容器中。masterDataSource和slaveDataSource方法分別創(chuàng)建主數(shù)據(jù)源和從數(shù)據(jù)源的Bean,并通過@ConfigurationProperties注解從配置文件讀取配置信息。@ConditionalOnProperty注解確保從數(shù)據(jù)源Bean僅在配置文件中啟用時(shí)才創(chuàng)建。最后,dataSource方法整合主從數(shù)據(jù)源,創(chuàng)建一個(gè)動(dòng)態(tài)數(shù)據(jù)源Bean。

當(dāng)需要注入DataSource類型Bean時(shí),Spring容器會(huì)自動(dòng)查找并注入已注冊(cè)的masterDataSource或dynamicDataSource Bean。因此,RuoYi框架并非沒有DataSource的實(shí)現(xiàn),而是通過Spring的依賴注入機(jī)制和配置類,將DataSource的創(chuàng)建和配置隱藏在DruidConfig類中,從而保持代碼簡(jiǎn)潔。開發(fā)者只需聲明需要注入DataSource類型的Bean,Spring容器就會(huì)自動(dòng)完成依賴注入。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享