Google Guice 接口多实现 注入

本文介绍如何使用Guice框架实现一个接口绑定多个实现类的方法。通过@Named注解,可以在调用类中指定不同实现类,实现灵活的依赖注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面几节主要介绍了绑定和注入方式,但是我们看到无论是通过在Module中通过Binder来绑定还是通过@ImplementedBy注解来绑定,一个接口都只能绑定到一个具体的实现类上,现在如果在一个调用类中,有多个Hello.java这个接口的属性,需要绑定到不同的实现类上,这如何使用Guice框架来完成注入呢?

这一节我们来说说接口多个实现类的注入方式

(1)首先定义一个接口Hello.java和两个不同的实现类HelloImpl1.java,helloImpl.java

package guice.di.mutiple;

public interface Hello {
	//定义一个sayHello方法
	void satHello() ;
}

package guice.di.mutiple;

//Hello 的实现类HelloImpl1
public class HelloImpl1 implements Hello{
	
	public void satHello() {
		System.out.println("HelloImpl1 say Hello!");
	};
}

package guice.di.mutiple;

//Hello的具体实现类HelloImpl2
public class HelloImpl2 implements Hello{

	@Override
	public void satHello() {
		System.out.println("HelloImpl2 say Hello!");
	}
}

(2)创建一个Hello这个接口的调用者

package guice.di.mutiple;

import com.google.inject.Inject;
import com.google.inject.name.Named;
//将一个接口绑定到多个实现类上
public class HelloCaller {
	
	@Inject
	@Named("HelloImpl1")
	private Hello helloImpl1 ;
	@Inject
	@Named("HelloImpl2")
	private Hello helloImpl2 ;
	
	public void sayHello1(){
		helloImpl1.satHello() ;
	}
	
	public void sayHello2(){
		helloImpl2.satHello() ;
	}
}

(3)创建MyModule来实现一个接口绑定多个实现类

package guice.di.mutiple;

import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.name.Names;

public class MyModule implements Module{

	@Override
	public void configure(Binder binder) {
		//通过annotatedWith 中使用Named方法来绑定多个实现类
		binder.bind(Hello.class).annotatedWith(Names.named("HelloImpl1")).to(HelloImpl1.class) ;
		binder.bind(Hello.class).annotatedWith(Names.named("HelloImpl2")).to(HelloImpl2.class) ;
	}
}
(4)创建测试程序

package guice.di.mutiple;

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

public class Client {
	
	public static void main(String[] args) {
		
		Injector in = Guice.createInjector(new MyModule()) ;
		HelloCaller caller = in.getInstance(HelloCaller.class) ;
		
		caller.sayHello1() ;
		caller.sayHello2() ;
	}
}

输出结果:

HelloImpl1 say Hello!
HelloImpl2 say Hello!

本文介绍通过使用@Named注解来完成一个接口(父类)绑定多个实现类(子类)的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值