如何将@Bean Factory方法放在Bean类本身中



i有一个类,该类应包含从JSON文件进行除外的数据。该数据应在我的应用程序中可用,因此我想将其绑定为bean。

为了将去序列化逻辑和数据结构放在一起,我想将@Bean注释的工厂方法放入数据类本身中 - 像这样:

@Configuration
public class MyData {
    // factory method
    @Bean
    public static MyData loadMyData(ResourceLoader resourceLoader) throws IOException {
        try (InputStream input = resourceLoader.getResource("classpath:data.json").getInputStream()) {
            return new ObjectMapper().readValue(input, MyData.class);
        } 
    }
    // data structure
    private Map<String, DataDetail> details;
    // ...
}

但是,这失败了,因为@ComponentScan现在找到了两个bean定义:

org.springframework.beans.factory.factory.nouniquebeandefinitionException:没有合格的bean of type'org.example.mydata'可用:预期的单匹配bean,但找到2:mydata,load mydata

我还尝试用@Component替换@Configuration,但结果是相同的。

我只是错过了课堂上的正确注释,还是无法将@Bean方法放在bean类本身中?

基本上我更喜欢带有弹簧启动的分层体系结构,因此使用两个不同的层用于Configurationmodel,例如

软件包 app.config

@Configuration
public class MyDataConfig {
// factory method
@Bean
public static MyData loadMyData(ResourceLoader resourceLoader) throws IOException {
    try (InputStream input = resourceLoader.getResource("classpath:data.json").getInputStream()) {
        return new ObjectMapper().readValue(input, MyData.class);
    } 
 }
}

软件包 com.model

public class MyData {
// data structure
private Map<String, DataDetail> details;
    // ...
}

deadpool回答,您应该将MyData类与@Configurtion类分开。
@Configuration@Component荟萃注释,因此一旦您用 @Configuration注释 MyData,spring也将其与常规豆相关联,这使得 MyData bean的双重防御。

最新更新