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)完成依賴注入。