技术专家篇:深入理解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了。

相关推荐
成为大佬先秃头32 分钟前
开放标准(RFC 7519):JSON Web Token (JWT)
spring boot·后端·json·jwt
回家路上绕了弯1 小时前
Git worktree 终极指南:告别分支切换烦恼,实现多分支并行开发
git·后端
@atweiwei1 小时前
用 Rust 构建agent的 LLM 应用的高性能框架
开发语言·后端·rust·langchain·eclipse·llm·agent
skilllite作者1 小时前
Spec + Task 作为「开发协议层」:Rust 大模型辅助的标准化、harness 化与可回滚
开发语言·人工智能·后端·安全·架构·rust·rust沙箱
懒得起名_yyf1 小时前
Http---详细格式介绍
后端
程序员cxuan1 小时前
今天看到很多人讨论 Linux 终于要接受 AI 提交的代码了,我的第一反应是,真的吗?作为喷 AI 最狠的祖师爷到底咋看这件事儿?
后端·程序员
何陋轩1 小时前
GitHub Copilot深度使用指南:手把手教你在IDEA中榨干AI生产力
人工智能·后端
fish20261 小时前
车载日志限流稽查系统
后端
云边有个稻草人1 小时前
NFS 环境 KES 安装 Operation not permitted 报错排查 + 最佳实践
后端
程序员小崔日记2 小时前
技术之外,皆是人间
后端·ruoyi·计算机温情