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 HelloWorld và MainApp 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 HelloWorld và MainApp 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.