当我们在@Bean中创建新类并在另一个@Bean中在@Bean中使用时会发生什么?

安东·科洛索克(Anton Kolosok):

我有豆:

@Bean
public Map<String, Integer> currenciesCodesMap(@Value("${readTimeoutMillis}") int readTimeout,
                                               @Value("${connectTimeoutMillis}") int connectTimeout,
                                               UriFactory uriFactory) {
    System.out.println("currenciesCodesMap");
    RestTemplate restTemplate = getRestTemplate(readTimeout + 1, connectTimeout + 1);
    List<Map> maps = Arrays.asList(Objects.requireNonNull(restTemplate.getForObject(uriFactory.getProgressiveCurrencyRates(), Map[].class)));
        Map<String, Integer> currenciesCodesMap = maps.stream().collect(Collectors.toMap(
                map -> (String) map.get("code"),
                map -> (Integer) map.get("id")
        ));
}

@Bean
public RestTemplate codesConverterRestTemplate(@Value("${readTimeoutMillis}") int readTimeout,
                                                   @Value("${connectTimeoutMillis}") int connectTimeout,
                                                   UriFactory uriFactory) {
        System.out.println("codesConverterRestTemplate");
        return getRestTemplate(readTimeout, connectTimeout);
    }
@Bean
public RestTemplate getRestTemplate(int readTimeout, int connectTimeout) {
        CloseableHttpClient httpClient = HttpClientBuilder.create().disableCookieManagement().build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);

        factory.setReadTimeout(readTimeout);
        factory.setConnectTimeout(connectTimeout);

        System.out.println("getRestTemplate");

        return new RestTemplate(factory);
    }

我不想在每个bean中创建新的RestTemplate,所以我决定在另一个bean中创建它,并将第三个bean注入到第一个bean中。在启动时,我看到(使用System.out.println)我的bean仅创建了一个(因为它们是单例),但是我无法理解它的状态,因为我使用了不同的参数来调用前两个bean中的第三个bean。所以我的问题是:这整个过程如何运作。新的RestTemplate(factory)将被调用多少次,如果我在两个具有不同参数的地方使用它,那么它将是对第三个bean的一次调用。以这种方式创建RestTemplate是一个好方法

克里斯托弗·施耐德(Christopher Schneider):

@Configuration类不会每次都实例化一个新的对象带注释的方法@Bean调用带注释的另一种方法@Bean考虑以下示例:

@Configuration
public class TestConfig {

    @Bean
    public String bean2(){
        String bean = bean1("bean2");
        System.out.println("bean2: " + bean);
        return bean;
    }

    @Bean
    public String bean3(){
        String bean = bean1("bean3");
        System.out.println("bean3: " + bean);
        return bean;
    }

    @Bean
    public String bean1(@Autowired(required = false) String name){
        System.out.println("bean1 " + name);
        return name;
    }
}

输出如下,因为bean2()首先执行:

bean1 bean2
bean2: bean2
bean3: bean2

这是相关的文档

换句话说,当您定义一个bean定义并且其作用域为单例时,Spring IoC容器将为该bean定义所定义的对象创建一个实例。该单个实例存储在此类单例bean的高速缓存中,并且对该命名bean的所有后续请求和引用都返回该高速缓存的对象。下图显示了单例作用域如何工作:

在这种情况下,带有注解的方法@Bean bean定义。

也:

所有@Configuration类在启动时都使用CGLIB进行了子类化。在子类中,子方法在调用父方法并创建新实例之前,首先检查容器中是否有任何缓存(作用域)的bean。

换句话说,调用带注解的方法@Bean每次都应返回相同的bean,而不管参数如何。在您的情况下,我认为它是未定义的行为,因为除非使用诸如depends-on或的选项,否则无法保证实例化的顺序SmartLifecycle

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

春季:当我们将@ComponentScan移到包中的另一个类时会发生什么?

来自分类Dev

当我们在同一类中创建类的实例时会发生什么?

来自分类Dev

当我们在 Bean 是单例的情况下调用 new Bean() 时会发生什么?

来自分类Java

我们初始化主对象,并在其构造函数中创建一个新对象。当我们摧毁主要物体时,它的创作会发生什么?

来自分类Java

当我们从另一个char整数减去一个char整数时会发生什么?

来自分类Dev

当我们在 kubernetes 中创建具有多个副本和一个 pvc 的状态集时会发生什么?

来自分类Dev

当我在 ADO.NET 中阅读时另一个进程更新记录时会发生什么

来自分类Dev

当我们git checkout一个提交时会发生什么

来自分类Dev

当我们在微任务队列中返回一个值并从 then() 链返回一个 Promise.resolve 时会发生什么?

来自分类Dev

