暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在Spring中注入ElasticSearch实例

我是攻城师 2016-04-06
219

在企业级项目开发中,大多数公司都会集成Spring来简化开发成本,要使用Spring自然少不了一大堆需要依赖注入的Bean,通常情况下,我们会选择在spring的xml中,配置一些类的实例,比如连接池,或者配置文件初始化类,或者集成duboo时配置一些Service的引用等等。 

有些类的实例生成比较复杂,直接在xml中,是没法进行配置的,比如我想在Spring注入ElasticSearch的Client实例,注意(这里并不是使用的spring-data-elasticsearch项目),而是使用原始的ElasticSearch的API。 

我们先看下,在非Spring的项目中,如何初始化ElasticSearch的Client实例: 


Java代码  

  1. //es的客户端实例    

  2.  static Client client=null;    

  3.  static {    

  4.     //设置集群名字  

  5.     Settings settings = ImmutableSettings.settingsBuilder()  

  6.             .put("cluster.name""search")  

  7.             .put("client.transport.sniff"true)  

  8.            . build();  

  9.       //连接单台机器,注意ip和端口号,不能写错    

  10.       client=new TransportClient(settings)  

  11.       .addTransportAddress(new InetSocketTransportAddress("192.168.1.187"9300))  

  12.       .addTransportAddress(new InetSocketTransportAddress("192.168.1.121"9300))  

  13.       .addTransportAddress(new InetSocketTransportAddress("192.168.1.122"9300));  

  14.     }  




由于ElasticSearch的Client实例是通过各种组装加工而成,并没法直接在Spring的xml中使用Bean标签进行初始化,这时候我们可以使用@Configuration注解,来在Java类中,生成bean实例,这个注解和使用spring的xml进行注入功能大致相同,只不过能直接在Java类生成一个类实例,比较灵活而已。最终的代码如下: 

Java代码  

  1. package cn.bizbook.product.elk.config;  

  2.   

  3. import org.elasticsearch.client.Client;  

  4. import org.elasticsearch.client.transport.TransportClient;  

  5. import org.elasticsearch.common.settings.ImmutableSettings;  

  6. import org.elasticsearch.common.settings.Settings;  

  7. import org.elasticsearch.common.transport.InetSocketTransportAddress;  

  8. import org.springframework.beans.factory.annotation.Autowired;  

  9. import org.springframework.context.annotation.Bean;  

  10. import org.springframework.context.annotation.Configuration;  

  11.   

  12. /** 

  13.  * Created by qindongliang on 2016/4/6. 

  14.  */  

  15. @Configuration  

  16. public class FactoryBean {  

  17.   

  18.     //配置文件工具类  

  19.     @Autowired  

  20.     private ESConf esConf;  

  21.   

  22.   

  23.     //注入的ElasticSearch实例  

  24.     @Bean(name = "client")  

  25.     public Client getESClient(){  

  26.         //设置集群名字  

  27.         Settings settings = ImmutableSettings.settingsBuilder()  

  28.                 .put("cluster.name", esConf.getClusterName())  

  29.                 .build();  

  30.        Client  client=new TransportClient(settings);  

  31.         //读取的ip列表是以逗号分隔的  

  32.         for(String ip:esConf.getIps().split(",")){  

  33.             ((TransportClient)client).addTransportAddress(new InetSocketTransportAddress(ip,esConf.getPort()));  

  34.         }  

  35.         return client;  

  36.     }  

  37.   

  38. }  




最后来看下,如何在DAO层,引用client实例,非常easy: 

Java代码  

  1. @Resource(name = "client")  

  2.  private  Client client;  


文章转载自我是攻城师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论