Guice 学习(五)多接口的实现( Many Interface Implementation)

1、接口

/*
 * Creation : 2015年6月30日
 */
package com.guice.InterfaceManyImpl;

public interface Service {
    public void execute();
}

2、两个实现类


package com.guice.InterfaceManyImpl;

public class OneService implements Service {
    @Override
    public void execute() {
        System.out.println("Hello!  I‘M Service 1!");

    }
}
package com.guice.InterfaceManyImpl;

public class TwoService implements Service {

    @Override
    public void execute() {
        System.out.println("Hello!  I‘M Service 2!");

    }

}

3、两个注解类

package com.guice.InterfaceManyImpl;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.google.inject.BindingAnnotation;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@BindingAnnotation
public @interface One {
}
package com.guice.InterfaceManyImpl;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.google.inject.BindingAnnotation;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@BindingAnnotation
public @interface Two {

}

4、多接口实现测试类

package com.guice.InterfaceManyImpl;

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

/*
 * 接口的多实现:
 * 此类的结构是注入了两个service服务,注解One和OneService关联,第二个和它一样
 */
public class InterfaceManyImpl {
    @Inject
    @One
    private Service oneService;
    @Inject
    @Two
    private Service twoService;

    public static void main(String[] args) {
        InterfaceManyImpl instance = Guice.createInjector(new Module() {

            @Override
            public void configure(Binder binder) {
                //让注解类和实现类绑定
                binder.bind(Service.class).annotatedWith(One.class).to(OneService.class);
                binder.bind(Service.class).annotatedWith(Two.class).to(TwoService.class);
            }
        }).getInstance(InterfaceManyImpl.class);

        instance.oneService.execute();
        instance.twoService.execute();
    }

}

5、无注解的多接口实现测试类

package com.guice.InterfaceManyImpl;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.name.Named;
import com.google.inject.name.Names;

/**
 * TODO : 程序员比较懒,不想写注解来区分多个服务则可以使用Google提供的一个叫Names的模板来生成注解
 * @author E468380
 */
public class NoAnnotationMultiInterfaceServiceDemo {
    @Inject
    @Named("One")
    private static Service oneService;

    @Inject
    @Named("Two")
    private static Service twoService;

    public static void main(String[] args) {
        Guice.createInjector(new Module() {

            @Override
            public void configure(Binder binder) {
                // 这里不同
                binder.bind(Service.class).annotatedWith(Names.named("One")).to(OneService.class);
                binder.bind(Service.class).annotatedWith(Names.named("Two")).to(TwoService.class);
                binder.requestStaticInjection(NoAnnotationMultiInterfaceServiceDemo.class);
            }
        });
        NoAnnotationMultiInterfaceServiceDemo.oneService.execute();
        NoAnnotationMultiInterfaceServiceDemo.twoService.execute();

    }

}

6、静态的多接口实现测试类

问题(1)静态注入多个服务怎么写?

package com.guice.InterfaceManyImpl;

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

/**
 * TODO :也可以静态注入多个服务
 *
 * @author E468380
 */
public class StaticMultiInterfaceServiceDemo {

    @Inject
    @One
    private static Service oneService;

    @Inject
    @One
    private static Service twoService;

    public static void main(String[] args) {
        Guice.createInjector(new Module() {

            @Override
            public void configure(Binder binder) {
                binder.bind(Service.class).annotatedWith(One.class).to(OneService.class);
                binder.bind(Service.class).annotatedWith(Two.class).to(TwoService.class);
                binder.requestStaticInjection(StaticMultiInterfaceServiceDemo.class);
            }
        });
        StaticMultiInterfaceServiceDemo.oneService.execute();
        StaticMultiInterfaceServiceDemo.twoService.execute();

    }

}
// 如果不小心一个属性绑定了多个接口怎么办? --》不可以绑定多个服务。
时间: 2024-10-06 04:45:03

Guice 学习(五)多接口的实现( Many Interface Implementation)的相关文章

Objective C 快速入门学习五

<一>继承和多态 @class Complex 声明类(同C++) 子类函数成员 super 访问父类 同C++类似 1.通过继承 在子类中添加新方法 2.通过继承 在子类中添加新成员 3.通过继承 实现多态(实现比较简单,通过Id通用类型作为父类) 4.重载 5.抽象类abstract作用:创建子类更容易:提供了处理所有派生子类的公共接口:抽象方法制定了标准协议,规范子类必须实现. 6.通用类型id,编译时不会做类型检查,在运行时才会动态绑定具体类型,指出错误. 静态类型在编译阶段就会指出错

springMVC3学习(五)--MultiActionController

Spring提供一个多动作控制器,使用它你可以将几个动作合并在一个控制器里,这样可以把功能组合在一起. 多动作控制器存在在一个单独的包中--org.springframework.web.mvc.multiaction--它能够将请求映射到方法名, 然后调用正确的方法.比如当你在一个控制器中有很多公共的功能,但是想多个入口到控制器使用不同的行为, 使用多动作控制器就特别方便. MultiActionController类实现 类定义:public class MultiActionControl

Beaglebone Back学习五(PWM测试)

PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 Beaglebone Coding 101: Buttons and PWM 4 Using PWM outputs 5 beaglebone-black-cpp-PWM 6 Enabling PWM Support in the kernel 7 Beaglebone Back学习五(PWM测试

TweenMax动画库学习(五)

目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            TweenMax动画库学习(四)            TweenMax动画库学习(五)  

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

NodeJS学习五 之网页显示

我们新建一个Server.js. 然后运行cmd 找到server.js 路径.  node server.js 浏览器中输入http://localhost:8888/ 你会发现,网页上出现了 Hello World NodeJS学习五 之网页显示,布布扣,bubuko.com

Cmdlet开发与学习(五)

Parameter       在声明cmdlet参数的时候,我们使用了Parameter标识符,在这个标识符中,有些参数需要了解到. 强制参数 设置Mandatory=true即可. 对于强制参数,不管是在命令行中绑定,还是通过管道输入,在命令逻辑执行之前,它就必须绑定好.如果强制参数没有参数值的话,PowerShell会弹出对话框,要求用户提供参数值. 位置参数.       Position= n       有时,我们在使用Powershell的时候,发现仅仅是输入参数值,并没有指定具体

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

HTML5学习之FileReader接口

http://blog.csdn.net/zk437092645/article/details/8745647 用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据.到目前文职,只有FF3.6+和Chrome6.0+实现了FileReader接口. 1.FileReader接口的方法 FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取.无论读取成功或失败,方法并不会返

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)

java学习中,接口的使用(重要,常用知识点)(java 学习中的小记录)作者:王可利(Star·星星) 接口(功能:用来添加拓展功能的) 例子:铅笔.带橡皮檫的铅笔. 两个功能:     1.写字......> 铅笔     2.擦字......> 橡皮擦 想法:定义一个铅笔类,定义一个橡皮擦类,定义一个带橡皮擦的铅笔类继承 铅笔类和橡皮擦类 但是java是单继承的.于是就有了解决的方法:接口(可以添加拓展功能) 如:一个铅笔类,给它添加一个接口给它一个拓展类(橡皮擦类) 接口的定义模式 用