GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Design pattern Giới thiệu Google Guice – Dependency injection (DI) framework

Giới thiệu Google Guice – Dependency injection (DI) framework

Đăng vào 04/02/2019 . Được đăng bởi GP Coder . 8028 Lượt xem . Toàn màn hình

Trong bài trước, tôi đã giới thiệu với các bạn Dependency Injection (DI) và cách tự xây dựng 1 framework đảo ngược điều khiển (IoC) để quản lý các dependency. Trong bài này, chúng ta sẽ cùng tìm hiểu về Google Guice – một framework giúp chúng ta dễ dàng quản lý và sử dụng các dependency.

Nội dung

  • 1 Google Guice là gì?
  • 2 Cài đặt Google Guice
  • 3 Ví dụ cơ bản về Dependency Injection với Google Guice
  • 4 Các loại Binding
  • 5 Các loại Injection
  • 6 Scope trong Google Guice

Google Guice là gì?

Google Guice (phát âm là juice), 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. Guice được phát triển và quản lý bởi Google.

Guice tận dụng thế mạnh của Generic và Annotation – các tính năng mới được giới thiệu từ phiên bản java 5, giúp chúng ta dễ dàng quản lý và sử dụng các Dependency.

Trong Guice, Annotaion @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).

Cài đặt Google Guice

Để sử dụng Google Guice, chúng ta cần thêm thư viện Guice vào trong project. Trong bài viết này, tôi sử dụng maven project, chúng ta sẽ thêm thư viện này như sau:


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

Các version khác của Guice, các bạn xem tại link sau: https://mvnrepository.com/artifact/com.google.inject/guice

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 tiêm phụ thuộc (inject) với @Inject.
  • Nói với Guice cách tiêm mô-đun: implement Asbstract Module, bind các interface với các implementation mong muốn.

Chúng ta sẽ viết lại ví dụ ở bài viết Dependency Injection Pattern bằng cách sử dụng thư viện Google Guice.


package com.gpcoder.patterns.creational.googleguice.firstexample;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

// Step 1: Create Interface
interface MessageService {
	void sendMessage(String message);
}

// Step 2: Create Implementation
class EmailService implements MessageService {
	@Override
	public void sendMessage(String message) {
		System.out.println("Email message: " + message);
	}
}

// Step 3: Create Bindings Module
class FirstModule extends AbstractModule {
	@Override
	protected void configure() {
		bind(MessageService.class).to(EmailService.class);
	}
}

// Step 4: Create Class with dependency
class UserController {
    private MessageService messageService;
 
    @Inject
    public UserController(MessageService messageService) {
        this.messageService = messageService;
    }
 
    public void send() {
        messageService.sendMessage("Dependency injection with Google Guice example");
    }
}

// Step 5: Run application
public class GoogleGuiceFirstApplication {

	public static void main(String[] args) {
		// Step 5.1: Create Injector
		Injector injector = Guice.createInjector(new FirstModule());
		
		// Step 5.2: Get Object with dependency fulfilled
		UserController userController = injector.getInstance(UserController.class);
		
		// Step 5.3: Use the object
		userController.send();
	}
}

Output của chương trình:


Email message: Dependency injection with Google Guice example

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:

  • Step 3: chúng ta 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, class MessageService sẽ được inject bởi implement EmailService.
  • Step 4: lớp UserController có dependency với MessageService. 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 EmailService đã được khai báo tại Step 3.
  • Step 5.1: Khởi tạo Guice Injector với config đã tạo ở Step 3.
  • Step 5.2: Lấy thể hiện đối tượng với các dependency để sử dụng.

Các loại Binding

Binding trong Buice là cách chúng ta nói với Guice sẽ tiêm phụ thuộc vào vào một class như thế nào. Để làm được điều này, chúng ta sẽ tạo một class kế thừa từ AbstractModule và override phương thức configure(). Trong phương thức này chúng ta gọi phương thức bind() để xác định mỗi binding của một type ứng với một implement cụ thể. Sau khi đã binding các type trong Module, chúng ta sẽ sử dụng phương thức Guice.createInjector(module) để build một injector.


