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

2024-06-20

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

e.g.

@Lazy
@Value("${someConfig}")
private String someConfig;

我特别提到的场景是通过 JNDI 设置的变量,并且一个嵌入式 Tomcat 容器,其中一些 JNDI 变量在 Spring Boot 加载期间初始化 https://stackoverflow.com/questions/28131577/spring-boot-using-embedded-tomcat-with-jndi...我可以想到您想要 JIT 变量填充的其他场景:检索变量“昂贵”,并且您不想影响启动时间,该变量在应用程序启动时不可用,等等。

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

java.lang.IllegalArgumentException:无法子类化最终类 java.lang.String

我想你可以通过使用来实现延迟加载变量@ConfigurationProperties bean https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties?

一个后续问题:可以/愿意@Value- 如果底层变量源发生更改(例如服务器上的 JNDI),则初始化变量是否需要重新初始化(无需重新启动应用程序)?即重新检索

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


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

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

@Component
@Lazy
class SomeComponent {

    @Autowired
    @Qualifier("myVar")
    String myVar;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以@Lazy 初始化Spring @Value? 的相关文章

随机推荐