guice的能力简述
guice这个google出的bean容器框架,ES有用到他。
能干什么
- 是一个bean容器
- 能AOP
能力细分与使用方式
- 以module创建injector。可以看成是一个容器。Module需要自定义且继承自他的AbstractModule。覆写config方法完成装配关系的确定。详细参见这里
- 绑定顶层接口到具体实现类。bind(TransactionLog.class).to(DatabaseTransactionLog.class); 支持bind(A).to(B) 然后链式的 bind(B).to(C)
- 支持在构造函数上打上Inject注解标签,用于注入字段
- 支持自定义注解用于标志装配目标,比如自定义注解Paypal。 对于加了PayPal注解的参数,注入PaypalCreditCardProcessor实现,其余的注入GoogleCheckoutProcessor实现。bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PaypalCreditCardProcessor.class);
- 对于加了Named注解 其值为testnamed的地方注入TestNamedCreditCardProcessor实现。bind(CreditCardProcessor.class).annotatedWith(Names.named("testnamed")).to(TestNamedCreditCardProcessor.class);
- 结合Named注解 可以将一个参数绑定一个特定的instance 而不是一个实现类。bind(Integer.class).annotatedWith(Names.named("chargeTimeout")).toInstance(200);
- 可以使用Provides注解 主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种方式可以对bean做自定义加工。相当于反转了bind的那个动作 同时也可以结合 自定义注解 使用 比如上面的@Paypal 效果相同。但是这种方式创建的bean不能参与AOP 因为instance是用户创建的嘛,所以任何额外逻辑编编织不进去了。那怎么解决这个问题,guice在bind后提供了toConstructor方法去指定实现类。这样就连Inject注解都不需要了。因为这个实现类可能是三方提供的。
- 用自定义注解的方式结合bindInterceptor方式完成 本质上是个拦截器 AOP这些接口遵循AOP联盟约定。 有点类似jfinal的理念。
部分示例代码
全部的参见这里
测试主类
package com.code260.ss.guice.demo.bill;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class TestMain {
public static void main(String[] args) {
/**
* 1. 以module创建injector
*/
Injector injector = Guice.createInjector(new BillingModule());
RealBillingService billingService = injector.getInstance(RealBillingService.class);
billingService.chargeOrder(null,null);
TestCustomAnnotationBillingService testCustomAnnotationBillingService = injector.getInstance(TestCustomAnnotationBillingService.class);
testCustomAnnotationBillingService.chargeOrder(null,null);
TestNamedBillingService testNamedBillingService = injector.getInstance(TestNamedBillingService.class);
testNamedBillingService.chargeOrder(null,null);
}
}
module
package com.code260.ss.guice.demo.bill;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.matcher.Matcher;
import com.google.inject.matcher.Matchers;
import com.google.inject.name.Names;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
/**
* 2. 绑定接口到实现类
*/
/**
* LinkedBindings
* 支持 bind(A).to(B) 然后链式的 bind(B).to(C)
* to完之后 还支持in in后面接的是Scope 有Singleton
*/
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
bind(CreditCardProcessor.class).to(GoogleCheckoutProcessor.class);
/**
* 6. 结合Named注解 可以将一个参数绑定一个特定的instance 而不是一个实现类
*/
bind(Integer.class).annotatedWith(Names.named("chargeTimeout")).toInstance(200);
/**
* 4. 对于加了PayPal注解的参数,注入PaypalCreditCardProcessor实现,其余的注入GoogleCheckoutProcessor实现
*/
bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PaypalCreditCardProcessor.class);
/**
* 5. 对于加了Named注解 其值为testnamed的地方注入TestNamedCreditCardProcessor实现
*/
bind(CreditCardProcessor.class).annotatedWith(Names.named("testnamed")).to(TestNamedCreditCardProcessor.class);
/**
* 8. 用自定义注解的方式结合bindInterceptor方式完成 本质上是个拦截器 有点类似jfinal的理念
*/
bindInterceptor(Matchers.any(), Matchers.annotatedWith(NonWeekend.class), new NotOnWeekendsInterceptor());
}
/**
* 7. 可以使用Provides注解 主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种方式可以对bean做自定义加工
* 相当于反转了bind的那个动作 同时也可以结合 自定义注解 使用 比如上面的@Paypal 效果相同
* 但是这种方式创建的bean不能参与AOP 因为instance是用户创建的嘛,所以任何额外逻辑编编织不进去了。
* 那怎么解决这个问题,guice在bind后提供了toConstructor方法去指定实现类。
* 这样就连Inject注解都不需要了。因为这个实现类可能是三方提供的
* @return
*/
@Provides
public AlertService provideAlertService() {
RedAlertService redAlertService = new RedAlertService();
redAlertService.setTestAttribute();
return redAlertService;
}
}
用于AOP的拦截器类
package com.code260.ss.guice.demo.bill;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class NotOnWeekendsInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("do something before NotOnWeekendsInterceptor invoke");
Object result = methodInvocation.proceed();
System.out.println("do something after NotOnWeekendsInterceptor invoke");
return result;
}
}
guice的能力简述的更多相关文章
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- TCP/IP协议工作原理简述
TCP/IP协议工作原理简述 // */ // ]]> TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...
- PHP性能优化简述
先谢慕课网,这里只做理论简述/** * PHP性能优化 * * 1.问题分析 * PHP语法使用不正确 * PHP不擅长的事 * PHP连接的服务不给力 * PHP自身短板 * 其它原因 * 2.PH ...
- Android Animation简述
Android Animation简述 一.动画(Animation) Android框架提供了两种动画系统:属性动画(Android3.0)和视图动画.同时使用两种动画是可行的,但 ...
- javascript作用域(Scope),简述上下文(context)和作用域的定义
网页制作Webjx文章简介:这篇文章将正面解决这个问题:简述上下文(context)和作用域的定义,分析可以让我们掌控上下文的两种方法,最后深入一种高效的方案,它能有效解决我所碰到的90%的问题. 作 ...
- HDFS 架构简述
HDFS 架构简述 Hadoop分布式文件系统(HDFS)是一个分布式的文件系统,运行在廉价的硬件上.它与现有的分布式文件系统有很多相似之处.然而与其他的分布式文件系统的差异也是显着的.HDFS是高容 ...
- 笔记︱支持向量机SVM在金融风险欺诈中应用简述
本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 欺诈一般不用什么深入的模型进行拟合,比较看重分析员对业务的了解,从异常 ...
- CSS(Cascading Style Sheet)简述
CSS(Cascading Style Sheet)简述 什么是CSS? css是指层叠样式表 css定义了如何显示HTML元素 css的诞生是为了解决内容与表现分离的问题,可以极大地提高工作效率 样 ...
- JAVA EE 第二周(XML简述以及web请求的过程)
一. 对于XML,我分别从以下几个方面来简述: 1.定义: XML是一种可扩展的标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. (可扩展标记语言:可扩展标记语言是一 ...
随机推荐
- 题解 洛谷 P5331 【[SNOI2019]通信】
考虑用费用流解决本题. 每个哨站看作一个点,并将其拆为两个点,建图方式为: \(S \longrightarrow x_i\) 容量为\(1\),费用为\(0\) \(x_i \longrightar ...
- 何时/如何使用 Vue3 render 函数
什么是 DOM? 如果我们把这个 HTML 加载到浏览器中,浏览器创建这些节点,用来显示网页.所以这个HTML映射到一系列DOM节点,然后我们可以使用JavaScript进行操作.例如: let it ...
- JVM系列之:String.intern和stringTable
目录 简介 intern简介 intern和字符串字面量常量 分析intern返回的String对象 分析实际的问题 G1中的去重功能 总结 简介 StringTable是什么?它和String.in ...
- LRU cache缓存简单实现
LRU cache LRU(最近最少使用)是一种常用的缓存淘汰机制.当缓存大小容量到达最大分配容量的时候,就会将缓存中最近访问最少的对象删除掉,以腾出空间给新来的数据. 实现 (1)单线程简单版本 ( ...
- 看完这一篇,再也不怕面试官问到IntentService的原理
IntentService是什么 在内部封装了 Handler.消息队列的一个Service子类,适合在后台执行一系列串行依次执行的耗时异步任务,方便了我们的日常coding(普通的Service则是 ...
- Day16_授权中心
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 总结 1 ...
- Python globals和locals函数_reload函数
Python globals和locals函数_reload函数: globals( ): 返回所有能够访问到的全局名字 num = 5 sum = 0 def add(num): func_sum ...
- [转] 9种设计模式在Spring中的运用
作者:iCoding91地址:https://blog.csdn.net/caoxiaohong1005 转发的公众号地址,有其他设计模式介绍:https://mp.weixin.qq.com/s/Z ...
- MyBatis-Plus使用(2)-CRUD接口
参考文档:https://mybatis.plus/guide/crud-interface.html MyBatis-Plus自带的CRUD方法分为Mapper层和Service层,大多数功能是重叠 ...
- Centos7 如何通过win10 的远程桌面连接进行远程访问
首先,如果安装测centos7是已经安装了GNOME 或者 KDE 桌面, 则只需要再安装xrdp就可以了. 直接通过yum install xrdp 是不行的,因为xrdp 不在默认源中 先配置 ...