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才行





相关文章
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
22天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
39 3
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
215 3
|
6天前
|
并行计算 算法 Java
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
36 23
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
56 4
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
92 2
|
2月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
179 1
|
2月前
|
JSON 自然语言处理 Java
这款轻量级 Java 表达式引擎,真不错!
AviatorScript 是一个高性能、轻量级的脚本语言,基于 JVM(包括 Android 平台)。它支持数字、字符串、正则表达式、布尔值等基本类型,以及所有 Java 运算符。主要特性包括函数式编程、大整数和高精度运算、完整的脚本语法、丰富的内置函数和自定义函数支持。适用于规则判断、公式计算、动态脚本控制等场景。
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
67 0

热门文章

最新文章