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