分享

如何在Spring中注入ElasticSearch实例

eying 发表于 2016-4-11 15:21:54 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 9623
本帖最后由 eying 于 2016-4-11 17:22 编辑
问题导读:






1.如何初始化ElasticSearch的Client实例
2.如何在DAO层,引用client实例
3.spring注入的具体代码?







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

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

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

[mw_shl_code=java,true]//es的客户端实例   
static Client client=null;   
static {   
    //设置集群名字  
    Settings settings = ImmutableSettings.settingsBuilder()  
            .put("cluster.name", "search")  
            .put("client.transport.sniff", true)  
           . build();  
      //连接单台机器,注意ip和端口号,不能写错   
      client=new TransportClient(settings)  
      .addTransportAddress(new InetSocketTransportAddress("192.168.1.187", 9300))  
      .addTransportAddress(new InetSocketTransportAddress("192.168.1.121", 9300))  
      .addTransportAddress(new InetSocketTransportAddress("192.168.1.122", 9300));  
    } [/mw_shl_code]

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

[mw_shl_code=java,true]package cn.bizbook.product.elk.config;  
  
import org.elasticsearch.client.Client;  
import org.elasticsearch.client.transport.TransportClient;  
import org.elasticsearch.common.settings.ImmutableSettings;  
import org.elasticsearch.common.settings.Settings;  
import org.elasticsearch.common.transport.InetSocketTransportAddress;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
/**
* Created by qindongliang on 2016/4/6.
*/  
@Configuration  
public class FactoryBean {  
  
    //配置文件工具类  
    @Autowired  
    private ESConf esConf;  
  
  
    //注入的ElasticSearch实例  
    @Bean(name = "client")  
    public Client getESClient(){  
        //设置集群名字  
        Settings settings = ImmutableSettings.settingsBuilder()  
                .put("cluster.name", esConf.getClusterName())  
                .build();  
       Client  client=new TransportClient(settings);  
        //读取的ip列表是以逗号分隔的  
        for(String ip:esConf.getIps().split(",")){  
            ((TransportClient)client).addTransportAddress(new InetSocketTransportAddress(ip,esConf.getPort()));  
        }  
        return client;  
    }  
  
}  [/mw_shl_code]

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

[mw_shl_code=java,true]@Resource(name = "client")  
private  Client client;  [/mw_shl_code]

已有(1)人评论

跳转到指定楼层
恋枫缩影 发表于 2016-4-12 09:05:16
学到了点新的东西,跟一般的spring注入不太一样,赞一个!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条