是否有可能@Lazy初始化一个Spring @Value?

Nic*_*aly 4 java spring spring-boot

是否可以@Lazy初始化Spring @Value

例如

@Lazy
@Value("${someConfig}")
private String someConfig;
Run Code Online (Sandbox Code Playgroud)

我特别提到的场景是一个通过JNDI设置的变量,以及一个嵌入式Tomcat容器,它在Spring Boot加载过程中初始化了一些JNDI变量 ......其他场景我可以想到你想要的位置JIT变量填充:检索变量"昂贵"并且您不希望影响启动时间,该变量在应用程序启动时不可用等.

上面的代码给出了以下错误:

java.lang.IllegalArgumentException:无法继承final类java.lang.String

我想你可以通过使用@ConfigurationPropertiesbean来实现延迟加载的变量?

一个跟进问题:如果基础变量源发生了变化(例如服务器上的JNDI),是否可以/将@Value初始化的变量重新初始化(没有重新启动应用程序)?即重新检索

(我正在尝试最后两个场景)

Mac*_*iak 5

你可以尝试这样的设置.缺点是它要求使用此变量的bean也被声明为@Lazy.

@Bean(name = "myVar")
@Lazy
String foo(@Value("${someConfig}") String someConfig) {
    return someConfig;
}

@Component
@Lazy
class SomeComponent {

    @Autowired
    @Qualifier("myVar")
    String myVar;
}
Run Code Online (Sandbox Code Playgroud)