SpringBoot AutoWired 注入服务为null的事件

问题:

使用Springboot中websocket的功能的时候,导致其中一个service自动注入结果为null,定位到问题之后,,发现有一个类没有完成注入。

解决

spring 或 springboot 的 websocket 里面使用 @Autowired 注入 service 或 bean 时,报空指针异常,service 为 null(并不是不能被注入)。

解决方法:将要注入的 service 改成 static,就不会为null了。

@Controller
@ServerEndpoint(value="/chatSocket")
public class ChatSocket {
    //  这里使用静态,让 service 属于类
    private static ChatService chatService;

    // 注入的时候,给类的 service 注入
    @Autowired
    public void setChatService(ChatService chatService) {
        ChatSocket.chatService = chatService;
    }
}
本质原因:

spring管理的都是单例(singleton),和 websocket (多对象)相冲突。
详细解释:项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当新用户进入聊天时,系统又会创建一个新的 websocket 对象,这时矛盾出现了:spring 管理的都是单例,不会给第二个 websocket 对象注入 service,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了。
像 controller 里面有 service, service 里面有 dao。因为 controller,service ,dao 都有是单例,所以注入时不会报 null。但是 websocket 不是单例,所以使用spring注入一次后,后面的对象就不会再注入了,会报null。

原文出处:https://www.cnblogs.com/dyingstraw/p/12865800.html#:~:text=spring%20%E6%88%96%20springboot%20%E7%9A%84%20websocket%20%E9%87%8C%E9%9D%A2%E4%BD%BF%E7%94%A8%20%40Autowired%20%E6%B3%A8%E5%85%A5,bean%20%E6%97%B6%EF%BC%8C%E6%8A%A5%E7%A9%BA%E6%8C%87%E9%92%88%E5%BC%82%E5%B8%B8%EF%BC%8Cservice%20%E4%B8%BA%20null%EF%BC%88%E5%B9%B6%E4%B8%8D%E6%98%AF%E4%B8%8D%E8%83%BD%E8%A2%AB%E6%B3%A8%E5%85%A5%EF%BC%89%E3%80%82%20%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95%EF%BC%9A%E5%B0%86%E8%A6%81%E6%B3%A8%E5%85%A5%E7%9A%84%20service%20%E6%94%B9%E6%88%90%20static%EF%BC%8C%E5%B0%B1%E4%B8%8D%E4%BC%9A%E4%B8%BAnull%E4%BA%86%E3%80%82

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当Spring Boot依赖注入null时,可能是以下原因之一: 1. 没有正确配置依赖注入:确保在类中正确使用@Autowired或@Inject注释,并且已经在应用程序上下文中正确配置了bean。 2. 依赖项未正确初始化:如果依赖项是通过构造函数注入的,请确保构造函数已正确实现,并且依赖项已正确初始化。 3. 依赖项的作用域不正确:如果依赖项的作用域不正确,则可能会导致依赖项为null。确保依赖项的作用域与应用程序的要求相匹配。 4. 依赖项的名称不正确:如果依赖项的名称不正确,则可能会导致依赖项为null。确保依赖项的名称与应用程序的要求相匹配。 如果您遇到Spring Boot依赖注入null的问题,请检查上述原因,并尝试解决问题。 ### 回答2: SpringBoot依赖注入null的问题可能是由以下几种情况引起的: 1. 未添加注解或注解错误 在使用依赖注入时,应该使用相应的注解,如@Autowire、@Resource、@Inject等,以告诉SpringBoot需要注入哪些依赖。如果没有添加注解或注解错误,SpringBoot会无法正确地进行依赖注入,导致注入的实例为null。 2. 属性名与注入的bean不一致 在使用依赖注入时,应该确保属性名与注入的bean的名称一致,否则SpringBoot也无法正确地进行依赖注入,导致注入的实例为null。例如,如果一个bean的名称为userService,那么注入该bean的属性也应该命名为userService。 3. 对应的bean未被扫描到 如果使用了基于注解的依赖注入,需要确保对应的bean已被正确扫描到。如果未能扫描到对应的bean,SpringBoot无法正确进行依赖注入,导致注入的实例为null。 4. Bean的作用域不正确 在SpringBoot中,Bean有不同的作用域,包括Singleton、Prototype、Request、Session等。如果使用了错误的作用域,也可能导致依赖注入失败,注入的实例为null。 总之,当出现SpringBoot依赖注入null的问题时,需要检查以上几个方面是否出现了错误,以确保依赖注入能够正确进行。同时,需要确保代码规范清晰,注解正确,并且使用正确的作用域,以保证依赖注入能够正常运行。 ### 回答3: 在使用SpringBoot进行依赖注入时,出现依赖注入null的情况通常是因为以下原因: 1. 没有在类上添加@Component或其他注解 SpringBoot的依赖注入需要在类上添加相应的注解(如@Controller、@Service、@Repository等)。如果没有添加注解,SpringBoot就无法识别该类为一个需要注入依赖的组件,从而无法完成依赖注入。因此,需要确保在类上添加了正确的注解。 2. 没有在属性上添加@Autowired注解 在依赖注入需要注入的属性时,需要在属性上使用@Autowired注解。该注解会告诉SpringBoot需要自动注入一个对应的Bean。如果没有添加@Autowired注解,则无法完成依赖注入。 3. Bean的命名问题 在SpringBoot中,如果有多个Bean的类型相同,则需要使用@Qualifier来指定需要注入的Bean的名称。如果没有指定正确的Bean名称,依赖注入也会失败。 4. 属性类型与Bean类型不匹配 在进行依赖注入时,需要确保属性类型与需要注入的Bean类型一致。如果类型不一致,则依赖注入也会失败。 5. Bean未被正确创建 如果Bean未被正确创建,则依赖注入也会失败。可以检查一下Bean的配置是否正确,或者查看Bean的创建过程是否出现了错误。 以上是SpringBoot依赖注入null的一些常见原因及解决办法。需要注意的是,在实际开发中,出现依赖注入null的情况可能还会有其他原因,需要结合具体代码进行排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值