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 singleton và prototype, còn request, session và global-session sẽ được tìm hiểu trong các bài học về Spring Web.
Nội dung chính
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.
<!-- Một định nghĩa bean với singleton scope --> <bean id = "..." class = "..." scope = "singleton"> <!-- Cấu hình bean tại đây --> </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.
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.6.RELEASE</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.6.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <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:
<!-- Một định nghĩa bean với singleton scope --> <bean id = "..." class = "..." scope = "prototype"> <!-- Cấu hình bean tại đây --> </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.