Autowired自动注入Map问题

问题

昨天开发的时候遇到一个诡异的问题,通过Map注入接口下所有的子类,然后json打印出来的时候,没有子类的信息,并且去调用的时候报了空指针异常。

排查问题过长,并且涉及到源码,所以这里先说结论,就是因为map取数据的时候首字母大写导致的。

但是由于业务代码的复杂问题,导致以为注入问题,一直在看源码。

本文可以帮助您学习一下Autowired注解逻辑源码

代码

工厂类

@Slf4j
@Component
public class XyHandleFactory {
   
   

    @Autowired
    private Map<String, XyHandle> xyHandleMap;

    public XyCallBackHandle getXyCallBack(Integer subType) {
   
   
        log.info("subType:{}", subType);
        log.info("xyHandleMap:{}", JSON.toJSONString(xyHandleMap));
        switch (subType) {
   
   
            case 101:
                return xyHandleMap.get("xyChangeHandleImpl");
            case 102
Spring Boot 中,`@Autowired` 注解可以用于将 `Map` 类型的 Bean 自动注入到接口或其他组件中。这种机制允许开发者通过键值匹配的方式获取特定类型的多个实现。 以下是关于如何在接口中实现 Map自动注入的相关说明: ### 使用 @Autowired 注入 Map 当有多个相同类型的 Bean 实现时,Spring 容器会自动将这些 Bean 装载到一个 `Map<String, YourInterface>` 结构中,其中 Key 是 Bean 名称,Value 是对应的 Bean 实例[^1]。 #### 示例代码 假设有一个名为 `MyService` 的接口及其两个具体实现类 `ServiceImplA` 和 `ServiceImplB`。 ```java // 定义接口 MyService public interface MyService { void execute(); } // 实现类 ServiceImplA @Component("serviceA") // 设置 Bean 名称为 serviceA public class ServiceImplA implements MyService { @Override public void execute() { System.out.println("Executing from Service A"); } } // 实现类 ServiceImplB @Component("serviceB") // 设置 Bean 名称为 serviceB public class ServiceImplB implements MyService { @Override public void execute() { System.out.println("Executing from Service B"); } } ``` 接着,在另一个组件中使用 `@Autowired` 将所有实现了 `MyService` 接口的 Bean 注入到一个 `Map` 中。 ```java @Component public class MyComponent { private final Map<String, MyService> myServices; @Autowired public MyComponent(Map<String, MyService> myServices) { this.myServices = myServices; } public void invokeAllServices() { for (String key : myServices.keySet()) { System.out.println("Invoking service with name: " + key); myServices.get(key).execute(); // 执行对应的服务方法 } } } ``` 上述代码片段展示了如何利用构造函数注入来装载所有的 `MyService` 实现,并将其存储在一个 `Map` 数据结构中[^2]。 ### 配置项目环境 为了使以上功能正常运行,需按照以下步骤完成项目的初始化和配置工作: 1. **创建 Spring Boot 项目** 可以借助 Spring Initializr 工具快速搭建一个新的 Spring Boot 应用程序或者手动构建 Maven 或 Gradle 项目[^3]。 2. **添加必要的依赖项** 对于基于 Maven 构建工具的情况,确保 pom.xml 文件中有如下核心依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> ``` 这一步骤保证了应用能够识别并启用 Spring 上下文中定义的各种注解支持,比如 `@Component`, `@Autowired` 等。 ### 总结 通过上述方式,可以在 Spring Boot 应用中轻松实现对一组具有共同父类型(如接口)的对象集合管理操作。容器会依据注册名称与实际对象实例建立映射关系存放到指定变量里供后续调用处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值