Google Guice 注入(@Inject注解)

上一节介绍通过注解来实现绑定关系,这一节介绍如何通过@Inject来完成依赖注入的功能:

(1)属性注入

(2)构造方法注入

(3)setter方法注入

一.属性注入

(1)创建一个接口Hello.java和一个实现类HelloImpl

package guice.di;

import com.google.inject.ImplementedBy;
//将这个接口和实现类HelloImpl绑定到一起
@ImplementedBy(HelloImpl.class)
public interface Hello {
	void sayHello() ;
}


package guice.di;

//这里没有加@Singleton,表示是动态创建这个类,不是单例的
public class HelloImpl implements Hello{
	
	@Override
	public void sayHello() {
		System.out.println("HelloImpl Say Hello");
	}
}

通过@ImplementedBy注解,将接口和实现类绑定在一起


(2)创建一个HelloCaller(包含一个Hello属性)

package guice.di;

import com.google.inject.Inject;

//HelloCaller将会去调用Hello这个接口提供的服务
public class HelloCaller {
	
	//通过@Inject,来完成属性的注入
	@Inject
	private Hello hello ;
	//调用Hello的sayHello方法(实际上就是去调用HelloImpl的sayHello,因为我们将Hello的实现指定是HelloImpl)
	public void sayHello(){
		hello.sayHello() ;
	}
}
通过@Inject注解将Hello属性的实例注入进来


(3)创建一个测试类Client

package guice.di;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

public class Client {
	
	//创建一个测试程序
	public static void main(String[] args) {
		
		Injector in = Guice.createInjector(new Module(){
			@Override
			public void configure(Binder arg0) {
				//什么也不写
			}
		}) ;
		//得到HelloCaller的实例
		HelloCaller helloCaller = in.getInstance(HelloCaller.class) ;
		//调用sayHello方法
		helloCaller.sayHello() ;
	}
	
}

结果:

HelloImpl Say Hello


二. 构造方法注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

package guice.di;

import com.google.inject.Inject;

public class HelloCaller1 {
	//包含一个Hello属性
	private Hello hello ;
	//@Inject注解写在构造方法上,通过构造方法的方式注入属性hello
	@Inject
	public HelloCaller1(Hello hello){
		this.hello = hello ;
	}
	
	public void sayHello(){
		hello.sayHello() ;
	}
}

(2)创建测试程序

package guice.di;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

public class Client {
	
	//创建一个测试程序
	public static void main(String[] args) {
		
		Injector in = Guice.createInjector(new Module(){
			@Override
			public void configure(Binder arg0) {
				//什么也不写
			}
		}) ;
		//得到HelloCaller的实例
		HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
		//调用sayHello方法
		helloCaller.sayHello() ;
		
	}
	
}

结果:

HelloImpl Say Hello

三,setter方式注入

(1)Hello和HelloImpl类还是上面那样不用变,唯一变化的是HelloCaller类

package guice.di;


import com.google.inject.Inject;


public class HelloCaller2 {
	
	private Hello hello ;


	public Hello getHello() {
		return hello;
	}
	//通过setter方法来注入hello属性
	@Inject
	public void setHello(Hello hello) {
		this.hello = hello;
	}
	
}

(2)创建测试程序

package guice.di;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;

public class Client {
	
	//创建一个测试程序
	public static void main(String[] args) {
		
		Injector in = Guice.createInjector(new Module(){
			@Override
			public void configure(Binder arg0) {
				//什么也不写
			}
		}) ;
		//得到HelloCaller的实例
		HelloCaller1 helloCaller = in.getInstance(HelloCaller1.class) ;
		//调用sayHello方法
		helloCaller.sayHello() ;
		
	}
	
}

结果:

HelloImpl Say Hello


上面介绍了Guice框架的三种注入方式:属性注入,构造方法注入,setter方法注入


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章