Advertisement

【spingboot基础知识】相关问题汇总

阅读量:

1、websocket中注入其他类失败

本质原因: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。

解决方案:

spring 或 springboot 的 websocket 里面使用 @Autowired 注入 service 或 bean 时,报空指针异常,service 为 null(并不是不能被注入)。 解决方法:将要注入的 service 改成 static,就不会为null了。

参考代码:

参考:<>

2、springboot循环依赖的问题

什么是依赖循环,比如:我现在有一个ServiceA需要调用ServiceB的方法,那么ServiceA就依赖于ServiceB,那在ServiceB中再调用ServiceA的方法,就形成了循环依赖。Spring在初始化bean的时候就不知道先初始化哪个bean就会报错。

最好的解决办法是实现解耦,最简单的方法是在其中某个类注入时在@Autowired注解后添加 @Lazy注解即可。

3、springboot实现异步服务

普通JAVA可通过实现多线程来实现异步服务。

在spingboot中,可在Application启动类中增加@EnableAsync 注解,并在想要实现异步的方法上添加注解@Async即可。

启动类:

复制代码
 @SkyArkApplication

    
 @EnableAsync
    
 public class DealApplication {
    
 //    private static LogProcesserService logProcesserService;
    
  
    
     public static void main(String[] args) {
    
  
    
     SpringApplication.run(DealApplication.class, args);
    
     }
    
 }
    
    
    
    

想要实现的异步方法:

复制代码
     @Async

    
     @Override
    
     public void testSend(javax.websocket.Session session, String sid) {
    
     try {
    
         int i = 0;
    
     }catch(Exception e){
    
         e.printStackTrace();
    
     }
    
     }
    
    
    
    
复制代码
     
    

全部评论 (0)

还没有任何评论哟~