RuoYi框架如何实现Bean依赖注入而无需显式编写DataSource实现类?

RuoYi框架如何实现Bean依赖注入而无需显式编写DataSource实现类?

RuoYi框架巧妙的Bean依赖注入:无需显式DataSource实现类

RuoYi框架以其简洁的代码和高效的开发体验而闻名。然而,初学者可能会对它如何实现Bean依赖注入而不显式编写DataSource实现类感到困惑。本文将通过分析RuoYi框架的代码,阐明其背后的机制。

许多开发者在模仿RuoYi框架的com.ruoyi.framework.config.MybatisConfig时,常遇到“无法自动装配,找不到’datasource’类型的bean”的错误。这是因为他们试图直接注入DataSource对象,而RuoYi框架并没有直接定义DataSource的实现类。

RuoYi框架的核心在于巧妙地利用了spring框架的依赖注入机制和@Configuration注解。它并非省略了DataSource的定义,而是将DataSource的创建和配置委托给了DruidConfig.Java这个配置类。

让我们深入分析DruidConfig.java的关键代码:

/**  * Druid 多数据源配置  *  * @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标记为Spring配置类。@Bean注解则指示方法会创建一个Bean并注册到spring容器中。masterDataSource和slaveDataSource方法分别创建主数据源和从数据源的Bean,并通过@ConfigurationProperties注解从配置文件读取配置信息。@ConditionalOnProperty注解确保从数据源Bean仅在配置文件中启用时才创建。最后,dataSource方法整合主从数据源,创建一个动态数据源Bean。

当需要注入DataSource类型Bean时,Spring容器会自动查找并注入已注册的masterDataSource或dynamicDataSource Bean。因此,RuoYi框架并非没有DataSource的实现,而是通过Spring的依赖注入机制和配置类,将DataSource的创建和配置隐藏在DruidConfig类中,从而保持代码简洁。开发者只需声明需要注入DataSource类型的Bean,Spring容器就会自动完成依赖注入。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享