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。