3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(上)

简介: 3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(上)

前言


说起依赖注入(DI),相信你首先想到的必然是Spring,Spring是Java技术全家桶,是Java EE开发的一站式解决方案和实际开发标准。但本文并不聊它,而是介绍一款谷歌开源的轻量级依赖注入框架:Guice。


Guice在Java领域并不流行(相较于Spring),但因为它轻量级,所以可以作为你去学习理解DI的一个抓手,适合你去进行独立的分析和理解依赖注入的思想,毕竟程序员经常说的:思想都是相通的。


另外,学习它还有一个重要原因是有些流行框架/库使用了它作为基础DI库,如:Druid、Elastic Search、Play2以及我们熟悉的携程开源的Apollo和Netflix的Eureka。


正文


正所谓谷歌出品,必属精品,况且Guice还出自于它的广告这种多金部门,自然也不例外。Google Guice被大量应用于谷歌内部,然后2010年开源出来。虽然业界反响并不大,但是因为它的轻量级,有些流行的开源框架(如Druid、Apollo、Elastic Search、Play2)把它作为基础的DI组件。


轻量级是什么意思?


轻量级是一个相对概念,它至少应该有如下特征:


  1. 代码少
  2. 易维护
  3. 性能优异


Google Guice就是这么一个框架,它特别强调它的Lightweight特性。


Google Guice


Google Guice作为一个纯粹的DI框架,主要用于减轻你对工厂的需求以及Java代码中对new的使用。通过它来构建你的代码,能减少依赖,从而使得更容易更改以及更容易单元测试和重用。


下面我们就研究它的特性,然后辅以一定的代码示例对它展开基础学习。

公用基础代码


导包:

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-multibindings</artifactId>
    <version>4.1.0</version>
</dependency>


基础代码:


public interface Animal {
    void run();
}
public class Dog implements Animal {
    @Override
    public void run() {
        System.out.println("dog run...");
    }
}
public class Cat implements Animal {
    @Override
    public void run() {
        System.out.println("run run...");
    }
}


DI配置类(模块):


public class MainModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Animal.class).to(Dog.class);
    }
}


测试类:


public class TestGuice {
    @Inject
    private Animal animal;
   官方推荐使用构造器注入,但本类是测试类,为了方便就使用属性注入喽
   当然喽,test类必须有空构造器~~~~这就另说了
  //@Inject
  //public TestGuice(Animal animal){
  //  this.animal = animal;
  //}
    @Test
    public void fun1(){
        Injector injector = Guice.createInjector(new MainModule());
        // 为当前实例注入容器内的对象
        injector.injectMembers(this);
        System.out.println(animal);
        System.out.println(injector.getInstance(Animal.class));
        System.out.println(injector.getInstance(Animal.class));
        animal.run();
    }
}


运行程序,控制台打印:

com.yourbatman.eurekaclient.guice.Dog@6fb0d3ed
com.yourbatman.eurekaclient.guice.Dog@24b1d79b
com.yourbatman.eurekaclient.guice.Dog@68ceda24
dog run...


这便是一个最简单的使用Guice来实现依赖注入的示例,和Spring的ApplicationContext还蛮像的有木有。针对此实例的输出,你应该也意识到此处一个非常非常不一样的不同:默认是多例的(每次get/注入的都是不同的实例)。


如何保证单例?


不同于Spring,它默认是多例的,因此需要我们做一些事情来保证单例。


1、使用@Singleton注解

@Singleton
public class Dog implements Animal { ... }


说明:该注解只能标注在实现类上,不能标注在接口/抽象类上


2、绑定时指定单例

bind(Animal.class).to(Dog.class).in(Singleton.class);


3、绑定一个现存的实例

bind(Animal.class).toInstance(new Dog());


以上三种方式处理后,使用依赖注入或者用API injector.getInstance()得到的均会是同一个实例对象,这就是单例了。


绑定

任何需要依赖注入的资源,只有先实现了绑定才能注入,本处开始介绍它的绑定方式。


  • 类名绑定:把实现类绑定到接口(当然也可以实现类绑到实现类),具体实例交给框架去帮你创建


bind(Animal.class).to(Dog.class);


  • 实例绑定:绑定一个现有实例


bind(Animal.class).toInstance(new Dog())



注意:采用这种绑定,依赖注入时永远是单例(也就是这个实例)

  • 连接绑定:对于已经绑定了的关系,可以无限一直连接下去


bind(Animal.class).to(Dog.class);
bind(Dog.class).toInstance(new Dog(){
    @Override
    public void run() {
        System.out.println("son dog");
        super.run();
    }
});


  • Provider绑定:类似于Spring的@Bean注解,适合完成需要编程逻辑完成的实例
见基础代码,略。


  • 泛型绑定:支持泛型类型的绑定。借助TypeLiteral来完成
bind(new TypeLiteral<List<Animal>>(){}).toInstance(Arrays.asList(new Dog(),new Cat()));
• 1


集合绑定:可在不同的Module内向同一个集合分别去绑定自己所要支持的内容,当然喽也可以在同一个Module内


Multibinder<Animal> multibinder = Multibinder.newSetBinder(binder(), Animal.class);
multibinder.addBinding().toInstance(new Dog());
multibinder.addBinding().toInstance(new Cat());


说明:依赖于扩展包guice-multibindings,需要导入这个jar才行





相关文章
|
12天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
21天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
22天前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
29天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
46 1
Spring 框架:Java 开发者的春天
|
14天前
|
JSON 自然语言处理 Java
这款轻量级 Java 表达式引擎,真不错!
AviatorScript 是一个高性能、轻量级的脚本语言,基于 JVM(包括 Android 平台)。它支持数字、字符串、正则表达式、布尔值等基本类型,以及所有 Java 运算符。主要特性包括函数式编程、大整数和高精度运算、完整的脚本语法、丰富的内置函数和自定义函数支持。适用于规则判断、公式计算、动态脚本控制等场景。
|
28天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
24天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
13 1
|
29天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
29天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
58 5
|
29天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
53 1
下一篇
无影云桌面