基本類型直接使用
<property name="name" value="jack"></property>自動進行類型轉換
進行復雜賦值時
<property name="name" >
<value></value>
</property>
引用類型賦值(引用其他bean,引用內部bean)
<bean id="car01" class="com.lmh.bean.Car">
<property name="carName" value="bmw"></property>
<property name="color" value="black"></property>
<property name="price" value="30000"></property>
</bean>
<bean id="person06" class="com.lmh.bean.Person">
<!-- ref:代表引用外部的bean
car = ioc.getBean("car01")-->
<property name="car" ref="car01"></property>
<property name="car">
<!-- 對象我們可以使用bean標簽創建 car = new Car() 引用內部bean,不能被獲取,只能內部使用,內部類添加id屬性,不能被調用 -->
<bean class="com.lmh.bean.Car">
<property name="carName" value="audi"></property>
</bean>
</property>
</bean>
<!-- 通過p名稱空間為bean賦值 -->
<!-- 名稱空間:在xml中名稱空間是用來防止標簽重復 -->
<!-- 1)導入p名稱空間 2)寫帶前綴的標簽/屬性 -->
<bean id="person05" class="com.lmh.bean.Person" p:name="xiaohei"
p:age="18" p:gender="male" p:email="xiaohei@qq.com"></bean>
<!-- 注冊一個person對象 Spring自動創建person對象 -->
<!-- 一個Bean標簽可以注冊一個組件(對象) class:寫要注冊的組件的全類名 id: 這個對象的唯一標識 -->
<bean id="person01" class="com.lmh.bean.Person">
<!-- 使用property給對象的屬性進行賦值
name: 指定屬性名
value: 為屬性賦值
-->
<property name="name" value="tom"></property>
<property name="gender" value="man"></property>
<property name="age" value="18"></property>
<property name="email" value="tom@qq.com"></property>
</bean>
<!--調用有參構造方法進行對象創建並賦值 不使用getter 和setter方法賦值 -->
<bean id="person03" class="com.lmh.bean.Person">
<constructor-arg name="name" value="petter"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="gender" value="male"></constructor-arg>
<constructor-arg name="email" value="petter@qq.com"></constructor-arg>
</bean>
<!-- index 屬性為參數指定索引 -->
<!-- 重載的情況下使用type 為參數指定數據類型 -->
<bean id="person04" class="com.lmh.bean.Person">
<constructor-arg name="name" value="petter" index="0"
type="java.lang.Integer"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="gender" value="male"></constructor-arg>
<constructor-arg name="email" value="petter@qq.com"></constructor-arg>
</bean>
<!-- 通過p名稱空間為bean賦值 -->
<!-- 名稱空間:在xml中名稱空間是用來防止標簽重復 -->
<!-- 1)導入p名稱空間 2)寫帶前綴的標簽/屬性 -->
<bean id="person05" class="com.lmh.bean.Person" p:name="xiaohei"
p:age="18" p:gender="male" p:email="xiaohei@qq.com"></bean>
<bean id="book001" class="com.lmh.bean.Book" p:name="圍城" p:author="錢鍾書"></bean>
<bean id="person001" class="com.lmh.bean.Person">
<!-- 如何給list類型賦值 -->
<property name="books">
<list>
<!-- list標簽體中添加每一個元素 -->
<bean id="book00001" class="com.lmh.bean.Book" p:name="西游記"
p:author="吳承恩"></bean>
<!-- 引用一個外部元素 -->
<ref bean="book001" />
</list>
</property>
</bean>
<!-- 如何給map類型賦值 -->
<property name="maps">
<!-- maps = new LinkHashMap(); -->
<map>
<!-- 一個entry相當於一個鍵值對 -->
<entry key="key01" value="張三"></entry>
<!-- 引用外部bean -->
<entry key="key02" value-ref="book001"></entry>
<!-- 內部創建bean對象 -->
<entry key="key03">
<bean class="com.lmh.bean.Car">
<property name="carName" value="奔馳"></property>
</bean>
</entry>
<!-- 一個map即{1,1,{}} -->
<entry key="key04">
<map></map>
</entry>
</map>
</property>
<!-- 如何給property類型賦值 -->
<property name="properties">
<!-- props = new Properties 所有的k=v 都是string -->
<props>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
<
<bean class="com.lmh.bean.Person">
<property name="maps" ref="myUtilmap"></property> 引用util:map
</bean>
<!-- util名稱空間創建集合類型的bean:方便別人引用 -->
<util:map id="myUtilmap">
<!-- 添加元素 -->
<!-- 一個entry相當於一個鍵值對 -->
<entry key="key01" value="張三"></entry>
<!-- 引用外部bean -->
<entry key="key02" value-ref="book001"></entry>
<!-- 內部創建bean對象 -->
<entry key="key03">
<bean class="com.lmh.bean.Car">
<property name="carName" value="奔馳"></property>
</bean>
</entry>
</util:map>
<!--list中的元素: [ [],person,23,{} ] -->
<util:list id="mylist">
<list></list>
<bean class="com.lmh.bean.Person"></bean>
<value>23</value>
<ref bean="myMap"/>
</util:list>
<!-- 級聯屬性: 屬性的屬性 -->
<bean id="person04" class="com.lmh.bean.Person">
<!-- 為car賦值的時候,改變car的價格 -->
<property name="car" ref="car01"></property>
<property name="car.price" value="90000"></property>
</bean>
<bean id="per01" class="com.lmh.bean.Person">
<property name="name" value="bmw"></property>
<property name="age" value="22"></property>
<property name="gender" value="30000"></property>
</bean>
<!--parent: 指定當前bean的配置信息繼承於那個 只需修改需要修改的屬性即可 -->
<bean id="per02" class="com.lmh.bean.Person" parent="per01">
<property name="name" value="奧拓"></property>
</bean>
<bean id="per01" class="com.lmh.bean.Person" abstract="true">
<!-- abstract="true" 這個bean的配置是一個抽象的,不能獲取實例。只能被別人用來繼承 -->
獲取時會報錯
Person person01 = (Person) ioc.getBean("per01");
System.out.println(person01);
/**
* org.springframework.beans.factory.BeanIsAbstractException:
* Error creating bean with name 'per01':
* Bean definition is abstract
*/
<bean id="person04" class="com.lmh.bean.Person" scope="singleton" init-method="init" destroy-method="destroy">
上面的bean標簽除了id和class兩個屬性外,還有其他屬性,這里我們介紹scope、init_method和destroy-method;
當沒有設置scope屬性為“singleton”時,當我們每次通過Spring容器的getBean方法獲取IntrduceDemo實例時,得到的都是相同的一個實例; 與singleton對應的是prototype,如果將scope屬性設置為prototype,得到的就是不同的實例對象
<!-- 測試bean的作用域,分別創建單實例和多實例的bean
bean的作用域:指定的bean是否單實例,xxx;默認: 單實例的
scope屬性的值:
prototype:多實例的
1)、 容器啟動默認不會去創建多實例bean
2)、獲取的時候創建這個bean對象
3)、每次獲取都會創建一個新的
singleton:單實例,(默認的 )配置文件默認狀態
1)、 在容器啟動完成之前已經創建好對象,保存在容器中
2)、任何獲取都是在獲取之前創建對象
request: 在web環境下,同一次請求創建一個bean對象(沒用)
session: 在web環境下,同一次會話創建一個bean對象(沒用)
-->
靜態工廠與實例工廠
<bean id="book" class="com.lmh.bean.Book"></bean>
<!--配置通過靜態工廠方法創建的bean、實例工廠方法創建的bean、FactoryBean -->
<!--bean的創建默認就是框架利用反射new出來的bean實例 -->
<!--工廠模式:工廠幫我們創建對象:有一個專門幫我們創建對象的類,這個類就是工廠
AirPlane ap = AirPlaneFactory.getairplane(String jzName);
靜態工廠: 工廠不用創建對象,通過靜態方法調用, 對象 = 工廠類.工廠方法名();
實例工廠:工廠本身需要創建對象;
工廠類 工廠對象 = new 工廠類();
工廠對象.getAirPlane(“張三”);
-->
<!--靜態工廠(不需要創建工廠本身)
class:指定靜態工廠全類名
factory-method:指定哪個方法是工廠方法
constructor-arg:可以為方法傳遞參數
-->
<bean id="airplane01" class="com.lmh.factory.AirPlaneStaticFactory"
factory-method="getAirPlane">
<constructor-arg value="wangba"></constructor-arg>
</bean>
<bean id="airPlaneInstanceFactory"
class="com.lmh.factory.AirPlaneInstanceFactory"></bean>
實現factorybean的工廠
<!--factory-bean:指定當前對象創建使用那個工廠
1.先配置出實例工廠對象
2.配置我們要創建的Airplane使用那個工廠創建
1)、
-->
<bean id="airplane02" class="com.lmh.bean.AirPlane"
factory-bean="airPlaneInstanceFactory"
factory-method="getAirPlane"
>
<constructor-arg value="wangwu"></constructor-arg>
</bean>
<!--FactoryBean(是spring規定的一個接口)
只要實現這個接口,Spring都認為是一個工廠
1.容器創建的時候,並不會創建這個實例
2.FactoryBean獲取的時候才創建對象
-->
<bean id="myFactoryBeanImple" class="com.lmh.factory.MyFactoryBeanImple"></bean>
<!-- 創建帶有生命周期方法的bean 生命周期:bean的創建到銷毀:
ioc容器中注冊的bean:
1)、單實例bean,容器啟動的時候就會創建好,容器關閉也會銷毀創建的bean
2)、多實例bean,獲取的時候才創建; 我們可以為bean自定義一些生命周期方法;
Spring在創建或者銷毀的時候就會調用指定的方法; 自定義初始化方法和銷毀方法。 -->
<bean id="book01" class="com.lmh.bean.Book"
destroy-method="bookDestory" init-method="bookInit"
scope="prototype"></bean>
實體類中對應的方法:

創建MyBeanPostProcessor類 繼承 BeanPostProcessor接口,實現對應的方法
<!-- 測試bean的后置處理器 BeanPostProcessor
Spring有一個接口,后置處理器,可以在bean的初始化前后調用方法
-->
/**
* Bean的生命周期:
* (容器啟動)構造器-->初始化方法-->(容器關閉)銷毀方法
*
* 多實例:獲取bean(構造器-->初始化方法)-->容器關閉不會調用bean 的銷毀方法
*
* 后置處理器:
* (容器啟動)構造器----后置處理器before -----> 初始化方法--->后置處理器after--->bean初始化完成
* 無論bean是否有初始化方法,后置處理器都會默認其有,還會繼續工作
*/
<bean id="book01" class="com.lmh.bean.Book"
destroy-method="bookDestory" init-method="bookInit"
scope="singleton"></bean>
<bean id= "beanpostprocessor" class="com.lmh.bean.MyBeanPostProcessor"></bean>
</beans>