java - 在这个例子中,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;
}
}
@Service
public class ProfileService {
private RestHighLevelClient client;
private ObjectMapper objectMapper;
@Autowired
public ProfileService(RestHighLevelClient client, ObjectMapper objectMapper) {
this.client = client;
this.objectMapper = objectMapper;
}
...
我们正在自动装配RestHighLevelClient
,ObjectMapper
那么 Spring 是如何知道RestHighLevelClient
我们需要的实例来自哪里的ElasticsearchConfig.restClient()
呢?
解决方案
Spring 对类进行初始扫描,以确定它将生成哪些 bean。然后它将开始“初始化”阶段。
@Bean
@Configuration
将调用带注释的类中的带注释的方法,并将结果加载到ApplicationContext
. 因此RestHighLevelClient
(通过您拥有的方法)创建并加载。
然后它会尝试创建ProfileService
实例。它看到需要一个RestHighLevelClient
实例(通过构造函数参数)。它在ApplicationContext
扫描阶段查看计划创建的 bean 和 bean。由于只有一个 RestHighLevelClient
实例,因此没有冲突,因此使用了该实例。
从其他评论:
如果有多个 RestHighLevelClient
实例正在等待创建或已经在其中,ApplicationContext
那么您将得到一个BeanCreationException
详细信息,即“候选人太多,预期为 1,但找到了n ”。
这些可以通过多种方式进行。
您可以将其中一个RestHighLevelClient
bean注释为@Primary
“如果有多个可用,但只需要一个,则使用它”。
@Qualifier
您可以使用详细说明要自动装配的多个实例中的哪一个来注释构造函数参数。
您可以将构造函数参数更改为Collection<RestHighLevelClient>
将自动装配所有此类实例的 a,然后在构造函数中自己进行选择。
推荐阅读
- c++ - 我应该如何声明这个 C++ 函数?
- python - 如何在没有任何命令触发器的情况下使其自动发布
- sql - 将相交的线串拆分为多个线串
- bash - 获取字符串的特定部分并将另一部分设置为 null
- terminal - 在终端中更改用户、路径和 git 分支名称的颜色
- c++builder - 如何在 C++ Builder 中完全重新加载 TFDManager?
- python - 使用 Python 创建重复图像,即相似图像但不是原始图像(诱饵技术)
- validation - 表单中两个日期之间的 Symfony 验证/比较
- excel - VBA selenium 运行 Brave 浏览器
- go - Kafka 消费者再次收到相同的消息