在这个例子中,Spring 框架如何知道如何实例化 RestHighLevelClient?



我正在关注这篇文章,它解释了如何使用Java High Level REST Client(JHLRC(与ElasticSearch连接。

这个问题的重要部分在ElasticsearchConfig.java:

@Configuration
public class ElasticsearchConfig {
...
@Bean(destroyMethod = "close")
public RestHighLevelClient restClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(userName, password));
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}

}

和配置文件服务.java:

@Service
public class ProfileService {
private RestHighLevelClient client;
private ObjectMapper objectMapper;
@Autowired
public ProfileService(RestHighLevelClient client, ObjectMapper objectMapper) {
this.client = client;
this.objectMapper = objectMapper;
}
...

我们正在自动连接RestHighLevelClientObjectMapper,那么Spring如何知道我们需要的RestHighLevelClient实例来自ElasticsearchConfig.restClient()

Spring 会对类进行初始扫描,以确定它将要制作什么豆子。 然后它将开始"初始化"阶段。

@Bean@Configuration带注释的类中的带注释的方法将被调用,并将结果加载到ApplicationContext中。 因此,RestHighLevelClient被创建(通过您拥有的方法(并加载。

然后,它会尝试创建ProfileService实例。 它看到需要RestHighLevelClient实例(通过构造函数参数(。 它查看ApplicationContext以及计划在扫描阶段创建的豆子。 由于只有一个RestHighLevelClient实例,因此没有冲突,因此使用该实例。


来自其他评论:

如果有多个RestHighLevelClient实例等待创建或已经在ApplicationContext中,那么您将得到一个BeanCreationException,详细说明"太多候选者,预期为 1 但找到了n"。

这些可以通过多种方式工作。

您可以将其中一个RestHighLevelClientbean注释为@Primary,指示"如果有多个可用,但只需要一个,请使用此"。

您可以使用@Qualifier注释构造函数参数,详细说明要自动连线的多个实例中的哪一个

您可以将构造函数参数更改为将自动连接所有此类实例的Collection<RestHighLevelClient>,然后在构造函数中自行进行选择。

相关内容

  • 没有找到相关文章

最新更新