guice在moudle中提供了良好的绑定方法。

它提供了普通的绑定,自定义注解绑定,按名称绑定等。

下面直接看代码:

 package com.ming.user.test;

 import com.google.inject.AbstractModule;
import com.google.inject.name.Names; /**
* 继承 AbstractModule这个抽象类
* @author mingge
*
*/
public class TestModule extends AbstractModule{ @Override
protected void configure() { //普通绑定
bind(Dog.class).to(DarkDog.class); //自定义注解绑定--一个接口可以多个实现
bind(Dao.class).annotatedWith(CSV.class).to(DaoImpl.class);
bind(Dao.class).annotatedWith(CSV1.class) .to(DaoImpl2.class); //names注解常量绑定--也可用于一个接口多个实现的绑定
bindConstant().annotatedWith(Names.named("maxResults")).to(10);//类似于绑定了一个常量 }
}

类似与普通绑定,很简单:

 package com.ming.user.test;

 public class Dog {

     void eat(){
System.out.println("父类的在go,go,go。。。");
}
}
 package com.ming.user.test;

 public class DarkDog extends Dog{

     @Override
void eat() {
System.out.println("heeeelo");
//super.eat();
} }

类似与注解绑定:

 package com.ming.user.test;

 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; /**
* 自定义一个绑定注解
* @author mingge
*
*/
@BindingAnnotation
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CSV {
String value() default "";
}
 package com.ming.user.test;

 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; /**
* 自定义一个绑定注解
* @author mingge
*
*/
@BindingAnnotation
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CSV1 { }

然后是一个接口,两个实现:

 package com.ming.user.test;

 public interface Dao {

     void testGuice();
}
 package com.ming.user.test;

 import com.google.inject.Singleton;

 @Singleton
public class DaoImpl implements Dao{ @Override
public void testGuice() { System.out.println("测试guice,实现依赖!"); } }
 package com.ming.user.test;

 public class DaoImpl2 implements Dao{

     @Override
public void testGuice() { System.out.println("第二个实现耶...."); } }

最后就是通过guice自定义的Name方式绑定:

 package com.ming.user.test;

 import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.name.Named; /**
* 测试几种注入方式
* @author mingge
*
*/
@Singleton
public class TestDaoInjection { private Dao dao; @Inject
@CSV1
private Dao dao1; @Inject
public void setDao(@CSV Dao dao) {//自定义注解绑定实现
this.dao = dao;
} private int maxResults; @Inject
public void setMaxResults(@Named("maxResults") int maxResults) {//按名称绑定
this.maxResults = maxResults;
} @Inject
private Dog dog;//普通注入 void test(){
System.out.println("这个是注入...");
dao.testGuice();
System.out.println(maxResults);
dog.eat(); dao1.testGuice();
}
}

测试代码:

 package com.ming.user.test;

 import com.google.inject.Guice;
import com.google.inject.Injector; public class Test { public static void main(String[] args) {
Injector injector = Guice.createInjector(new TestModule());
TestDaoInjection test=injector.getInstance(TestDaoInjection.class);
test.test();
}
}

使用provider

在 Guice 中 Providers 就像 Factories 一样创建和返回对象。在大部分情况下,客户端可以直接依赖 Guice 框架来为服务(Services)创建依赖的对象。但是少数情况下,应用程序代码需要为一个特定的类型定制对象创建流程(Object creation process),这样可以控制对象创建的数量,提供缓存(Cache)机制等,这样的话我们就要依赖 Guice 的 Provider 类。

 package com.ming.user.test.provide;

 import com.google.inject.ProvidedBy;

 @ProvidedBy(ConnectionProvider.class)
public interface ConnectionI { void open(); void close();
}
 package com.ming.user.test.provide;

 import com.google.inject.Provider;

 public class ConnectionProvider implements Provider<ConnectionI> {

     @Override
public ConnectionI get() {
ConnectionI c=new MockConnection();
return c;
} }
 package com.ming.user.test.provide;

 public class MockConnection implements ConnectionI{

     public void open(){
System.out.println("open...");
} public void close(){
System.out.println("close...");
}
}
 package com.ming.user.test;

 import com.google.inject.AbstractModule;
import com.ming.user.test.provide.ConnectionI;
import com.ming.user.test.provide.ConnectionProvider; /**
* 继承 AbstractModule这个抽象类
* @author mingge
*
*/
public class TestModule extends AbstractModule{ @Override
protected void configure() { //实现Provider接口的绑定
bind(ConnectionI.class).toProvider(ConnectionProvider.class);
} }
 package com.ming.user.test;

 import com.google.inject.Guice;
