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

例如

@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集合中,并将该集合注入到方法参数中。

示例

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

@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了。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-19 09:38:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-19 09:38:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-19 09:38:05       82 阅读
  4. Python语言-面向对象

    2024-06-19 09:38:05       91 阅读

热门阅读

  1. MongoDB基础知识

    2024-06-19 09:38:05       34 阅读
  2. 十三、数论基础

    2024-06-19 09:38:05       29 阅读
  3. Ruby 数据库访问 - DBI 教程

    2024-06-19 09:38:05       38 阅读
  4. 安卓交叉编译——ndk

    2024-06-19 09:38:05       39 阅读
  5. Swarm 集群管理

    2024-06-19 09:38:05       35 阅读
  6. PostgreSQL源码分析——创建用户

    2024-06-19 09:38:05       33 阅读
  7. Linux 上的 TTY 是什么?

    2024-06-19 09:38:05       31 阅读
  8. USB 端点停止

    2024-06-19 09:38:05       33 阅读