技术专家篇:深入理解Spring Boot配置类中List<Bean>参数的应用

例如

java 复制代码
@Configuration
@ConditionalOnClass(LoginUser.class)
public class DataPermissionAutoConfiguration {

    @Bean
    @ConditionalOnBean(value = { PermissionApi.class, DeptDataPermissionRuleCustomizer.class })
    public DeptDataPermissionRule deptDataPermissionRule(PermissionApi permissionApi,
            List<DeptDataPermissionRuleCustomizer> customizers) {
        DeptDataPermissionRule rule = new DeptDataPermissionRule(permissionApi);
        customizers.forEach(customizer -> customizer.customize(rule));
        return rule;
    }
}

在Spring框架中,通过依赖注入(Dependency Injection,DI)机制,可以自动将符合条件的多个Bean注入到一个集合中。这种特性使得Spring能够自动检测和注入所有符合类型要求的Bean。

来解释你的具体情况:你定义了一个@Bean方法deptDataPermissionRule,该方法有两个参数:

  1. PermissionApi permissionApi
  2. List<DeptDataPermissionRuleCustomizer> customizers

这里,List<DeptDataPermissionRuleCustomizer> customizers表示Spring会自动注入所有实现了DeptDataPermissionRuleCustomizer接口的Bean,并将它们组织到一个List集合中传递给deptDataPermissionRule方法。

具体原理

Spring的DI机制在初始化上下文时,会扫描应用程序中的所有Bean定义,并且根据类型匹配的规则进行依赖注入。对于List<DeptDataPermissionRuleCustomizer>这样的集合类型参数。

Spring会找到所有符合DeptDataPermissionRuleCustomizer类型的Bean,并将它们注入到这个集合中。

详细步骤

  1. 扫描和注册Bean:Spring会扫描应用程序上下文并找到所有标记为Bean的类和方法,并将这些Bean注册到Spring的IoC容器中。

  2. 依赖解析 :当Spring需要创建一个Bean实例时,它会检查该Bean的构造函数和方法参数。如果遇到一个集合类型参数(例如List<DeptDataPermissionRuleCustomizer>),Spring会查找所有匹配该集合元素类型的Bean。

  3. 集合注入 :Spring将所有匹配的Bean放入一个List集合中,并将该集合注入到方法参数中。

示例

假设你有以下几个自定义器类:

java 复制代码
@Component
public class CustomizerA implements DeptDataPermissionRuleCustomizer {
    @Override
    public void customize(DeptDataPermissionRule rule) {
        // Custom logic for A
    }
}

@Component
public class CustomizerB implements DeptDataPermissionRuleCustomizer {
    @Override
    public void customize(DeptDataPermissionRule rule) {
        // Custom logic for B
    }
}

在这种情况下,Spring会自动将CustomizerACustomizerB这两个Bean注入到List<DeptDataPermissionRuleCustomizer>中,并传递给deptDataPermissionRule方法。

条件注入

你的代码中还使用了@ConditionalOnBean注解,这表示deptDataPermissionRule这个Bean的创建是有条件的,它只有在Spring上下文中存在PermissionApi和至少一个DeptDataPermissionRuleCustomizer Bean时才会被创建。

总结起来,Spring通过自动化的依赖注入机制,能够自动收集并注入所有符合类型要求的Bean到集合类型参数中,这样你就可以在方法中使用这些Bean了。

相关推荐
霸道流氓气质2 分钟前
Windows 本地搭建 CDC 全链路测试环境(Kafka+Canel+binlog+SpringBoot)
windows·spring boot·kafka
程序员爱钓鱼4 分钟前
Rust 控制流 if 详解:条件判断与 if 表达式
前端·后端·rust
Demon_Hao11 分钟前
Spring Boot 4、JDK 25 与 GraalVM:Java 云原生进化,能否撼动 Go 的地位?
java·spring boot·云原生
kyle~1 小时前
Swagger ---基于 描述文件 生成 交互式API文档 的工具
前端·后端·规格说明书·说明文档
江畔柳前堤9 小时前
GO01-Go 语言与主流编程语言深度对比
开发语言·人工智能·后端·微服务·云原生·golang·go
世界哪有真情10 小时前
拿人类意识卡 AI?等于用 bug 验收正式产品
前端·人工智能·后端
Csvn12 小时前
Day 3:LIKE 与模式匹配 — 让查询学会"模糊搜索"
后端·sql
Hazenix13 小时前
Go 指南:一篇文章速通 Golang
开发语言·后端·golang
灯澜忆梦13 小时前
GO_复合类型---指针
开发语言·后端·golang
IT_陈寒13 小时前
SpringBoot自动装配坑了我一天,原来问题出在这
前端·人工智能·后端