(1). ElasticSearch依赖注入
一直以来,以为:ES的依赖注入使用了:Google Guice,深入跟踪了半天,发现并不我以为的那样(对Guice进行了包装),而是,参照Guice自己写了一套:DI.感觉在自己造轮子,不过,也对哈!人家要的东西小巧玲珑.
下面是我从ES中抽出来的依赖注入.并做的测试,等以后有时间再把依赖注入的源码分析.
(2). 项目结构图如下

(3). 定义接口(IHelloService)
package help.lixin.common.service;
public interface IHelloService {
	void sayHello();
}
(4). 定义接口实现(HelloService)
package help.lixin.common.service.impl;
import help.lixin.common.inject.Inject;
import help.lixin.common.inject.name.Named;
import help.lixin.common.service.IHelloService;
import help.lixin.common.util.CommonLog;
public class HelloService implements IHelloService {
	private CommonLog commonLog;
	private int port;
    // *****************************************************************
    // @Inject : 依赖注入对象
    // @Named  : 根据名称注入
    // *****************************************************************
	@Inject
	public HelloService(CommonLog commonLog, @Named("port") int port) {
		this.commonLog = commonLog;
		this.port = port;
		this.commonLog.println("=====================HelloService init========================");
	}
	@Override
	public void sayHello() {
		commonLog.println("*********************start bind port:" + port + "*****************");
		commonLog.println("*********************say Hello*****************");
	}
}
(5). 定义公共日志输出(CommonLog)
package help.lixin.common.util;
import java.io.PrintStream;
public class CommonLog {
	private static final PrintStream OUT = System.out;
	public void println(String line) {
		OUT.append(line).append("\n");
	}
}
(6). 定义Module(CustomerModule)
类似于Spring中书写XML(Configuration)
package help.lixin.common.module;
import help.lixin.common.inject.AbstractModule;
import help.lixin.common.inject.Singleton;
import help.lixin.common.inject.name.Names;
import help.lixin.common.service.IHelloService;
import help.lixin.common.service.impl.HelloService;
import help.lixin.common.util.CommonLog;
public class CustomerModule extends AbstractModule {
	@Override
	protected void configure() {
        // 定义接口与实现类
		bind(IHelloService.class).to(HelloService.class).in(Singleton.class);
        // 定义类对应的实例
		bind(CommonLog.class).toInstance(new CommonLog());
        // 定义常量
		bindConstant().annotatedWith(Names.named("port")).to(8080);
	}
}
(7). 测试HelloService(InjectTest)
目标:测试HelloService,看是否会自动注入:CommonLog commonLog和int port
package help.lixin.common.inject;
import org.junit.Test;
import help.lixin.common.module.CustomerModule;
import help.lixin.common.service.IHelloService;
public class InjectTest {
	
	@Test
	public void testInject() {
		
		Module module = new CustomerModule();
		
		ModulesBuilder builder = new ModulesBuilder();
		builder.add(module);
		
        // 创建:Injector,并设置对象与对象之间的依赖
		Injector inject = builder.createInjector();
		
		// 获取实例
		IHelloService helloService = inject.getInstance(IHelloService.class);
		helloService.sayHello();
	}
}
(8). 查看控制台输出
=====================HelloService init========================
*********************start bind port:8080*****************
*********************say Hello*****************
(9). 项目pom.xml
并不需要依赖:guice.
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>help.lixin.inject</groupId>
	<artifactId>inject-core</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>inject-core</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.11.1</version>
		</dependency>
		
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>