guice这个google出的bean容器框架,ES有用到他。

能干什么

  1. 是一个bean容器
  2. 能AOP

能力细分与使用方式

  1. 以module创建injector。可以看成是一个容器。Module需要自定义且继承自他的AbstractModule。覆写config方法完成装配关系的确定。详细参见这里
  2. 绑定顶层接口到具体实现类。bind(TransactionLog.class).to(DatabaseTransactionLog.class); 支持bind(A).to(B) 然后链式的 bind(B).to(C)
  3. 支持在构造函数上打上Inject注解标签,用于注入字段
  4. 支持自定义注解用于标志装配目标,比如自定义注解Paypal。 对于加了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);
  6. 结合Named注解 可以将一个参数绑定一个特定的instance 而不是一个实现类。bind(Integer.class).annotatedWith(Names.named("chargeTimeout")).toInstance(200);
  7. 可以使用Provides注解 主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种方式可以对bean做自定义加工。相当于反转了bind的那个动作 同时也可以结合 自定义注解 使用 比如上面的@Paypal 效果相同。但是这种方式创建的bean不能参与AOP 因为instance是用户创建的嘛,所以任何额外逻辑编编织不进去了。那怎么解决这个问题,guice在bind后提供了toConstructor方法去指定实现类。这样就连Inject注解都不需要了。因为这个实现类可能是三方提供的。
  8. 用自定义注解的方式结合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的能力简述的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  2. TCP/IP协议工作原理简述

    TCP/IP协议工作原理简述 // */ // ]]>   TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...

  3. PHP性能优化简述

    先谢慕课网,这里只做理论简述/** * PHP性能优化 * * 1.问题分析 * PHP语法使用不正确 * PHP不擅长的事 * PHP连接的服务不给力 * PHP自身短板 * 其它原因 * 2.PH ...

  4. Android Animation简述

    Android Animation简述 一.动画(Animation)          Android框架提供了两种动画系统:属性动画(Android3.0)和视图动画.同时使用两种动画是可行的,但 ...

  5. javascript作用域(Scope),简述上下文(context)和作用域的定义

    网页制作Webjx文章简介:这篇文章将正面解决这个问题:简述上下文(context)和作用域的定义,分析可以让我们掌控上下文的两种方法,最后深入一种高效的方案,它能有效解决我所碰到的90%的问题. 作 ...

  6. HDFS 架构简述

    HDFS 架构简述 Hadoop分布式文件系统(HDFS)是一个分布式的文件系统,运行在廉价的硬件上.它与现有的分布式文件系统有很多相似之处.然而与其他的分布式文件系统的差异也是显着的.HDFS是高容 ...

  7. 笔记︱支持向量机SVM在金融风险欺诈中应用简述

    本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 欺诈一般不用什么深入的模型进行拟合,比较看重分析员对业务的了解,从异常 ...

  8. CSS(Cascading Style Sheet)简述

    CSS(Cascading Style Sheet)简述 什么是CSS? css是指层叠样式表 css定义了如何显示HTML元素 css的诞生是为了解决内容与表现分离的问题,可以极大地提高工作效率 样 ...

  9. JAVA EE 第二周(XML简述以及web请求的过程)

    一. 对于XML,我分别从以下几个方面来简述: 1.定义: XML是一种可扩展的标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. (可扩展标记语言:可扩展标记语言是一 ...

随机推荐

  1. css:实现文本两行或多行文本溢出显示省略号

    div{ display: -webkit-box; -webkit-box-orient: vertical; word-break: break-all; word-wrap: break-wor ...

  2. 学会DevOps 能拿多少工资?DevOps 怎么自学?

    落地高薪!DevOps为何受宠? DevOps在近几年的发展势头可谓是迅猛无比,已经有越来越多的企业机构开始尝试落地,从国外的微软谷歌到国内的阿里腾讯,DevOps已经从时髦概念落地最佳实践,进而改变 ...

  3. P.SDA1.DEV - 一个没有服务器的图床

    图床特色 P.SDA1.DEV的愿景是为大家提供一个免费.长期稳定外链分享图片的选择. P.SDA1.DEV的主要特点有: 完全建构在Serverless云服务上,致力于提供(墙外)可用性99.9%的 ...

  4. Java实现简单的增删改查操作

    需求分析:通过数组 ,完成 对学生信息的 管理 (增删改查)创建1个 学生类创建1个 CRUD的类 – 学生管理类 并测试 在这个程序中我只运用了两个类进行操作 package com.hopu.de ...

  5. StringBuffer类和StringBuilder类

    StringBuffer类和StringBuilder类 三者比较 String 不可变字符序列 底层用char[]存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层结构使用ch ...

  6. css的一些小技巧。修改input样式

    在第一次正式写项目的时候,遇到了几个布局的小技巧.记录一下. 我们常常会遇到图片和文字对齐的一种样式.比如 这样的样式,我们写的时候有时候会出现不对齐的情况.我们有俩种方法 一种就是flex的布局,还 ...

  7. js原型、原型链

    之前有说过继承,在js中没有类,所以在new的后面,放的是构造函数,在构造函数中有一个属性prototype,js的继承全靠它. 在js中对象的类型有很多,常见的就是普通对象,和函数对象,在对象中都会 ...

  8. APP自动化 -- 框架

    一.框架源码 https://github.com/jiangnan27/Autotest_APP_Open 二.框架环境 python3 + appium1.15.3 + pytest5.3.5 三 ...

  9. C语言学习笔记一---C语言概述

    一.编程语言与解释语言 1.程序的执行 a.解释:借助一个能试图理解程序的程序,使计算机按要求执行你自己写的程序 b.编译:将所写程序翻译为机器语言写的程序,使计算机按要求执行你自己写的程序 2.两者 ...

  10. 安装phpldapadmin

    关闭防火墙 [root@ldapmaster2 ~]# systemctl disable firewall [root@ldapmaster2 ~]# systemctl stop firewall ...