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. PHP获得文件的大小并转换格式

    利用filesize($filename)函数获得一个文件的大小 参数$filename为文件的绝对路径,返回的值是文件的大小字节数. 文件较大的时候看起来不方便,下面是一个格式化方法 functio ...

  2. html中的小知识

    引用外部样式 样式表,如果是引用外部样式,不需要再写style标签了,因为 <link rel="stylesheet" type="text/css" ...

  3. C# 去掉代码前边空格(格式化代码)

    private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; string str = ...

  4. Tomcat Eclipse Debug出现异常

    1.可能是java类没有及时更新成class文件2.本地程序没有同步到Tommcat服务器里面3.Servlet类里面加了版本号private static final long serialVers ...

  5. Vue select默认选中第一个

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

  6. 如何手动触发物理机panic,并产生vmcore

    如何手动触发物理机panic,并产生vmcore? 1. 配置kdump 1.1 el6 如果是CentOS 6 则编辑/boot/grub/grub.conf配置在内核参数中添加 crashkern ...

  7. LA 3938

    After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return fo ...

  8. 蒟蒻的长链剖分学习笔记(例题:HOTEL加强版、重建计划)

    长链剖分学习笔记 说到树的链剖,大多数人都会首先想到重链剖分.的确,目前重链剖分在OI中有更加多样化的应用,但它大多时候是替代不了长链剖分的. 重链剖分是把size最大的儿子当成重儿子,顾名思义长链剖 ...

  9. webpack学习笔记(1)--webpack.config.js

    主要的信息都是来自于下方所示的网站 https://webpack.docschina.org/configuration 从 webpack 4.0.0 版本开始,可以不用通过引入一个配置文件打包项 ...

  10. 08.Web服务器-1.浏览器访问服务器显示页面的网络模型步骤解析