Dependency Injection (DI) framework – Google Guice

Trong bài trước, chúng ta đã được đi tìm hiểu Dependency Injection là gì. Tiếp tục chuỗi thông não, chúng ta cùng nhau làm tý “inova” với cái thằng Google Guice này nhé.

1. Google Guice là gì?

Google Guice là một framework DI gọn nhẹ, mã nguồn mở giúp chúng ta phát triển các ứng dụng dạng module được phát triển và quản lý bởi Google. Guice hỗ trợ từ Java 6 trở lên nhé anh em.

Trong Guice, annotation @Inject được sử dụng để tiêm phụ thuộc. Nó cho phép chúng ta inject sự phụ thuộc tại các constructor, field hoặc method. Sử dụng Guice, chúng ta có thể xác định scope của instance đối tượng phụ thuộc. Nó cũng có các tính năng để tích hợp với Spring và Aspect Oriented Programming (AOP).

2. Cài đặt Google Guice

Để sử dụng Google Guice, anh em thêm thư viện Guice vào trong file pom.xml như sau:

Java
<!-- https://mvnrepository.com/artifact/com.google.inject/guice -->
<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.2.2</version>
</dependency>

Hoặc muốn sử dụng các version khác thì anh em có thể truy cập vào 👉 đây 👈. Cứ version nào nhiều người sử dụng mà “phang” thôi =))).

3. Ví dụ cơ bản về Dependency Injection với Google Guice

Để sử dụng Guice cần nhớ 2 thông tin quan trọng sau:

  • Nói với Guice cái gì cần được inject với annotation @Inject.
  • Nói với Guice cách inject mô-đun: implement Asbstract Module, bind các interface với các implementation mong muốn.

Quay trở lại với ví dụ em gái Eimi Fukada trong bài trước lần này tôi sẽ sử dụng Guice nha:

GuiceModule.java

Java
package org.blogtms;

import com.google.inject.AbstractModule;

public class GuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Outfit.class).to(Bikini.class);
        bind(Accessories.class).to(GucciAccessories.class);
        bind(HairStyle.class).to(KoreanHairStyle.class);
    }
}

Girl.java thêm @Inject

Java
package org.blogtms;

import com.google.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//@Component
public class Girl {

    @Autowired
    Outfit outfit;

    @Autowired
    Accessories accessories;

    @Autowired
    HairStyle hairStyle;

    @Inject
    public Girl(Outfit outfit, Accessories accessories, HairStyle hairStyle) {
        this.outfit = outfit;
        this.accessories = accessories;
        this.hairStyle = hairStyle;
    }
}

Main.java

Java
package org.blogtms;

import com.google.inject.Guice;
import com.google.inject.Injector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

//@SpringBootApplication
public class Main {
    public static void main(String[] args) {
//        ApplicationContext context = SpringApplication.run(Main.class, args);
//
//        Girl girl = context.getBean(Girl.class);

        Injector injector = Guice.createInjector(new GuiceModule());

        Girl girl = injector.getInstance(Girl.class);
    }
}

Thế là xong rồi =)))

Trong ví dụ trên, chúng ta thấy một số phần thay đổi so với ví dụ ở bài trước:

  • Tạo một class extends từ AbstractModule, lớp này được sử dụng để định nghĩa cách mà một class/ interface sẽ được inject bởi một implement cụ thể nào. Trong ví dụ này, Outfit sẽ được inject bởi implement Bikini.
  • Lớp Girl có dependency với Outfit. Trong ví dụ này, chúng ta sử dụng @Inject tại hàm xây dựng (constructor) để inject đối tượng Outfit.
  • Khởi tạo Guice Injector với config.
  • Lấy thể hiện đối tượng với các dependency để sử dụng.

4. Scope trong Google Guice

Theo mặc định, Guice trả về một instance mới mỗi lần nó cần cung cấp một giá trị. Hành vi này có thể cấu hình thông qua phạm vi (scope). Scope cho phép chúng ta tái sử dụng instance.

Các loại Scope được hỗ trợ bởi Google Guice:

  • @Singleton : một instance duy nhất được sử dụng trong toàn bộ ứng dụng.
  • @SessionScoped : mỗi session sẽ có một instance khác nhau.
  • @RequestScoped : mỗi request sẽ có một instance khác nhau.

Trên đây là giới thiệu cơ bản về Google Guice. Nó cung cấp một cách tiếp cận mới cho Dependency Injection, tận dụng thế mạnh của Annotation và Generic để giúp chúng ta dễ dàng hơn trong việc quản lý và sử dụng các Dependency, cũng như dễ dàng phát triển các ứng dụng dạng module.

Tài liệu tham khảo:

Cảm ơn anh em đã theo dõi bài viết 🙋‍♂️. Vẫn như mọi khi, đây là source code

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like