我有豆:
@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是一个好方法
一@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] 删除。
我来说两句