gpt4 book ai didi

java - Spring Boot应用程序需要在@Configuration类中定义默认bean才能使用@Value吗?

转载 作者:行者123 更新时间:2023-11-30 02:03:51 27 4
gpt4 key购买 nike

最近,我遇到了一个很奇怪的情况。

请考虑一个简单的 Spring Boot 应用程序:

@SpringBootApplication
public class SampleApp implements WebMvcConfigurer {

public static void main(String[] args) {
SpringApplication.run(SampleApp.class, args);
}
}

在这个 SampleApp 中,我们确实有一个 Configuration 类,例如:

@Configuration
public class Config {

//Some @Bean definitions, but without things such as String
}

然后我们确实有一些类(class):

@Service
@RequiredArgsConstructor //Lombok
public class SomeService {

@Value("${value.to.be.injected}")
private final String someValue;
}

根据目前的情况,应用程序拒绝启动:

***************************
APPLICATION FAILED TO START
***************************
Description:

Parameter 0 of constructor in com.sampleapp required a bean of type 'java.lang.String' that could not be found.

Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

但是,我们是否应该在配置中定义一个@Bean,例如:

@Configuration
public class Config {

@Bean
public String string() {
return new String();
}
}

应用程序正确启动,甚至正确注入(inject)值。为什么会发生这种情况,为什么 Spring 会这样?

最佳答案

我的猜测是,您在构造函数中添加了“someValue”,它尝试创建实例,但在不传递值的情况下无法调用构造函数。这就是它破裂的原因。然后,如果它找到一个 String 值(一个空 String bean,它被匹配为唯一适合依赖注入(inject)的值),它会使用它来创建对象,然后由于 @Value 注释而设置该值。

您可以尝试删除 bean 的构造函数(和 @RequiredArgsConstructor),它应该按预期工作,因为所有属性都将使用反射注入(inject),并且它将调用默认的无参数构造函数。

另一个看起来不错并且更“Spring”方式的很酷的解决方案是添加具有您想要在配置中注入(inject)的实际值的bean,并且没有@Value注释 - 只需使用构造函数进行初始化的 bean 。目前您正在混合它 - 一部分内容来自构造函数,另一部分稍后设置。

也许最好的方法(也许我应该先写)是将该值注释添加到构造函数字段。然后它将使用该值而不是搜索 bean。

@Service
@RequiredArgsConstructor //Lombok
public class SomeService {

private final String someValue;
public SomeService(@Value("${value.to.be.injected}") String someValue, other stuff....) {
this.someValue=someValue;
}
}

关于java - Spring Boot应用程序需要在@Configuration类中定义默认bean才能使用@Value吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51930434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com