前言

需要加载全局变量的情况很常见,如取通用的系统初始化配置等

Spring Boot 可以通过实现 CommandLineRunner 或 ApplicationRunner 接口,让某些代码在 Spring Boot 应用启动之后执行。因此,在启动时从数据库加载全局变量,可以在这些接口的 run() 方法中实现

实现步骤

1.定义一个全局变量类,如下:

@Componentpublic class GlobalVariables {private static Map globalMap = new HashMap();public static String getVariable(String key) {return globalMap.get(key);}@PostConstructpublic void loadGlobalVariables() {List variables = ... //从数据库加载所有变量for (Variable variable: variables) {globalMap.put(variable.getName(), variable.getValue());}}}

在这个类中,全局变量被定义为一个静态 Map 对象,其中 key 是变量名,value 是变量值

在 PostConstruct 注解的方法中,从数据库中加载所有变量,并将它们放到全局 Map 中

2.在启动时调用 GlobalVariables.loadGlobalVariables() 方法

可通过实现 CommandLineRunner 或 ApplicationRunner 接口实现

@SpringBootApplicationpublic class MyApplication implements CommandLineRunner {@Autowiredprivate GlobalVariables globalVariables;@Overridepublic void run(String... args) throws Exception {globalVariables.loadGlobalVariables();}public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}

在 MyApplication 类中,实现了 CommandLineRunner 接口,并将其注入 GlobalVariables 对象

在 run() 方法中调用 GlobalVariables.loadGlobalVariables() 方法,从而在启动时从数据库加载所有全局变量

原理分析

GlobalVariables 类使用了 @PostConstruct 注解,这意味着该方法会在该类的实例被创建并初始化之后被调用,在该类的 loadGlobalVariables() 方法中,我们从数据库加载了所有的全局变量,并将它们存到 static 修饰的 Map 中

MyApplication 类实现了 CommandLineRunner 接口,并将其注入了 GlobalVariables 对象,因此,在应用启动后,Spring 会调用 run 方法,并执行 GlobalVariables.loadGlobalVariables() 方法,从数据库中加载全局变量,并将它们存到全局 Map 中

通过这种方式,我们就可以在整个应用程序中使用这些全局变量了