spring bean作用域_Srping中Bean的三种装配方式:大魏Java记10
一、Bean的作用域
Spring在初始化一個(gè)Bean實(shí)例時(shí),可以同時(shí)為其指定特定的作用域。作用域?qū)?huì)對(duì)Bean的生命周期和創(chuàng)建方式產(chǎn)生影響。
Bean的作用域類型:
Singleton作用域是Spring容器默認(rèn)的作用域,當(dāng)一個(gè)Bean的作用域?yàn)镾ingleton時(shí),Spring容器中只會(huì)存在一個(gè)共享的Bean實(shí)例。并且對(duì)于所有的Bean請(qǐng)求,只要id與該bean定義的ID屬性值相匹配,就會(huì)返回bean的同一個(gè)實(shí)例。單例模式對(duì)于無會(huì)話狀態(tài)的Bean,如Dao、Service,是理想的選擇。
spring默認(rèn)就是Singleton模式。
我們查看Spring的配置文件,里面定義了bean id和對(duì)應(yīng)的class實(shí)現(xiàn)類,同時(shí)指定了scope。
接下來在包中創(chuàng)建一個(gè)名為Hello的類,里面不寫任何方法(默認(rèn)會(huì)創(chuàng)建一個(gè)無參構(gòu)造函數(shù))。
接下來寫一個(gè)測試類,里面兩次獲取bean對(duì)象并打印,如下所示:
運(yùn)行測試類,查看輸出結(jié)果,得到的對(duì)象名稱相同,說明Spring容器只創(chuàng)建一個(gè)Hello類的實(shí)例。其實(shí),不寫scope=singleton,默認(rèn)也只創(chuàng)建一個(gè)實(shí)例,這是Spring的默認(rèn)配置。
對(duì)于想保持會(huì)話狀態(tài)的bean,應(yīng)該使用prototype作用域。在這種模式下,Spring會(huì)為每個(gè)對(duì)該Bean的請(qǐng)求都創(chuàng)建一個(gè)實(shí)例。
我們將上面實(shí)例中的scope修改成prototype,再看輸出,會(huì)發(fā)現(xiàn)兩次打印的不同,說明創(chuàng)建了兩個(gè)不同的Bean實(shí)例。
二、Bean的生命周期
Sping對(duì)singleton和prototype的生命周期管理是不一樣的。
對(duì)singleton作用域下的bean生命周期,進(jìn)行全生命周期管理。
對(duì)于prototype作用域下的bean生命周期管理,只負(fù)責(zé)創(chuàng)建。創(chuàng)建后,Spring容器將不再跟蹤其生命周期。
Bean的生命周期管理如下所示:
上圖一共展現(xiàn)了12步,解釋如下所示:
三、Bean的裝配方式(依賴注入方式)
Bean的裝配方式有三種:
1.基于XML的裝配
2.基于Annotation方式
3.自動(dòng)裝配
1.基于XML的裝配
在XML的裝配模式下,又分為:
1.1 設(shè)值注入(Setter Injection),Bean必須滿足:
Bean類必須提供一個(gè)默認(rèn)的構(gòu)造方法
Bean類必須為需要注入的屬性提供對(duì)應(yīng)的setter方法。
1.2 構(gòu)造注入(Constructor Injection)
在Spring的配置文件中,使用元素的子元素元素為每個(gè)屬性注入值。
在真實(shí)的使用中,1.1和1.2往往結(jié)合使用。
為了方便理解,我們看一段代碼。
如下圖所示,我們創(chuàng)建了一個(gè)User類,里面包含了Username和Password的設(shè)置值和獲取值的方法:?
下圖中,定義了一個(gè)有參構(gòu)造方法,傳入的參數(shù)是username和password。
下圖中@Override后面的代碼,作用是當(dāng)測試類調(diào)用User類時(shí),打印username和password的內(nèi)容:
接下來,我們?cè)倏匆幌耂pring的配置文件:bean5.xml。我們看到包含兩部分內(nèi)容:
第一部分是通過構(gòu)造方式裝配user實(shí)例,同時(shí)進(jìn)行了賦值,bean id是user1
第二部分是使用Set方式裝配user實(shí)例,這段也進(jìn)行了賦值,但我們看到和第一部分內(nèi)容不同,bean id是user2:
書寫一個(gè)測試類。我們看到測試類先通過應(yīng)用上下文加載xml文件,然后獲取user1和user2的實(shí)例,并進(jìn)行打印:
2.基于Annotation的裝配
Spring可以使用XML實(shí)現(xiàn)Bean的裝配工作,但如果bean太多,XML文件就會(huì)比較臃腫。JDK1.5開始,提供了annotation功能,Spring也全面支持。常見的注解如下:
接下來我們看代碼:
首先創(chuàng)建一個(gè)接口,名為UserDao
接下來創(chuàng)建一個(gè)接口實(shí)現(xiàn)類,名為UserDaoImpl。
我們看到上圖中第三行有@Repositiory(“userDao”),這是將UserDaoImpl這個(gè)類標(biāo)示為Spring中的Bean,這行代碼的作用,相當(dāng)于在XML中這樣寫:
接下來,創(chuàng)建一個(gè)名為UserService的接口:
接下來,創(chuàng)建UserService的接口的實(shí)現(xiàn)類:UserServiceImpl。
下圖中第4行相當(dāng)于XML中:
<bean id="userService" class="cn.itcast.annotation.UserServiceImpl"/>
下圖中第6行相當(dāng)于配置文件中:
。
類的最后,調(diào)用了userDao中的save()方法。
接下來,創(chuàng)建UserAction類。
下圖第四行使用@Controler注解標(biāo)注UserAction類相當(dāng)于XML中:
serAction" class="cn.itcast.annotation.UserAction"/
下圖第六行相當(dāng)于:
userService"/>。
【ref的作用是:property、contructor-arg等元素的子元素,該元素中的bean屬性用于指定Bean工廠中某個(gè)Bean實(shí)例的引用】
最后調(diào)用了userService的save()方法:
接下來,創(chuàng)建beans6.xml.
配置文件的作用是啟動(dòng)compont scan,并且是在cn.itcast.annotation目錄下掃描(我們之前創(chuàng)建的幾個(gè)bean都在這個(gè)目錄下):
接下來,創(chuàng)建測試類:
我們看到測試類會(huì)先加載beans6.xml。
第15行獲取UserAction的實(shí)例:userAction。
上圖第18行是輸出userAction的實(shí)例;
上圖第19行是調(diào)用userAction中的save()方法---->調(diào)用userservice中的save()方法--->調(diào)用userdao中的save()方法--->打印:"userdao...save..."
然后,每個(gè)類還有自己的打印內(nèi)容,因此最終的打印內(nèi)容是:
3.自動(dòng)裝配
自動(dòng)裝配是:將一個(gè)Bean注入到其他Bean的Property中。這需要使用到元素的autowire屬性,它的五個(gè)值是:
我們基于上一小節(jié)是示例,改造配置文件:
上圖中即通過autowire="byName"的字段,實(shí)現(xiàn)通過bean id名自動(dòng)裝配。
使用這種方式后,實(shí)際上面UserServiceImpl、UserAction兩個(gè)類中的源碼中,實(shí)現(xiàn)ref部分的代碼就可以刪除了,如:
參考文獻(xiàn):
《SSH框架整合實(shí)戰(zhàn)教程》-清華大學(xué)出版社
總結(jié)
以上是生活随笔為你收集整理的spring bean作用域_Srping中Bean的三种装配方式:大魏Java记10的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中如何定义颜色_Python
- 下一篇: iphone刷基带_iphone7基带坏