
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容器就会自动完成依赖注入。
以上就是ruoyi框架如何实现bean依赖注入而无需显式编写datasource实现类?的详细内容,更多请关注代码网其它相关文章!
发表评论