public class BasicModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Type.class).to(TypeImpl.class);
    }
}

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

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

  • Linked Bindings : ánh xạ một type với một implementation cụ thể của nó.
  • Binding Annotations : Trong trường hợp, chúng ta muốn map một Type với nhiều implementation. Chúng ta có tạo một custom Annotation để sử dụng.
  • @Named Binding : một cách khác để map binding mà không cần tạo custom annotation là sử dụng @Named annotation.
  • Constant Bindings : ngoài cách binding với các class/ interface, Guice còn cung cấp một cách để tạo binding với một giá trị của một object hay constant.
  • @Provides Annotation : khi cần khởi tạo một binding value phức tạp.
  • Provider Class : có nhiều @Provide method được định nghĩa trong một module, làm cho class này quá phức tạp, chúng ta có thể move nó sang một class độc lập và implement một Provider interface.
  • Constructor Bindings : khi một class có nhiều constructor, chúng ta có thể tạo binding với constructor cụ thể của object thông qua phương thức toConstructor().
  • In-built Bindings : binding được xây dựng sẵn bên trong Guice, chúng ta chỉ việc gọi @Inject và sử dụng.
  • Just-in-time Bindings : các binding được định nghĩa trong Module, Guice sử dụng chúng bất cứ khi nào cần tiêm phụ thuộc (inject). Trong trường hợp các binding không tồn tại, nó có thể cố gắng tạo ra các binding chỉ khi cần thiết (JIT – just-in-time).

Các loại Injection

Dependency Injection Pattern tách hành vi khỏi các phụ thuộc (dependency). Thay vì tìm kiếm các phụ thuộc trực tiếp hoặc từ các factory, mẫu này khuyến nghị rằng các phụ thuộc được truyền vào từ bên ngoài. Quá trình thiết lập các phụ thuộc từ bên ngoài vào một đối tượng được gọi là tiêm (injection).

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

  • Constructor Injection : đối tượng được inject thông qua constructor.
  • Method Injection : đối tượng được inject thông qua method.
  • Field Injection : đối tượng được inject thông qua field.
  • Optional Injection : đối tượng được inject được truyền từ bên ngoài thông qua constructor, method, field hoặc sử dụng một giá trị mặc định.
  • On-demand Injection : các method hoặc field có thể được khởi tạo bằng cách sử dụng một instance đã tồn tại thông qua phương thức injector.injectMembers().
  • Static Injection : đối tượng được inject thông qua static field, loại injection này thích hợp khi migrate ứng dụng sử dụng static factory sang Guice.
  • Injecting Provider : thông thường mỗi loại (type) sẽ nhận được chính xác một thể hiện của từng loại phụ thuộc. Đôi khi chúng ta muốn có nhiều hơn một instance của type phụ thuộc. Guice cúng cấp một Provider với phương thức get(). Một instance mới được tạo ra khi phương thức get() được gọi.

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.

Trong các bài viết tiếp theo chúng ta sẽ cùng tìm hiểu chi tiết hơn về Google Guice với các các loại Binding, Injection, Scope, AOP, …

Tài liệu tham khảo:

  • https://github.com/google/guice
  • https://www.tutorialspoint.com/guice/index.htm
  • https://www.baeldung.com/guice
5.0
04
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Creational Pattern, Design pattern, Java library Được gắn thẻ: Creational Design Pattern, Dependency Injection, Design pattern, Google Guice

Thực thi nhiều tác vụ cùng lúc như thế nào trong Java?
Giới thiệu Google Guice – Binding

Có thể bạn muốn xem:

  • Hướng dẫn Java Design Pattern – Iterator (17/12/2018)
  • Hướng dẫn Java Design Pattern – Decorator (08/11/2018)
  • Giới thiệu Java Logging (18/04/2019)
  • Hướng dẫn Java Design Pattern – Interpreter (10/12/2018)
  • Hướng dẫn Java Design Pattern – Service Locator (21/01/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (97436 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97121 lượt xem)
  • Giới thiệu Design Patterns (86805 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (85605 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83150 lượt xem)

Nội dung bài viết

  • 1 Google Guice là gì?
  • 2 Cài đặt Google Guice
  • 3 Ví dụ cơ bản về Dependency Injection với Google Guice
  • 4 Các loại Binding
  • 5 Các loại Injection
  • 6 Scope trong Google Guice

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link