有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可以@Lazy init一个Spring@值?

是否可以@Lazy初始化弹簧@Value

例如

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

我特别提到的场景是一个通过JNDI设置的变量,an embedded Tomcat container, which has some of it's JNDI variables initialised during Spring Boot loading。。。我可以想到的其他场景是您希望JIT变量填充的地方:检索变量“昂贵”,并且您不想影响启动时间,该变量在应用程序启动时不可用,等等

上述代码给出了以下错误:

java.lang.IllegalArgumentException: Cannot subclass final class java.lang.String

我想您可以通过使用^{} bean实现延迟加载变量

后续问题:如果基础变量源发生更改(例如服务器上的JNDI),是否可以/是否可以重新初始化@Value初始化的变量(无需重新启动应用程序)即重新检索

(我正在尝试最后两种情况)


共 (1) 个答案

  1. # 1 楼答案

    你可以试试这样的设置。缺点是,它要求使用这个变量的bean也声明为@Lazy

    @Bean(name = "myVar")
    @Lazy
    String foo(@Value("${someConfig}") String someConfig) {
        return someConfig;
    }
    
    @Component
    @Lazy
    class SomeComponent {
    
        @Autowired
        @Qualifier("myVar")
        String myVar;
    }