[Series] Spring Core - Keep It Simple (P2): Tổng quan về Bean
spring
65
spring core
49
Java
155
White

Nguyễn Tuấn Anh viết ngày 11/04/2019

Như chúng ta đã biết, bean là các đối tượng tạo nên xương sống của ứng dụng và được quản lý bởi Spring IoC Container. Trong phần 2 của series, mình sẽ đề cập đến

  • Cách định nghĩa một bean
  • Các bean scope
  • Lifecycle callbacks
  • Bean lazy initialization

1. Định nghĩa bean

Trọng tâm của cách cấu hình bằng Java code là 2 annotation:

  1. org.springframework.context.annotation.Bean: annotation mức phương thức
  2. org.springframework.context.annotation.Configuration: annotation mức lớp

Annotation @Bean được dùng để chỉ định một phương thức sẽ khởi tạo một bean (hay nói cách khác là trả về một instance của bean). Mặc định tên của bean trùng với tên của phương thức này. Chúng ta cũng có thể chỉ định tên của bean thông qua thuộc tính name của @Bean.

Các phương thức được đánh dấu bởi annotation @Bean phải được dùng bên trong một lớp được đánh dấu bởi annotation @Component hoặc @Configuration, nhưng thường là @Configuration.

Dưới đây là ví dụ về định nghĩa một bean với @Bean@Configuration.

Bước 1:

Đầu tiên, chúng ta cần import dependency spring-context:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.2.RELEASE</version>
</dependency>

Bước 2:

Tạo lớp FooService. Đây chính là lớp bean của chúng ta.

FooService.java

package org.ashina.tutorial.spring;

public class FooService {

    public void doStuff() {
        System.out.println("This is foo bean");
    }

}

Bước 3:

Tạo lớp AppConfig với annotation @Configuration. Trong lớp AppConfig, chúng ta xây dựng phương thức fooService() để khởi tạo một bean có tên là fooService:

AppConfig.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public FooService fooService() {
        return new FooService();
    }

}

Bước 4

Khởi tạo Spring IoC Container thông qua interface ApplicationContext với implementation là AnnotationConfigApplicationContext. Khi Spring IoC Container được khởi tạo, các bean cũng sẽ được khởi tạo theo.

Chúng ta sẽ lấy ra được các bean thông qua phương thức getBean(Bean.class) của ApplicationContext.

Main.java

package org.ashina.tutorial.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
        FooService fooService = ctx.getBean(FooService.class);
        fooService.doStuff();
        ctx.close();
    }

}

Chú ý: Chúng ta hoàn toàn có thể cho FooService implement một interface. Khi đó, phương thức fooService() có thể trả về interface này.


2. Bean scopes

Bean scope được hiểu là phạm vi hoạt động của các instance của bean.

Có tất cả 6 loại bean scope:

  1. singleton
  2. prototype
  3. request
  4. session
  5. application
  6. websocket

Trong đó, 4 scope là request, session, applicationwebsocket chỉ hoạt động bên trong ngữ cảnh của các ApplicationContext implementation cho ứng dụng web như XmlWebApplicationContext hay AnnotationConfigWebApplicationContext.

Để khai báo bean scope, chúng ta thường sử dụng annotation org.springframework.context.annotation.Scope với 2 thuộc tính:

  • value: tên của scope
  • proxyMode=ScopedProxyMode.TARGET_CLASS: được dùng để tạo AOP proxy của bean. Chúng ta khai báo giá trị này khi muốn inject một bean có scope request, session, application vào một bean có scope singleton, prototype. Hoặc inject một bean có scope prototype vào bean có scope singleton.

2.1. Singleton scope

Đây là bean scope mặc định của Spring Framework.

Một bean chỉ có một duy nhất một instance trong một Spring IoC Container. Spring IoC container khởi tạo instance của singleton bean tại thời điểm startup của ứng dụng. Sau đó, lưu trữ instance của bean vào một bộ nhớ cache. Với mỗi request, Spring IoC container sẽ trả về instance được lấy từ bộ nhớ cache này.

2.2. Prototype scope

Với mỗi request, Spring IoC Container khởi tạo một instance mới của bean.

@Bean
@Scope(value = "prototype")
public FooService fooService() {
    return new FooService();
}

2.3. Request scope

Với mỗi HTTP requet, Spring IoC container khởi tạo một instance mới của bean. Instance này sẽ hoạt động trong suốt vòng đời của HTTP request.

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class LoginAction {
}

Kể từ phiên bản Spring 4.3, chúng ta có thể đơn giản hóa cách khai báo trên như sau:

@Component
@RequestScope
public class LoginAction {
}

Chú ý: Chúng ta sẽ tìm hiểu về @Component trong các phần sau nhé.

2.4. Session scope

Với mỗi HTTP session, Spring IoC container khởi tạo một instance mới của bean. Instance này sẽ hoạt động trong suốt vòng đời của HTTP session.

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Cart {
}

hoặc đơn giản hơn:

@Component
@SessionScope
public class Cart {
}

2.5. Application scope

Instance của bean sẽ hoạt động trong suốt vòng đời của một ứng dụng web (thực chất là vòng đời của một ServletContext).

@Component
@Scope(value = "application", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class AppSettings {
}

hoặc đơn giản hơn:

@Component
@ApplicationScope
public class AppSettings {
}

2.6. Websocket scope

Instance của bean sẽ hoạt động trong suốt vòng đời của một WebSocket.


Tài liệu tham khảo

  1. https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-java-bean-annotation
  2. https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-scopes
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Tuấn Anh

24 bài viết.
151 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
45 41
MyContact là một ứng dụng mà mình thường viết mỗi khi học một ngôn ngữ hay công nghệ mới. MyContact chỉ là một ứng dụng CRUD đơn giản, cho phép ngư...
Nguyễn Tuấn Anh viết hơn 2 năm trước
45 41
White
27 14
Hướng dẫn lập trình Spring Security Trong bài viết lần này, mình sẽ giúp các bạn bước đầu tìm hiểu (Link) thông qua xây dựng các chức năng: Đăng ...
Nguyễn Tuấn Anh viết hơn 2 năm trước
27 14
White
15 1
Giới thiệu Spring Framework Trong bài viết này, mình sẽ giới thiệu cho các bạn về một trong những Java EE framework rất nổi bật và phổ biến hiện n...
Nguyễn Tuấn Anh viết hơn 2 năm trước
15 1
Bài viết liên quan
White
2 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 7 tháng trước
2 0
White
0 0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...
https://loda.me viết 3 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
151 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!