Spring Boot 自动配置覆盖自定义(elasticsearchTemplate)配置

Posted

技术标签:

【中文标题】Spring Boot 自动配置覆盖自定义(elasticsearchTemplate)配置【英文标题】:Spring boot auto configuration overriding custom (elasticsearchTemplate) configuration 【发布时间】:2018-08-13 09:14:12 【问题描述】:

我创建了以下配置(我复制了@Lazy,因为我无法使其工作)

@Lazy(true)
@Configuration
public class ElasticConfiguration

   private Logger logger = LoggerFactory.getLogger(ElasticConfiguration.class);

   @Value("$elasticsearch.host")
   private String esHost;

   @Value("$elasticsearch.port")
   private int esPort;

   @Value("$elasticsearch.clustername")
   private String esClusterName;

   @Lazy(true)
   @Bean
   public Client client() throws Exception
   
      Builder builder = Settings.builder();
      // builder.put("client.transport.sniff", true);
      Settings settings = builder.put("cluster.name", esClusterName).build();
      TransportClient client = new PreBuiltTransportClient(settings);
      InetAddress adress = InetAddress.getByName(esHost);
      client.addTransportAddress(new InetSocketTransportAddress(adress, esPort));
      logger.debug(
         "ES Client built with cluster.name;" + esClusterName + ";host;" + esHost + ";port;" + esPort + ";client.transport.sniff;"
            + builder.get("client.transport.sniff"));
      return client;
   

   @Lazy(true)
   @Bean
   public ElasticsearchOperations elasticsearchTemplate() throws Exception
   
      return new ElasticsearchTemplate(client());
   

我无法进行延迟初始化,因为我的配置似乎被 spring-boot 自动配置覆盖

使用 bean 'elasticsearchTemplate' 覆盖 bean 定义 不同的定义:替换 [Root bean: class [null];范围=; 摘要=假;懒惰初始化=真;自动线模式=3;依赖检查=0; 自动接线候选=真;主要=假; factoryBeanName=弹性配置; factoryMethodName=弹性搜索模板;初始化方法名=空; destroyMethodName=(推断);在类路径资源中定义 [xxx/xxx/ElasticConfiguration.class]] 与 [根 bean: 类 [null];范围=;摘要=假;懒惰初始化=假; 自动线模式=3;依赖检查=0;自动接线候选=真; 主要=假; factoryBeanName=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; factoryMethodName=弹性搜索模板;初始化方法名=空; destroyMethodName=(推断);在类路径资源中定义 [org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfiguration.class]]

我也尝试在类上添加如下注解

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)

与以下属性相关,但效果不佳

org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.xxx.ElasticConfiguration

我该怎么办?

【问题讨论】:

【参考方案1】:

好的,所以我找到的唯一解决方案是使用以下属性

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration

请注意,使用以下注释对我不起作用...

@EnableAutoConfiguration(exclude=ElasticsearchDataAutoConfiguration.class)

编辑

事实上我的问题是我的方法elasticsearchTemplate()返回ElasticsearchOperations而不是ElasticsearchTemplate

当更改签名时,@Lazy 注释似乎起作用了。

【讨论】:

以上是关于Spring Boot 自动配置覆盖自定义(elasticsearchTemplate)配置的主要内容,如果未能解决你的问题,请参考以下文章

自定义的Spring Boot starter如何设置自动配置注解

Spring boot运行原理-自定义自动配置类

Spring Boot 自动化配置之自定义一个Starter

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring boot 自定义starter