import com.google.inject.Injector;
import com.ming.user.test.provide.MockConnection; public class Test { public static void main(String[] args) {
Injector injector = Guice.createInjector(new TestModule());
MockConnection test=injector.getInstance(MockConnection.class);
test.open();
test.close();
}
}

Summary一下:普通绑定用得最多,name那个方法绑定用于多个接口实现,自定注解那种按特殊情况使用。说明一下,name那个注解绑定,用于绑定属性常量也很方便。

guice基本使用,常用的绑定方式(四)的更多相关文章

  1. DOM常用事件绑定方式与实例

    一.常用的事件 onclick 点击事件 模态框实例 <input type="button" id="b1" style="width:50p ...

  2. 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

  3. ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

  4. 关于this绑定的四种方式

    一.前言 我们每天都在书写着有关于this的javascript代码,似懂非懂地在用着.前阵子在看了<你不知道的JavaScript上卷>之后,也算是被扫盲了一边关于this绑定的四种方式 ...

  5. java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》

    java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...

  6. vue动态绑定class的最常用几种方式

    vue动态绑定class的最常用几种方式:  第一种:(最简单的绑定) 1.绑定单个class html部分: <div :class="{'active':isActive}&quo ...

  7. WCF中常用的binding方式

    WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...

  8. OAF_VO系列3 - Binding Style绑定方式

    在OAF VO开发中,Binding Style主要用于对VO的where clause做动态传值,总共有三种方式 1.       Oracle Named 2.       Oracle Posi ...

  9. javascript学习(1)用户的Javascript 放在哪里和函数的绑定方式

    一.实验 1:js脚本放在那里最合适? 1.代码 1.1.test.html <!DOCTYPE html><html>    <head>        < ...

随机推荐

  1. 《计算机图形学基础(OpenGL版)》勘误表

    第1版第1次印刷: 所在页码 所在行 原内容 更正为 41 16 k=Δx/Δy k=Δy/Δx 46 6 s-t=2Δy/Δx(xi+1)+2b+2yi-1 s-t=2Δy/Δx(xi+1)+2b- ...

  2. Windows server 2008R2系统登录密码破解

    服务器密码忘记,或者被恶意修改,系统被入侵,都是很让人烦心的事情,我试过很多方法,包括使用PE工具删除C盘Windows\System\config里面的SAM文件,可是过程都相当华美,结果都相当杯具 ...

  3. Spring实战(中文4,5版) PDF含源码

    Spring实战 读者评价 看了一半后在做评论,物流速度挺快,正版行货,只是运输过程有点印记,但是想必大家和你关注内容,spring 4必之3更加关注的是使用注解做开发,对于初学者还是很有用,但是不排 ...

  4. Vue select默认选中第一个

    <td> <select v-model="selectWare"> <option selected="selected" va ...

  5. CentOS 7.2.1511编译安装Nginx1.10.1+MySQL5.7.15+PHP7.0.11

    准备篇 一.防火墙配置 CentOS 7.2默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.se ...

  6. Qt Quick编程(1)

    说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape.Sun.微软.Borland等公司基于JavaScript和JScript锤炼.定义出来的. EC ...

  7. 世界对一名颓废者的惩罚——SDOI2019R1游记

    在清明节前,我仿佛已经成为了一名退役选手 一个月做五道题,10天不碰电脑 终日只知颓废 SDOI2019,希望能引起我的警戒吧 Day 0 不说了. 晚上做了三道斯波题(包括去年多省联考的D1T1), ...

  8. 【ACM】poj_1363_Rails_201308081502

    Rails Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21528   Accepted: 8597 Descriptio ...

  9. 这篇文章关于两阶段提交和Paxos讲的很好

    http://blog.chinaunix.net/uid-16723279-id-3803058.html <两阶段提交协议与paxos投票算法> 点评:2PC绝对是CP的死党,是分布式 ...

  10. 通俗编程——白话NIO之Buffer

    Buffer简单介绍 Buffer意为缓冲区.其本质上就是是一块可写入数据,然后能够从中读取数据的内存区域.通过该种方式有助于降低系统开销和提高外设效率.对于缓冲区我们早有所了解,比方在C中标准I/O ...