在企业级项目开发中,大多数公司都会集成Spring来简化开发成本,要使用Spring自然少不了一大堆需要依赖注入的Bean,通常情况下,我们会选择在spring的xml中,配置一些类的实例,比如连接池,或者配置文件初始化类,或者集成duboo时配置一些Service的引用等等。
有些类的实例生成比较复杂,直接在xml中,是没法进行配置的,比如我想在Spring注入ElasticSearch的Client实例,注意(这里并不是使用的spring-data-elasticsearch项目),而是使用原始的ElasticSearch的API。
我们先看下,在非Spring的项目中,如何初始化ElasticSearch的Client实例:
//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)); }
由于ElasticSearch的Client实例是通过各种组装加工而成,并没法直接在Spring的xml中使用Bean标签进行初始化,这时候我们可以使用@Configuration注解,来在Java类中,生成bean实例,这个注解和使用spring的xml进行注入功能大致相同,只不过能直接在Java类生成一个类实例,比较灵活而已。最终的代码如下:
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; } }
最后来看下,如何在DAO层,引用client实例,非常easy:
@Resource(name = "client") private Client client;
有什么问题 可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园