版权申明:转载请注明出处。
文章来源:http://bigdataer.net/?p=330

排版乱?请移步原文获得更好的阅读体验

1.背景

最近项目中使用了guice作为依赖注入的框架。碰到一个如下的场景:
定义了一个从不同渠道输入数据的接口AbstractImporter,设计之初的目标是抽象从hdfs,kafka,DBMS等数据源输入数据处理。那么对应的实现就会有HdfsImporter,KafkaImporter,即一个接口对应多个实现。google官方的文档提供了两种实现方法:1.给每一个绑定对应写一个自定义注解,2.使用@Named注解。第二个方法的好处是不用为每个绑定写一个自定义注解,类似于spring中的@Resource,于是果断采用第二种方式,但是google文档上关于如何实现写的不是很详细,而且好多文章中给的都是类似下面的错误实现:

java    13行

public class PlayerModule implements Module{
public void configure(Binder binder) {
binder.bind(Player.class).annotatedWith(Names.named("Good")).to(
GoodPlayer.class);
binder.bind(Player.class).annotatedWith(Names.named("Bad")).to(
BadPlayer.class);
}
} //现在在客户端代码中,我们将使用 @Named() annotation来获取注释。
@Named("Good") Player goodPlayer = (Player)injector.getInstance(Player.class);
@Named("Bad") Player badPlayer = (Player)injector.getInstance(Player.class);

一跑就会报“接口没有绑定实现类”的错误,非常的蛋疼!

2.总结

后来受guice文档上简短代码片段的启发加上自己的领悟,终于解决了这个问题。回头想想导致整个问题的原因是自己盲目相信网上的文章且对guice作为一个依赖注入框架的认识不深导致的。下面贴出能正确运行的代码:

java    6行

//接口
package net.bigdataer.demo.juice;
public interface People {
public void setId(int id);
}

java    9行

package net.bigdataer.demo.juice;
//实现类
public class Student implements People {
public void setId(int id) { System.out.println(id);
}
}

java    8行

package net.bigdataer.demo.juice;
//实现类
public class Teacher implements People {
public void setId(int id) {
System.out.println(id);
}
}

java    13行

package net.bigdataer.demo.juice;

import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.name.Names;
//module类,绑定实现类到接口
public class JuiceModule implements Module {
public void configure(Binder binder) {
binder.bind(People.class).annotatedWith(Names.named("Teacher")).to(Teacher.class);
binder.bind(People.class).annotatedWith(Names.named("Student")).to(Student.class);
}
}

重要的代码段,如何使用@Named绑定多个实现

java    29行

package net.bigdataer.demo.juice;

import com.google.inject.Inject;
import com.google.inject.name.Named; public class InjectionConfig { private People student;
private People teacher; public People getStudent() {
return student;
} @Inject
public void setStudent(@Named("Student") People student) {
this.student = student;
} public People getTeacher() {
return teacher;
} @Inject
public void setTeacher(@Named("Teacher") People teacher) {
this.teacher = teacher;
}
}

java    18行

package net.bigdataer.demo.juice;

import com.google.inject.Guice;
import com.google.inject.Injector; public class NameMain { public static void main(String[] args){
Injector injector = Guice.createInjector(new JuiceModule());
InjectionConfig config = injector.getInstance(InjectionConfig.class);
People teacher = config.getTeacher();
teacher.setId(2); People student = config.getStudent();
student.setId(23);
}
}
3.升华

因为guice框架是用在我的项目中的,而整个项目是用scala语言写的,所以我也测试了guice在scala中的使用。总体感觉就是配合scala的语法,用起来非常爽。贴一下对应java中InjectionConfig类的scala实现:

scala    21行

package net.bigdataer.demo.juice

import com.google.inject.Inject
import com.google.inject.name.Named class SInjectionConfig { //使用named注解绑定多个实现
@Inject
@Named("Teacher")
var teacher:SPeople = _ @Inject
@Named("Student")
var student:SPeople = _ //普通绑定,绑定一个实现
@Inject
var log:Log = _
}

