Java 是否可以@Lazy init一个Spring@值?
是否可以Java 是否可以@Lazy init一个Spring@值?,java,spring,spring-boot,Java,Spring,Spring Boot,是否可以@Lazy初始化弹簧@Value? e、 g 我特别提到的场景是一个通过JNDI设置的变量,并且。。。我可以想到的其他场景是您希望JIT变量填充的地方:检索变量“昂贵”,并且您不想影响启动时间,该变量在应用程序启动时不可用,等等 上述代码给出了以下错误: java.lang.IllegalArgumentException:无法子类化final类 java.lang.String 我想您可能会通过使用 后续问题:如果基础变量源发生更改(例如服务器上的JNDI),@Value-初始化变量是
@Lazy
初始化弹簧@Value
?
e、 g
我特别提到的场景是一个通过JNDI设置的变量,并且。。。我可以想到的其他场景是您希望JIT变量填充的地方:检索变量“昂贵”,并且您不想影响启动时间,该变量在应用程序启动时不可用,等等
上述代码给出了以下错误:
java.lang.IllegalArgumentException:无法子类化final类
java.lang.String
我想您可能会通过使用
后续问题:如果基础变量源发生更改(例如服务器上的JNDI),@Value
-初始化变量是否可以重新初始化(无需重启应用程序)?即重新检索
(我正在尝试最后两种方案)您可以尝试这样的设置。缺点是它要求使用此变量的bean也声明为
@Lazy
。
不,对于您的后续问题,不是针对单例bean中的字段。但是,如果您成功地将bean声明为singleton并每次获得一个新实例,那么该字段每次都将被初始化为当前值。@SotiriosDelimanolis谢谢!作为对特定错误的说明:
@Lazy
是通过用代理替换字段来实现的,如果字段的声明类型是final类,则无法执行代理。
@Lazy
@Value("${someConfig}")
private String someConfig;
@Bean(name = "myVar")
@Lazy
String foo(@Value("${someConfig}") String someConfig) {
return someConfig;
}
@Component
@Lazy
class SomeComponent {
@Autowired
@Qualifier("myVar")
String myVar;
}