javascript
Spring Bean范围
介紹:
Spring核心容器實(shí)例化bean并管理其生命周期。 在定義bean時(shí),我們可以提供其范圍。 除非明確提供,否則單例是Spring容器中Bean的默認(rèn)范圍。
Spring提供了五種類型的bean作用域。 在本教程中,我們將探討它們中的每一個(gè)。
1.
單例作用域可確保每個(gè)Spring IoC容器僅存在該bean的一個(gè)實(shí)例。 該單個(gè)Bean實(shí)例存儲(chǔ)在所有單個(gè)Bean的緩存中,并為每個(gè)后續(xù)請(qǐng)求返回對(duì)此緩存對(duì)象的引用。
眾所周知,默認(rèn)情況下,所有Spring bean都是單例的。
假設(shè)我們有一個(gè)Student bean:
@Component public class Student {private int id;private String name;//constructor, getters, setters}默認(rèn)情況下, Student類將是單例 bean。 讓我們嘗試將其加載到我們的main()方法中:
public class App {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");Student student1 = (Student) context.getBean("student");student1.setName("John");System.out.println(student1.getName()); //Prints 'John'Student student2 = (Student) context.getBean("student");System.out.println(student2.getName()); //Prints 'John'} }顯然,已經(jīng)為第二次調(diào)用返回了Student Bean的現(xiàn)有實(shí)例。 換句話說, student1和student2引用都指向同一對(duì)象。
2.
對(duì)于基于原型的 bean, 將 在我們的應(yīng)用程序代碼中為該特定bean的每個(gè)請(qǐng)求創(chuàng)建 一個(gè)新實(shí)例 。
我們可以使用@Scope批注將bean的范圍配置為原型 :
@Component @Scope("prototype") public class Student {... }或使用基于XML的配置時(shí),我們將:
<bean id = "student" class="org.programmergirl.domain.Student"scope="prototype"> </bean>現(xiàn)在,讓我們看看在main()方法中會(huì)發(fā)生什么:
public class App {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");Student student1 = (Student) context.getBean("student");student1.setName("John");System.out.println(student1.getName()); //Prints 'John'Student student2 = (Student) context.getBean("student");System.out.println(student2.getName()); //Prints null} }這里, student2引用Student類的新實(shí)例,其名稱屬性為null 。
注意, 我們應(yīng)該始終對(duì)有狀態(tài)bean使用原型作用域,對(duì)無狀態(tài)bean使用單例作用域。
3.
使用請(qǐng)求范圍時(shí), 將為每個(gè)HTTP請(qǐng)求創(chuàng)建一個(gè)新實(shí)例。 HTTP請(qǐng)求完成時(shí),該bean實(shí)例被銷毀。
我們可以使用注釋配置請(qǐng)求范圍:
@Component @Scope("request") public class Student {... }//Or@Component @RequestScope public class Student {... }或通過XML配置:
<bean id = "student" class="org.programmergirl.domain.Student"scope="request"> </bean>4.
對(duì)于會(huì)話范圍,Spring容器為每個(gè)HTTP會(huì)話創(chuàng)建一個(gè)新的bean實(shí)例。 HTTP會(huì)話中的所有HTTP請(qǐng)求將共享相同的bean實(shí)例。
要配置會(huì)話范圍的Bean,我們將使用:
@Component @Scope("session") public class Student {... }//Or@Component @SessionScope public class Student {... }對(duì)于基于xml的配置,我們將有:
<bean id = "student" class="org.programmergirl.domain.Student"scope="session"> </bean>當(dāng)HTTP會(huì)話關(guān)閉時(shí),容器將銷毀會(huì)話范圍的Bean實(shí)例。
5.
通過應(yīng)用程序范圍,一個(gè)可感知Web的容器會(huì)根據(jù)ServletContext創(chuàng)建一個(gè)bean實(shí)例。 請(qǐng)注意, 應(yīng)用程序范圍不同于單例范圍:
- 我們可以在獨(dú)立應(yīng)用程序中使用單例作用域。 該應(yīng)用程序范圍僅對(duì)基于Web的Spring容器/應(yīng)用程序有效
- 對(duì)于單例作用域,每個(gè)應(yīng)用程序上下文存在一個(gè)實(shí)例。 另一方面, 應(yīng)用程序范圍的Bean對(duì)于整個(gè)ServletContext具有單個(gè)實(shí)例。 我們可能有多個(gè)應(yīng)用程序共享同一個(gè)ServletContext
讓我們將Student bean配置為應(yīng)用程序范圍的bean:
@Component @Scope("application") public class Student {... }//Or@Component @ApplicationScope public class Student {... }基于xml的定義如下所示:
<bean id = "student" class="org.programmergirl.domain.Student"scope="application"> </bean>結(jié)論:
在本教程中,我們探索了各種Spring bean范圍。
請(qǐng)注意, 請(qǐng)求,會(huì)話和應(yīng)用程序 bean范圍僅對(duì)可感知網(wǎng)絡(luò)的Spring ApplicationContext有效 。
翻譯自: https://www.javacodegeeks.com/2019/06/spring-bean-scopes.html
總結(jié)
以上是生活随笔為你收集整理的Spring Bean范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众汽车贝瑞德:合肥电动汽车工厂即将投产
- 下一篇: jooq中record_在Spring中