guice的能力简述

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;
    }
}

原文地址:https://www.cnblogs.com/simoncook/p/12312757.html

时间: 2024-08-14 03:11:25

guice的能力简述的相关文章

国际软件设计文档——测试分析报告

1 引言 1.1 编写目的 说明这份测试分析报告的具体编写目的,指出预期的阅读范围. 1.2 背景 说明: 被测试软件系统的名称: 该软件的任务提出者.开发者.用户及安装此软件的计算中心,指出测试环境与实际运行环境 之间可能存在的差异以及这些差异对测试结果的影响. 1.3 定义 列出本文件中用到的专问术语的定义和外文首字母组词的原词组. 1.4 参考资料 列出要用到的参考资料,如: a.  本项目的经核准的计划任务书或合同.上级机关的批文: b.  属于本项目的其他已发表的文件: c.  本文件

简述 18.8.18 现有的微信小程序API能力

小程序能力竟恐怖如斯---- // 用于简述API能力 var obj = { 网络: ["发起请求", "上传/下载", "WebSocket"], 媒体: 媒体: { 图片: [ "从本地相册选择图片或使用相机拍照", "预览图片", "获取图片信息,倘若为网络图片,需先配置download域名才能生效", "保存图片到系统相册", // 需要用户授权 ], 录音

Spark 学习: spark 原理简述与 shuffle 过程介绍

Spark学习: 简述总结 Spark 是使用 scala 实现的基于内存计算的大数据开源集群计算环境.提供了 java,scala, python,R 等语言的调用接口. Spark学习 简述总结 引言 1 Hadoop 和 Spark 的关系 Spark 系统架构 1 spark 运行原理 RDD 初识 shuffle 和 stage 性能优化 1 缓存机制和 cache 的意义 2 shuffle 的优化 3 资源参数调优 4 小结 本地搭建 Spark 开发环境 1 Spark-Scal

TCP/IP协议工作原理简述

TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 协议是什么?协议是一组为完成特定需求或功能而定义的标准通讯格式.协议是服务于具体需求或功能的,它不能独立存在. 制定TCP/IP协议的目的是为了解决主机互联以及互联的主机上的应用通讯的问题.TCP/IP协议共有四层:应用层.传输层.网络层.链路层.应用层实际就是我们的应用程序,对于非具体应用而言这一层的协议是未定义的,需要我们自己根据我们具体的业务模型来制定.传输

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

微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF版本更新太快,没人愿意去花时间翻译国外关于EF的书籍.使用Entity Framework开发已经有3年多了,但用得很肤浅,最近想深入学习,只好找来英文书<Entity Framework 6 Recipes>第二版,慢慢啃.首先需要说明的是,我英文不好,只是为了学习EF.把学习的过程写成博客,一

VXLAN 技术解析-(1)VXLAN简述

VXLAN 技术解析-(1)VXLAN简述 VXLAN简述 VXLAN,Virtual Extensible LAN,顾名思义,是VLAN的扩展版本.VXLAN技术主要用来增强在云计算环境下网络的扩展能力. VXLAN使用UDP报文将Ethernet报文封装起来,从而实现跨IP的数据传输,其使用的UDP端口号为4789.VXLAN的端设备称为VTEP,VXLAN tunnel endpoint,一般由物理交换机(Nexus 5600/9000)或虚拟交换机(Open vSwitch/Nexus

(转) 简述生成式对抗网络

简述生成式对抗网络 [转载请注明出处]chenrudan.github.io 本文主要阐述了对生成式对抗网络的理解,首先谈到了什么是对抗样本,以及它与对抗网络的关系,然后解释了对抗网络的每个组成部分,再结合算法流程和代码实现来解释具体是如何实现并执行这个算法的,最后给出一个基于对抗网络改写的去噪网络运行的结果,效果虽然挺差的,但是有些地方还是挺有意思的. 1. 对抗样本 2. 生成式对抗网络GAN 3. 代码解释 4. 运行实例 5. 小结 6. 引用 1. 对抗样本(adversarial e

一种提高单片机i/o口驱动能力的方法

一.简述问题 当你用单片驱动发光二极管的时,你还感觉不到P0.P1口的差别.(10-20mA之间,当中P0驱动能力最强,但对于驱动直流电机依旧非常弱.其结果就是电机不转).那么有什么办法提高驱动能力吗?以下就来介绍本文的一种简单方法. 二.实验元件 NPN三极管:s8050  (管脚序列为:EBC)      元件介绍:http://baike.baidu.com/view/3467208.htm?fr=aladdin 推断方法:平面对着自己.三个管脚朝下,从左到右依次为 (E 发射极).(B基

PHP性能优化简述

先谢慕课网,这里只做理论简述/** * PHP性能优化 * * 1.问题分析 * PHP语法使用不正确 * PHP不擅长的事 * PHP连接的服务不给力 * PHP自身短板 * 其它原因 * 2.PHP项目性能问题占整个项目的性能问题 * PHP性能问题不会超过整个项目性能问题的一般,通常占30%到40%, * 优化整个项目不仅优化PHP性能,整个项目中PHP性能问题只占一部分. * 优化过程: * 1.php语言级的性能优化:快速见到收益 * 2.php周边问题的性能优化:web server