首页 > 解决方案 > Java - 从 Spring Boot 应用程序中获取变量

问题描述

我在 Application 中创建了一个变量(HashMap),当 Application 中的 Bean 运行时,这个变量会改变值和大小。但是当我在控制器上调用这个变量时,这个变量的大小不会改变。请帮我解释为什么这个变量不会在控制器上改变大小,我该如何解决。

应用程序.java

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static Application app;

    public Application() {
        app = this;
    }
    public HashMap<Integer, Socket> sockets = new HashMap<Integer, Socket>();
    public HashMap<Integer, Socket> getSockets() {
        return sockets;
    }

    public void setSockets(HashMap<Integer, Socket> sockets) {
        this.sockets = sockets;
    }

    ....

    @Bean
    public ApplicationRunner runner(TaskExecutor exec) {
        ...
        sockets.put(Integer.valueOf(socket.hashCode()), socket);
        System.out.println("size: " + sockets.size());
        //>> 1
        ...
    }
}

测试控制器.java

@Controller
public class NotificationController {

    @RequestMapping(method = RequestMethod.POST, value = "/test")
    public ResponseEntity<?> test() {
        HashMap<Integer, Socket> sockets = Application.app.getSockets();
        System.out.println("size: " + sockets.size());
        //>> 0
    }
}

标签: javaspring-boothashmap

解决方案


永远不要再这样做了:

public Application() {
    app = this;
}

this构造函数中使用时指针未完全初始化。这将导致意外行为。

要访问sockets您的Controller,您有一些选择:

  1. 使其成为静态的。(这一点都不好)
  2. 创建@Component@Service包装该sockets地图并通过以下方式更新它们@Autowired

    @Component
    public class SocketWrapper {
        public HashMap<Integer, Socket> sockets = new HashMap<Integer, Socket>();
        public HashMap<Integer, Socket> getSockets() {
            return sockets;
        }
    
        public void setSockets(HashMap<Integer, Socket> sockets) {
            this.sockets = sockets;
       }
    }
    

在你的配置类中

@Bean
public ApplicationRunner runner(TaskExecutor exec, SocketWrapper wrapper) {
   // Modify wrapper.getSockets()
}

推荐阅读