为什么spring会将bean自动放入map

Spring 的依赖注入机制


        在 Spring 中,@Autowired 和构造函数注入支持按类型(byType)或按名称(byName)注入依赖。
        当声明一个 Map<String, T> 类型的参数时,Spring 会自动将所有类型为 T 的 Bean 放入该 Map 中:
        键:Bean 的名称(默认是类名首字母小写,通过 @Component("customName") 自定义)。
        值:对应的 Bean 实例
        这是 Spring 的设计特性之一,目的是为了简化开发者的编码工作。
Spring 容器在启动时会扫描所有的 Bean,并根据它们的类型和名称进行分类。
如果某个类需要一个 Map<String, T> 类型的依赖,Spring 会自动将符合条件的所有 Bean 放入该 Map 中。
具体过程:
        Spring 扫描到所有标注了 @Component 或其他注解(如 @Service、@Repository 等)的类。将这些类注册为 Bean,并记录它们的名称和类型。当需要注入 Map<String, T> 时,Spring 会遍历容器中的所有 Bean:
        如果 Bean 的类型匹配 T,则将其加入 Map。
        键为 Bean 的名称,值为 Bean 的实例。 

示例:

 

@Component("ruleA")
public class RuleA implements ILogicChain {
    @Override
    public void execute() {
        System.out.println("Executing RuleA");
    }

    @Override
    public ILogicChain appendNext(ILogicChain nextChain) {
        return this;
    }
}

@Component("ruleB")
public class RuleB implements ILogicChain {
    @Override
    public void execute() {
        System.out.println("Executing RuleB");
    }

    @Override
    public ILogicChain appendNext(ILogicChain nextChain) {
        return this;
    }
}

@Component("default")
public class DefaultRule implements ILogicChain {
    @Override
    public void execute() {
        System.out.println("Executing Default Rule");
    }

    @Override
    public ILogicChain appendNext(ILogicChain nextChain) {
        return this;
    }
}

当 Spring 启动时:
RuleA、RuleB 和 DefaultRule 都会被注册为 Bean。
它们的名称分别为 "ruleA"、"ruleB" 和 "default"。
如果某个类需要注入 Map<String, ILogicChain>,Spring 会自动将这些 Bean 放入 Map 中:

@Service
public class DefaultChainFactory {
private final Map<String, ILogicChain> logicChainGroupMap;
    
    public DefaultChainFactory(Map<String, ILogicChain> logicChainGroupMap) {
        this.logicChainGroupMap= logicChainGroupMap;
    }
}

logicChainGroupMap中就会有"ruleA"、"ruleB" 和 "default",对应各自的bean。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值