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实现类?的详细内容,更多请关注代码网其它相关文章!
发表评论