Spring – Bean Scopes
NỘI DUNG BÀI VIẾT
Khi định nghĩa một bean bạn tùy chọn khai báo phạm vi của bean đó. Ví dụ, để Spring tạo ra 1 bean mới mỗi khi cần thiết thì bạn nên khai báo thuộc tính phạm vi bean là prototype. Tương tự, nếu bạn muốn Spring trả về cùng một bean, bạn nên khai báo thuộc tính phạm vi của bean là signleton. Spring Framework hỗ trợ năm phạm vi sau, ba trong số đó chỉ khả dụng nếu bạn sử dụng ApplicationContext.
STT | Phạm vi và mô tả |
---|---|
1 | singleton Phạm vi này định nghãi bean thành một thể hiện duy nhất cho mỗi vùng chứa Spring Ioc(mặc định). |
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 bean cho 1 HTTP session. Chỉ hợp lệ trong ngữ cảnh của Spring ApplicationContext. |
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 ApplicationContext. |
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.
<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
Code language: HTML, XML (xml)
Ví dụ:
HelloWorld.java
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
Code language: JavaScript (javascript)
MainApp.java
package com.tutorialspoint;
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();
}
}
Code language: JavaScript (javascript)
Beans.xml
<?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.tutorialspoint.HelloWorld" scope = "singleton">
</bean>
</beans>
Code language: HTML, XML (xml)
Kết quả:
Your Message : I'm object A
Your Message : I'm object A
Code language: PHP (php)
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:
<!-- A bean definition with prototype scope -->
<bean id = "..." class = "..." scope = "prototype">
<!-- collaborators and configuration for this bean go here -->
</bean>
Code language: HTML, XML (xml)
HelloWorld.java
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
Code language: JavaScript (javascript)
MainApp.java
package com.tutorialspoint;
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();
}
}
Code language: JavaScript (javascript)
Beans.xml
<?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.tutorialspoint.HelloWorld" scope = "prototype">
</bean>
</beans>
Code language: HTML, XML (xml)
Kết quả:
Your Message : I'm object A
Your Message : null
Nguồn:
https://www.tutorialspoint.com/spring/spring_bean_scopes.htm
Leave a Reply