如何将@Bean工厂方法放在bean类本身?

问题描述 投票:1回答:2

我有一个类,其中包含从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.NoUniqueBeanDefinitionException:没有'org.example.MyData'类型的限定bean可用:期望的单个匹配bean但找到2:myData,loadMyData

我也尝试用@Configuration替换@Component,但结果是一样的。

我是否只是在类上缺少正确的注释,或者是不可能将@Bean方法放在bean类本身中?

spring spring-boot spring-annotations
2个回答
0
投票

基本上我更喜欢带弹簧靴的分层架构,所以有两个不同的层用于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;

    // ...
}

0
投票

当Deadpool回答时,你应该将MyData类与@Configurtion类分开。 @Configuration是用@Component进行元注释的,所以一旦你用MyData注释@Configuration,Spring也将它作为一个普通的豆子,这使得MyData豆的双重防御。

© www.soinside.com 2019 - 2024. All rights reserved.