spring配置详解-scope属性
生活随笔
收集整理的這篇文章主要介紹了
spring配置详解-scope属性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- 創建方式1:空參構造方法 --><bean name="user" class="com.learn.bean.User" scope="singleton"></bean><!-- 創建方式2:靜態工廠創建 調用UserFactory的createUser方法創建名為user2的對象,放入容器--><!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> --><!-- 創建方式2:實例工廠創建 --><!-- <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> --><!-- <bean name="userFactory" class="com.learn.b_create.UserFactory"></bean> --></beans>
package com.learn.a_hello;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.bean.User;public class Demo {/*** 創建方式1:空參構造*/@Testpublic void fun1() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user");User u2 = (User)ac.getBean("user");User u3 = (User)ac.getBean("user");User u4 = (User)ac.getBean("user");System.out.println(u2==u4);/*** 打印user對象*/
// System.out.println(u);}/*** 創建方式2:靜態工廠*/@Testpublic void fun2() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user2");/*** 打印user對象*/System.out.println(u);}/*** 創建方式2:動態工廠*/@Testpublic void fun3() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user3");/*** 打印user對象*/System.out.println(u);}
}
User空參構造方法
true
scope屬性首先從位置上來講,它是在咱們的bean元素上加的,scope屬性,然后咱們來解釋這個scope屬性,他分別都有什么,代表什么意思,scope取值一般是四種,分別是什么呢,singleton,然后是prototype,還有叫request,還有叫session,常起的就是這四種,然后其中下面這兩種,標成綠色,了解,這兩種標成紅色,一個一個來看,singleton這什么意思,首先是一個默認值,首先你要知道他是默認值,現在咱們沒有用scope屬性,那就意味著,取值就是sigleton,就像他名字描述的一樣,單例的,單例對象,所謂單例對象,就是咱們這個對象在容器中,只會被創建一份,一個實例,被標識為單例的對象,在Spring容器中,只會存在一個實例,那其實就是在剛才這里,我把scope等于singleton給他顯示的配上,那我們在這個demo里邊,就拿構造來看就行了,看得到我這是啥意思不,我這里是不是獲得四次這個對象,但是因為它配置是singleton,返回的都是同一個對象,所以直接打印u2==u4,返回應該是true,執行一下就可以看到打印結果,是不是true,所以這就是所謂的單例,我把這個方法復制一份,單例,scope為singleton,這樣的話通過這例子就可以看出來,singleton的特點,再看第二個取值,prototype,prototype其實翻譯過來的話,是多例的,多例原型,這啥意思呢,被標識為多例的對象,每次再獲得時,才會創建,不會像單例在容器時就創建了,每次獲得時才會創建,并且每次創建,都是新的對象,那接下里可以掩飾一下,把scope改成prototype,然后demo里這個方法可以繼續用,剛才打印是true,如果多例的話,打印是什么,打印情況,單例是true,多例就是false,你會看到一堆構造打印了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "><!-- 創建方式1:空參構造方法 --><bean name="user" class="com.learn.bean.User" scope="prototype"></bean><!-- 創建方式2:靜態工廠創建 調用UserFactory的createUser方法創建名為user2的對象,放入容器--><!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> --><!-- 創建方式2:實例工廠創建 --><!-- <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> --><!-- <bean name="userFactory" class="com.learn.b_create.UserFactory"></bean> --></beans>
/*** scope:single單例* scope:prototype多例*/@Testpublic void fun4() {/*** 1.創建容器*/ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");/*** 2.向容器要"user"對象*/User u = (User)ac.getBean("user");User u2 = (User)ac.getBean("user");User u3 = (User)ac.getBean("user");User u4 = (User)ac.getBean("user");/*** 單例:true* 多例:false*/System.out.println(u2==u4);/*** 打印user對象*/
// System.out.println(u);}
User空參構造方法
User空參構造方法
User空參構造方法
User空參構造方法
false
這四個構造方法都打印出來了,多例的每次獲得都會創建,然后再看這個取值,這個返回值,就是false,所以這兩個對象不是同一個對象,這就是多例的,那這兩個是scope屬性將來要使用的重點,下面用不著的解釋一下,request指的是啥呢,web環境下,對象與request生命周期一致,也就是每次請求過后,而session的話,只有在web環境下才會有效,咱們創建被標識的對象,與誰生命周期一致呢,session生命周期一致,咱們即使在WEB環境下也不會用這兩個scope的,記住這兩個沒用,你說上面的singleton和prototype,就是這兩個取值,什么情況下,咱們用singleton,在什么情況下使用prototype,在未來開發中,絕大多數,scope屬性的取值,全都使用默認值,就可以,但是切記,等到與struts框架整合的時候,Spring與Struts整合的時候,咱們說Action對象,交給Spring來負責管理,知道啥意思不,struts要去訪問或者調用action的時候,都會找Spring要,那這個時候切記,Action要配置成單例還是多例,多例,為啥,Struts2從架構設計上來說,強調過,是每次請求都會,都會創建一個新的Action,所以,咱們Action這個Bean在使用的時候,必須聲明為多例的,那如果是單例的那就完了,同時有10個請求過來,struts找Spring要Action,結果Spring給了10個請求同一個Action,那你想他就改變了Struts的設計了,那問題就多了,所以prototype,將來要用的話,記住,在整合struts2時,咱們的ActionBean必須配置為多例的,其他絕大多數,像DAO,Service,全都是單例的,單例就可以,在整個容器當中,只有一個對象就夠了,這就是scope屬性
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的spring配置详解-scope属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring配置详解-三种对象创建方式_
- 下一篇: spring配置详解-初始化销毁方法