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类正确加载并运行。