Spring學習筆記(二):IOC-2
本作品採用ofollow,noindex" href="http://creativecommons.org/licenses/by/4.0/" target="_blank">知識共享署名 4.0 國際許可協議 進行許可。
感謝:Java大聯盟
本文作者:低調小熊貓
文章連結:https://aodeng.cc/archives/springer
轉載宣告:自由轉載-非商用-非衍生-保持署名,非商業轉載請註明作者及出處,商業轉載請聯絡作者本人qq:2696284032
Spring IOC/">IOC-2
Spring中的bean是根據scope來生成的,表示bean的作用域。
1.singleton:單例,表示通過Spring容器獲取的該物件是唯一的。
2.prototype:原型,表示通過Spring容器獲取的物件都是不同的。
3.reqeust:請求,表示在一次http請求內有效。
4.session:會話,表示在一個使用者會話內有效。
3和4只適用於web專案,大多數情況下,我們只會使用singleton和prototype兩種scope,並且scope的預設值是singleton。
我們通過一個例子來學習這兩種配置的區別
單例模式
spring.xml
<bean id="user" class="com.southwind.entity.User"> <property name="id" value="1"></property> <property name="name" value="張三"></property> <property name="age" value="23"></property> </bean>
main
通過Spring容器獲取兩個User例項化物件user1和user2,並且通過==方法判斷是否為同一個物件。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); User user = (User) applicationContext.getBean("user"); User user2 = (User) applicationContext.getBean("user"); System.out.println(user == user2);
結果
結果列印true,並且User的建構函式只執行了一次,表示user1和user2是同一個物件,所以scope預設值為singleton,即預設通過Spring容器建立的物件都是單例模式。
原型模式
修改spring.xml中的配置,將scope改為prototype。
<bean id="user" class="com.southwind.entity.User" scope="prototype"> <property name="id" value="1"></property> <property name="name" value="張三"></property> <property name="age" value="23"></property> </bean>
結果
呼叫了兩次建構函式,並且==的結果為false,表示現在的user1和user2是兩個物件,說明bean的作用域是原型模式
Spring的繼承
user2繼承了user1的所有屬性
<bean id="user" class="com.southwind.entity.User"> <property name="id" value="1"></property> <property name="name" value="張三"></property> <property name="age" value="23"></property> </bean> <bean id="user2" class="com.southwind.entity.User" parent="user"></bean>
繼承的時候還可以覆蓋屬性
<bean id="user" class="com.southwind.entity.User"> <property name="id" value="1"></property> <property name="name" value="張三"></property> <property name="age" value="23"></property> </bean> <bean id="user2" class="com.southwind.entity.User" parent="user"> <!-- 覆蓋name屬性 --> <property name="name" value="李四"></property> </bean>
這樣name的值張三就被李四覆蓋了
Spring中的bean能不能在不同類之間繼承?
答案是可以,但是需要這兩個類的屬性列表完全一致,否則會報錯,實際開發中並不會使用到這種方式。
spring中bean的依賴
<bean id="user" class="com.southwind.entity.User" depends-on="car"> <property name="id" value="1"></property> <property name="name" value="張三"></property> <property name="age" value="23"></property> </bean> <bean id="car" class="com.southwind.entity.Car"> <property name="id" value="1"></property> <property name="brand" value="寶馬"></property> </bean>
User依賴於Car,所以必須先建立Car物件,User物件才能完成依賴。
p名稱空間
記得在beans中新增xmlns:p=”http://www.springframework.org/schema/p"
public class User { private int id; private String name; private int age; private Car car; }
<bean id="user" class="com.southwind.entity.User" p:id="1" p:name="張三" p:age="23" p:car-ref="car"></bean> <bean id="car" class="com.southwind.entity.Car" p:id="1" p:brand="寶馬"></bean>