Spring中使用ApplicationRunner为项目设置常量
最近开发的一个项目中有许多常量。为了优化代码,项目将这些常量的值存储在数据库中,希望能在程序启动后从数据库查出。
由于没有经验,一开始我就这样写:
@Component public class CustomConstants { @Autowired private propertyService propertyService; public static String CONSTANT_1 = propertyService.get("CONSTANT_1"); }
我以为可以在spring启动后注入propertyService,然后CONSTANT_1自动查询。
随后发现启动不了。这很可能表明声明成static的CONSTANT_1的初始化先于spring,导致还未注入propertyService时就进行查询,导致错误。
我的目标是在spring启动后就立刻进行CONSTANT_1的初始化。
经过一番搜索和询问,我找到了ApplicationRunner接口。它可以实现上述目标。
现在代码改成这样:
@Component public class CustomConstants implements ApplicationRunner { @Autowired private propertyService propertyService; public static String CONSTANT_1 = null; @Override public void run(ApplicationArguments args){ CONSTANT_1 = propertyService.get("CONSTANT_1"); }
}
实现ApplicationRunner接口的类,其run方法会在spring启动后被调用。这样,就可以成功查询到了。
如果有多个ApplicationRunner,担心它们的启动顺序不对的话,可以在类上使用@Order(1)注解,数字填写启动的顺序即可。