当我们在Python的类中给出函数定义时会发生什么

来自分类Dev

当我在运行中的Visual Studio 2013中的另一个项目上打开一个项目时会发生什么?

来自分类Java

在另一个bean的构造函数中引用时,@ Autowired bean为null

来自分类Java

如果我们仅在类中重写hashCode()并在Set中使用它会发生什么?

来自分类Java

在另一个bean中使用一个bean(组件)中的方法是否正确?

来自分类Dev

将 `ActorHandler` 保存在另一个 actor 中供以后使用时会发生错误

来自分类Dev

当我们在 C++ 中使用“while”时会发生什么转换?

来自分类Dev

Python-在类中初始化tkinter,并且在另一个类中需要另一个gui时会发生什么?

来自分类Java

当我在applicationContext.xml中同时声明bean和component-scan时会发生什么?

来自分类Dev

在一个bean中作用域单例,并在另一个依赖bean中建立原型

来自分类Dev

当我们在html标记中包含错误的属性时会发生什么?

来自分类Java

当我们在Collections.synchronizedMap()中传递哈希表时会发生什么

来自分类Dev

当我们在C ++中更改字符串的值时会发生什么

来自分类Dev

当我们在 R 中的 split 函数中指定列名时会发生什么?

来自分类Dev

在同一会话中多次从另一个SessionScoped bean访问一个SessionScoped bean创建了一个新实例

来自分类Java

当Spring @Bean存储在ThreadLocal中时会发生什么?

来自分类Dev

当我们为变量分配引用时会发生什么?

来自分类Dev

当Git拉或推到另一个分支中的另一个分支时会发生什么

来自分类Dev

当我们使用 getBean 方法创建原型 bean 时,是否创建了 bean 属性(单例)的新实例?

来自分类Dev

当我们将 cin 声明为 int 并在 cout 中使用 print cin 从 cin 获取输入时会发生什么?

Related 相关文章

  1. 1

    春季:当我们将@ComponentScan移到包中的另一个类时会发生什么?

  2. 2

    当我们在同一类中创建类的实例时会发生什么?

  3. 3

    当我们在 Bean 是单例的情况下调用 new Bean() 时会发生什么?

  4. 4

    我们初始化主对象,并在其构造函数中创建一个新对象。当我们摧毁主要物体时,它的创作会发生什么?

  5. 5

    当我们从另一个char整数减去一个char整数时会发生什么?

  6. 6

    当我们在 kubernetes 中创建具有多个副本和一个 pvc 的状态集时会发生什么?

  7. 7

    当我在 ADO.NET 中阅读时另一个进程更新记录时会发生什么

  8. 8

    当我们git checkout一个提交时会发生什么

  9. 9

    当我们在微任务队列中返回一个值并从 then() 链返回一个 Promise.resolve 时会发生什么?

  10. 10

    当我们在Python的类中给出函数定义时会发生什么

  11. 11

    当我在运行中的Visual Studio 2013中的另一个项目上打开一个项目时会发生什么?

  12. 12

    在另一个bean的构造函数中引用时,@ Autowired bean为null

  13. 13

    如果我们仅在类中重写hashCode()并在Set中使用它会发生什么?

  14. 14

    在另一个bean中使用一个bean(组件)中的方法是否正确?

  15. 15

    将 `ActorHandler` 保存在另一个 actor 中供以后使用时会发生错误

  16. 16

    当我们在 C++ 中使用“while”时会发生什么转换?

  17. 17

    Python-在类中初始化tkinter,并且在另一个类中需要另一个gui时会发生什么?

  18. 18

    当我在applicationContext.xml中同时声明bean和component-scan时会发生什么?

  19. 19

    在一个bean中作用域单例,并在另一个依赖bean中建立原型

  20. 20

    当我们在html标记中包含错误的属性时会发生什么?

  21. 21

    当我们在Collections.synchronizedMap()中传递哈希表时会发生什么

  22. 22

    当我们在C ++中更改字符串的值时会发生什么

  23. 23

    当我们在 R 中的 split 函数中指定列名时会发生什么?

  24. 24

    在同一会话中多次从另一个SessionScoped bean访问一个SessionScoped bean创建了一个新实例

  25. 25

    当Spring @Bean存储在ThreadLocal中时会发生什么?

  26. 26

    当我们为变量分配引用时会发生什么?

  27. 27

    当Git拉或推到另一个分支中的另一个分支时会发生什么

  28. 28

    当我们使用 getBean 方法创建原型 bean 时,是否创建了 bean 属性(单例)的新实例?

  29. 29

    当我们将 cin 声明为 int 并在 cout 中使用 print cin 从 cin 获取输入时会发生什么?

热门标签

归档