java - 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
}
}
解决方案
永远不要再这样做了:
public Application() {
app = this;
}
在this
构造函数中使用时指针未完全初始化。这将导致意外行为。
要访问sockets
您的Controller
,您有一些选择:
- 使其成为静态的。(这一点都不好)
创建
@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()
}
推荐阅读
- php - 使用 FCM 将通知从 PHP 推送到 android 应用程序
- javascript - 如何在 ES6 中访问和使用导入函数
- javascript - 如何在 React 应用程序中读取当前 URL
- ios - Swift Firebase Ios 用户定义的子值
- 3d - Gnuplot 自定义 y 刻度
- azure-sql-database - 通过服务端点从 VNET 访问 Azure SQL
- ssis - 尝试连接到 Excel 工作表时,SSIS 中出现错误 0X80004005
- r - 没有生成 NA 的左连接
- scala - Spark DataFrame 操作性能 - 多个离散操作或单个流水线操作集
- javascript - 如何从构造函数中访问原型对象?