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





相关文章
|
1天前
|
Java API 数据安全/隐私保护
【亮剑】如何使用Java整合Spring框架来发送邮件?
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
7天前
|
存储 Java 索引
深入探讨Java集合框架
深入探讨Java集合框架
深入探讨Java集合框架
|
7天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
7天前
|
负载均衡 Java 数据库连接
Java从入门到精通:4.2.2学习新技术与框架——不断扩展自己的知识面,跟上技术的发展趋势
Java从入门到精通:4.2.2学习新技术与框架——不断扩展自己的知识面,跟上技术的发展趋势
|
7天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
7天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
7天前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
7天前
|
开发框架 前端开发 安全
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
|
7天前
|
存储 设计模式 算法
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
|
8天前
|
存储 设计模式 算法
Java集合框架详解
Java集合框架详解
16 0