代码量不是一般的少。完整的demo放在了github上,地址:https://github.com/bigdataer01/scala-guice-demo

更多文章请关注微信公众号:bigdataer

使用@Named注解绑定多个实现(java,scala)的更多相关文章

  1. java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件

    提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息.   Java使用java.lang.annotation.Annotat ...

  2. 注解的基本盘点 -- 《Java编程思想》

    注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...

  3. docker 通过commit方法创建镜像(Tomcat+Java+Scala)

    前一阵试了试写Dockerfile创建docker image,但有时全靠Dockerfile写实在有些难度,退而求其次试一试使用commit来创建镜像: 想了想干脆创建一个Java+Scala+To ...

  4. Akka.NET是Java/Scala 流行框架Akka的一个 .NET 开源移植

    Akka.NET v1.0 已发布,支持Mono Akka.NET 是Java/Scala 流行框架Akka的一个 .NET 开源移植.可用于构建高并发,分布式和容错事件驱动的应用在 .NET 和 M ...

  5. 今天又犯了Java/Scala里面substring的错误

    每次都误以为是 substring(startIndex, length) 其实是 substring(startIndex, endIndex) 嗯 Java/Scala 跟 C++ 是不一样的.

  6. 在IntelliJ IDEA中创建和运行java/scala/spark程序

    本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spark程序 基本概念介 ...

  7. Spring AOP注解为什么失效?90%Java程序员不知道

    使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...

  8. Spring课程 Spring入门篇 4-6 Spring bean装配之基于java的容器注解说明--@ImportResource和@Value java与properties文件交互

    1 解析 1.1 这两个注解应用在什么地方 1.2 应用方式 1.3 xml方式实现取值 2 代码演练 2.1 @ImportResource和@Value代码演练 1 解析 1.1 这两个注解应用在 ...

  9. Java Scala获取所有注解的类信息

    要想获取使用指定注解的类信息,可借助工具: org.reflections.Reflections 此工具将Java反射进行了高级封装,Reflections 通过扫描 classpath,索引元数据 ...

随机推荐

  1. The Personal Touch Client Identification 个性化接触 客户识别

    w服务器要知道和谁在交谈. HTTP The Definitive Guide Web servers may talk to thousands of different clients simul ...

  2. 基于spring的quartz定时框架,实现简单的定时任务功能

    在项目中,经常会用到定时任务,这就需要使用quartz框架去进行操作. 今天就把我最近做的个人主页项目里面的定时刷新功能分享一下,很简单. 首先需要配置一个配置文件,因为我是基于spring框架的,所 ...

  3. Yii框架2.0的控制器

    控制器是继承[[yii\base\Controller]]类的对象,负责处理请求和生成响应. 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息 ...

  4. python脚本前两行

    1. 第一行指定解释器路径 推荐写法: #!/usr/bin/env python 详细说明: #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python ...

  5. virt-manager 操作 kvm虚拟机中鼠标不同步的问题

    在/etc/libvirt/qemu下找到对应的xml配置文件 在<devices>标签下添加 <input type='tablet' bus='usb'/>   然后 vi ...

  6. requests+BeautifulSoup详解

    简介 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种 ...

  7. Python 最难的问题

    Python 最难的问题 超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心. 未解决的问题 随处都是问题.难度大.耗时多肯定是其中一个问题.仅仅是尝试解决这个 ...

  8. Service Receiver Activity 之间的通信

    一.Activity与Service 1. 通过Intent,例子如下: Intent intent = new Intent(this, Myservice.class); // intent .p ...

  9. 可能引起「We Were Unable to Load Disqus」错误的一种情况分析

    今天想往Octopress里加评论,之前看了网上的教程,应该是简单的事情,因为Octopress本来为你准备好了评论插件Disqus的代码,只需要去Disqus注册个帐号,然后在_config.yml ...

  10. Redis vs Mongo vs mysql

    Redis 和 Mongo 都属于 No-SQL类型的数据库,他们的区别,联系是什么呢?看了一些文章,特总结如下. Redis 最大的特点是,快!为什么快,因为他将大量的东西存储在了memory中.但 ...