guice基本使用,常用的绑定方式(四)
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基本使用,常用的绑定方式(四)的更多相关文章
- DOM常用事件绑定方式与实例
一.常用的事件 onclick 点击事件 模态框实例 <input type="button" id="b1" style="width:50p ...
- 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- 关于this绑定的四种方式
一.前言 我们每天都在书写着有关于this的javascript代码,似懂非懂地在用着.前阵子在看了<你不知道的JavaScript上卷>之后,也算是被扫盲了一边关于this绑定的四种方式 ...
- java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》
java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...
- vue动态绑定class的最常用几种方式
vue动态绑定class的最常用几种方式: 第一种:(最简单的绑定) 1.绑定单个class html部分: <div :class="{'active':isActive}&quo ...
- WCF中常用的binding方式
WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...
- OAF_VO系列3 - Binding Style绑定方式
在OAF VO开发中,Binding Style主要用于对VO的where clause做动态传值,总共有三种方式 1. Oracle Named 2. Oracle Posi ...
- javascript学习(1)用户的Javascript 放在哪里和函数的绑定方式
一.实验 1:js脚本放在那里最合适? 1.代码 1.1.test.html <!DOCTYPE html><html> <head> < ...
随机推荐
- 面试回答问题要防范hr的陷阱
面试技巧是大众化的,比较实在.在经历的各种面试中,最不容易防范的面试就是“拉呱”(山东方言,聊天的意思),这样子自己容易放松警惕. 看看下面的,就知道应该怎么应对这些“滑头”的HR! 1.我们为什么要 ...
- js 二级联动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 连接(JOIN)运算
内连接--INNER JOIN 此处用商品表(product)和商店商品表(ShopProduct)测试,外键:product_id select sp.shop_id, sp.shop_name, ...
- printf 打印较长字符
- nyoj4-ASCII码排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N, ...
- SpringBoot 整合 Mybatis 进行CRUD测试开发
今天来和大家分享下 Spring Boot 整合 MyBatis 的 CRUD 测试方法开发.因为 MyBaits 有两种开发形式,一种基于注解,一种基于 xml . SpringBoot配置文件也有 ...
- onunload与onbeforeunload事件解析 标签: 浏览器 2017-04-10 09:46 45人阅读 评论(0)
注:只测试了chrome和IE浏览器的表现情况 onunload事件 //JS Document window.onunload = onunload_message; function onunlo ...
- elementUI 时间选择器,时间选择快捷键
elementUI的时间快捷键,使用属性:picker-options="pickerOptions",由于pickerOptions的定义很长,也在其他地方共用,因此建议提取出来 ...
- C# 实现串口发送数据(不用串口控件版)
参考:https://blog.csdn.net/mannix_lei/article/details/79979432 https://www.cnblogs.com/ElijahZeng/p/76 ...
- CodeForces 396C On Changing Tree
On Changing Tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...