11/08/2018, 19:19

Phạm vi của Bean trong Spring

Spring Framework là gì? Bài này chúng ta sẽ tìm hiểu về phạm vi của bean trong Spring . Khi định nghĩa một bean trong Spring, bạn có các tùy chọn để khai báo phạm vi của bean đó. Ví dụ, bạn muốn Spring tạo ra một bean mới khi cần thiết thì bạn nên khai báo thuộc tính phạm vi của ...

Spring Framework là gì?

Bài này chúng ta sẽ tìm hiểu về phạm vi của bean trong Spring. Khi định nghĩa một bean trong Spring, bạn có các tùy chọn để khai báo phạm vi của bean đó. Ví dụ, bạn muốn Spring tạo ra một bean mới khi cần thiết thì bạn nên khai báo thuộc tính phạm vi của bean là prototype. Tương tự như vậy, nếu bạn muốn Spring trả về cùng một bean (bean duy nhất) khi cần thiết, bạn nên khai báo thuộc tính phạm vi của bean là Singleton.

Spring Framework hỗ trợ năm phạm vi sau, ba trong số đó chỉ khả dụng khi được sử dụng một ứng dụng Spring Web.

No. Phạm vi & Mô tả
1

singleton

Đây là phạm vi mặc định, phạm vi này nói với Spring IoC container rằng chỉ tạo ra một thể hiện duy nhất của bean này trên toàn bộ dứng dụng.
2

prototype

Phạm vi này nói với Spring IoC container rằng tạo ra một thể hiện mới của bean mỗi khi cần thiết.
3

request

Phạm vi này định nghĩa một bean cho một HTTP request. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.
4

session

Phạm vi này định nghĩa một bean cho một HTTP session. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.
5

global-session

Phạm vi này định nghĩa một bean cho một global HTTP session. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.

Trong bài này chúng ta sẽ tìm hiểu về 2 phạm vi singletonprototype, còn request, session và global-session sẽ được tìm hiểu trong các bài học về Spring Web.

Phạm vi Singleton

Nếu phạm vi của bean được thiết lập là singleton, Spring IoC container tạo ra chính xác một thể hiện của đối tượng được xác định bởi định nghĩa của bean đó. Đối tượng này được lưu trữ trong một bộ nhớ cache, và tất cả các yêu cầu tiếp theo mà tham chiếu đến bean đó thì đối tượng lưu trữ được trả về.

Phạm vi mặc định luôn là singleton. Tuy nhiên, bạn có thể thiết lập thuộc tính scope thành singleton trong tệp tin cấu hình bean, như được trình bày trong đoạn mã sau đây.

 
<bean id = "..." class = "..." scope = "singleton">
     
</bean>

Ví dụ về phạm vi Singleton

Tạo một ứng dụng Spring trong Eclipse như trong ví dụ tạo Maven project trong Eclipse.

Tạo package có tên vn.viettuts trong thư mục src.

Add thư viện Spring cần thiết vào project bằng cách thêm các dependency sau vào file pom.xml. Sau đó update project.

 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.6.RELEASE</version>
    <scope>provided</scope>
</dependency>
 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.6.RELEASE</version>
</dependency>
 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.6.RELEASE</version>
</dependency>

Tạo lớp HelloWorld.java

package vn.viettuts;

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Your Message : " + message);
    }
}

Tạo tập tin cấu hình Beans.xml tại thư mục src

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="helloWorld" class="vn.viettuts.HelloWorld" scope="singleton">
    </bean>

</beans>

Tạo lớp MainApp.java

package vn.viettuts;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        
        // tạo đối tượng objA
        HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
        objA.setMessage("I'm object A");
        objA.getMessage();

        // tạo đối tượng objB, objB được tham chiếu đến đối tượng Singleton
        HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
        objB.getMessage();
    }
}

Kết quả:

Your Message : I'm object A
Your Message : I'm object A

Phạm vi Prototype

Nếu phạm vi được thiết lập là prototype, Spring IoC container tạo ra một thể hiện bean mới của đối tượng mỗi khi được yêu cầu.

Để định nghĩa phạm vi prototype, bạn có thể thiết lập thuộc tính scope thành prototype trong tệp tin cấu hình bean, như thể hiện trong đoạn mã sau đây:

 
<bean id = "..." class = "..." scope = "prototype">
     
</bean>

Ví dụ về phạm vi prototype

Tạo ra ứng dụng tương tự như trên, và chỉ cần thay đổi thuộc tính scope của bean helloWorld thành prototype trong tệp tin cấu hình Beans.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="helloWorld" class="vn.viettuts.HelloWorld" scope="prototype">
    </bean>

</beans>

Kết quả:

Your Message : I'm object A
Your Message : null

Kết quả lần sau bằng null cho thấy một thể hiện mới của bean helloWorld được tạo ra.

Spring Framework là gì?
0