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

时间:2019-03-18 14:00:37

标签: spring spring-boot spring-annotations

我有一个类,其中应包含从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类本身中?

2 个答案:

答案 0 :(得分: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;

    // ...
}

答案 1 :(得分:0)

正如Deadpool回答的那样,您应该将MyData类与@Configurtion类分开。
@Configuration是用@Component进行元注释的,因此,一旦您用MyData注释了@Configuration,Spring还将其作为常规bean进行关联,这使得{{ 1}}豆。