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. 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)

    查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...

  2. 学习网址Collect

    Laravel 学院    https://laravelacademy.org/wx小程序 https://developers.weixin.qq.com/miniprogram/dev/quic ...

  3. ubuntu18.0安装RabbitMQ

    RabbitMQ是一个消息队列,用于实现应用程序的异步和解耦.生产者将生产消息传送到队列,消费中从队列中拿取消息并处理.生产者不用关心是谁来消费,消费者不用关系是谁在生产消息,从而达到解耦的目的.本文 ...

  4. eas之编码规则&单据转换规则

    *当在企业建模中没有要显示的项目的话,则从包更新到系统树然后选择到规则定义,对申请单新增规则. 企业建模--业务规则-规则定义组织优先  多组织有先  集团优先固定值 显示格式PUR ..系统日期 2 ...

  5. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

  6. sql查询原理

    1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 1)简单的单表查询 SELECT 字段 FROM ...

  7. linux系统中给mysql配置环境变量

    安装过程就不写了,记得安装的路径就行,接下来要用到. 修改配置文件 vim /etc/profile 设置环境变量 写一个MYSQL_HOME,值为“mysql的安装路径” 在PATH后面加上$MYS ...

  8. Linux下SuperLU安装

    SuperLU安装 1.在家目录下建立文件夹superlu,进入该目录,获取安装程序并解压缩 mkdir superlu cd superlu wget http://crd-legacy.lbl.g ...

  9. touch:命令创建文件

    touch:创建空文件或改变文件的时间戳属性 [功能说明] touch命令有两个功能:一是创建新的空文件:二是改变已有文件的时间戳属性 [语法格式] touch [option] [file] tou ...

  10. Shell入门基础

    Shell的Helloworld #!/bin/bash echo "helloworld taosir" 执行方式 方式一:用 bash 或 sh 的相对或绝对路径(不用赋予脚本 ...