Bean Scopes trong Spring (Phạm vi đối tượng trong Spring)

Khi xác định một <bean> bạn có tùy chọn khai báo phạm vi cho bean đó.Ở đây tôi đang nói đến Bean Scopes trong spring. Ví dụ: để buộc Spring tạo ra một trường hợp bean mới mỗi khi cần 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 instance mỗi lần cần thiết, bạn nên khai báo thuộc tính scope của bean là Singleton.

Spring Framework hỗ trợ năm phạm vi sau đây, hai trong số đó chỉ khả dụng nếu bạn sử dụng một ứng dụng ApplicationContext.

STT Phạm vi và Mô tả
1 Singleton

Phạm vi này định nghĩa bean cho một thể hiện duy nhất cho mỗi container IoC trong spring (phạm vi này là mặc định).

2 prototype

Phạm vi này có một phạm vi duy nhất một bean được định nghĩa để có bất kỳ số lượng các trường hợp đối tượng.Nghĩa là lúc nào gọi thì đối một đối tượng mới được tạo ra.

3 request

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

4 session

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

5 global-session

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

Trong bài này, chúng ta sẽ thảo luận về hai phạm vi đầu tiên và ba phần còn lại sẽ được thảo luận khi chúng ta tìm hiểu về ứng dụng Web Spring ApplicationContext.


 

STT Phạm vi và Mô tả
1 Singleton

Phạm vi này định nghĩa bean cho một thể hiện duy nhất cho mỗi container IoC mùa xuân (mặc định).

2 Nguyên mẫu

Phạm vi này có một phạm vi duy nhất một bean định nghĩa để có bất kỳ số lượng các trường hợp đối tượng.

3 yêu cầu

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

4 Phiên họp

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

5 Phiên toàn cầu

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

Trong chương này, chúng ta sẽ thảo luận về hai phạm vi đầu tiên và ba phần còn lại sẽ được thảo luận khi chúng ta thảo luận về ứng dụng Web Spring Spring ApplicationContext.

Phạm vi Singleton

Nếu một phạm vi được thiết lập để singleton, container Spring IoC 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 bean đó. Trường hợp duy nhất 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 nó cũng chỉ sử dụng duy nhất một đối tượng do bean đó tạo ra.

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

<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
   <!-- collaborators and configuration for this bean go here -->
</bean>

Ví dụ

Hãy để chúng tôi tạo ra một ví dụ, sử dụng IDE Eclipse và thực hiện các bước sau để tạo một ứng dụng Spring –

Các bước Sự miêu tả
1 Tạo một dự án với tên SpringExample và tạo một gói com.itphutran trong thư mục src.
2 Thêm thư viện Spring yêu cầu sử dụng Add External JARs như đã giải thích trong chương trình Spring Hello World.
3 Tạo các lớp Java HelloWorldMainApp trong gói com.itphutran.
4 Tạo tập tin cấu hình Beans beans.xml trong thư mục src .
5 Bước cuối cùng là tạo nội dung của tất cả các tệp Java và tệp Cấu hình Bean và chạy ứng dụng như bên dưới.

Đây là nội dung của tệp HelloWorld.java

package com.itphutran;

public class HelloWorld {
   private String message;

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

Sau đây là nội dung của tệp MainApp.java

package com.itphutran;

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");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

Sau đây là tệp cấu hình beans.xml được yêu cầu cho phạm vi singleton –

<?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 = "com.itphutran.HelloWorld" scope = "singleton">
   </bean>

</beans>

Một khi bạn đã hoàn tất tạo ra các tập tin cấu hình  và định nghĩa bean, chúng ta hãy chạy ứng dụng. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau:

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

Phạm vi prototype

Nếu phạm vi được đặt thành prototype, Spring container IoC tạo ra một trường hợp bean mới của đối tượng mỗi khi yêu cầu cho bean đó được thực hiện.

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

<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "prototype">
   <!-- collaborators and configuration for this bean go here -->
</bean>

Thí dụ

Chúng ta hãy làm việc với IDE Eclipse và làm theo các bước sau để tạo một ứng dụng Spring –

Các bước Miêu tả
1 Tạo một dự án với tên SpringExample và tạo một gói com.itphutran trong thư mục src.
2 Thêm thư viện Spring yêu cầu sử dụng Add External JARs như đã giải thích trong chương Spring Hello World.
3 Tạo các lớp Java HelloWorldMainApp trong gói com.itphutran.
4 Tạo tập tin cấu hình Beans beans.xml trong thư mục src .
5 Bước cuối cùng là tạo nội dung của tất cả các tệp Java và tệp Cấu hình Bean và chạy ứng dụng như được giải thích bên dưới.

Đây là nội dung của tệp HelloWorld.java

package com.itphutran;

public class HelloWorld {
   private String message;

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

Sau đây là nội dung của tệp MainApp.java

package com.itphutran;

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");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

 

Sau đây là tệp cấu hình beans.xml được yêu cầu cho phạm vi prototype-

<?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 = "com.itphutran.HelloWorld" scope = "prototype">
   </bean>

</beans>

Sau khi hoàn tất, chúng ta chạy ứng dụng:

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

Như vậy các bạn có thể thấy rằng với phạm vi singleton khi gọi sử dụng nó sẽ sử dụng lại đối tượng cũ và lấy các giá trị thuộc tính, phương thức đã khai báo. Tuy nhiên với phạm vi prototype khi gọi một đối tượng sử dụng thì nó sẽ khởi tạo lại một đối tượng mới nên với ví dụ trên các bạn thấy rằng trả về kết quả bằng null.

 

 

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x