今天我來學習學習Spring中Bean。
在Spring中原來還有<beans.../>標簽啊,它相當于<bean.../>標簽的老爸,老爸可以有很多個兒子,但是老爸只有一個哦。
也就是說一個<beans.../>標簽內可以有多個<bean...>標簽,每個<bean.../>標簽代表一個java實例。
定義<bean...>時,需要注意兩個屬性,一個是id,一個是class。
id是<bean.../>標簽的唯一標示符,容器對其的訪問、管理、注入都通過這個屬性來完成,所以它也是唯一的。
class呢,是該bean的具體實現類,因為Spring要通過class來完成對bean的實例化,所以其必須是完整的類名,不能是接口哦!
還可以用name屬性為其增加一個別名。
當Spring創建一個bean實例時,還為其指定了特定的作用域:
singleton:單例模式,使用singleton定義的bean只有一個實例。
prototype:原型模式,每次通過容器的getbean方法去調用prototype定義的bean時,都會創建一個實例。
request:每次http請求都會產生一個bean實例。
seesion:與request相似,每次http session請求時,都會產生一個bean實例。
global session:(這個不太懂啊)每個全局的http session對應一個bean實例。
不指定作用域時,默認為singleton模式。
舉個例子:<bean id="test" class="..." scope="singleton"/>
session和request作用域的范圍很相似,不同的是session指每次Http Session請求都會有效,而request則是每次Http請求都有效。
為此,我們需要有兩種配置方式:采用Listener或者Filter配置。
當使用Servlet2.4以上規范的Web容器時,可在Web容器下的web.xml文件中增加如下配置,該Listerner負責為request作用域負責:
1 <web-app>2 ...3 <listener>4 <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>5 </listener>6 ...7 </web-app>
當使用2.4以下規范的就不能用這個配置了,只能改為Filter配置:
1 <web-app> 2 ... 3 <filter> 4 <filter-name>requestContextFilter</filter-name> 5 <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> 6 <filter-mapping> 7 <filter-name>requestContextFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>10 </filter>11 ...12 </web-app>
一旦配置上面二者之一,就可以在Spring配置文件中使用request和session作用域了。
如果需要為Bean屬性值是容器中另一個bean實例,需要使用<ref...>元素,使用該元素會有兩個屬性:
bean:引用不在同一個XML文件中的另一個bean實例的id屬性值。
local:引用在同一個XML文件中其他bean實例的id屬性值。舉一個例子:
1 <bean id="A" class="com.basic.test.A"/>2 <bean id="B" class="com.basic.test.B">3 <property name="c">4 <!-- 引用容器中另一個bean-->5 <ref local="A"/>6 </property>7 </bean>
它還有一種簡潔的寫法:
1 <bean id="A" class="com.basic.test.A"/>2 <bean id="B" class="com.basic.test.B">3 <property name="c" ref="A"/>4 </bean>
此處簡潔了ref元素,將它并入了property的屬性中,當然這么寫也就不區分ref元素中的local和bean屬性了。
此外,如果bean的屬性值是個集合的話,則需要使用集合元素,<list.../>、<set.../>、<map.../>和<props.../>分別用來設置類型為List、Set、Map和Properties的集合屬性值。
下面我們來改造一個之前寫的com/sep/basic/service/impl/Lenovo類,將其中包含多個集合屬性。
1 package com.sep.basic.service.impl; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Properties; 6 import java.util.Set; 7 8 import com.sep.basic.service.Computer; 9 import com.sep.basic.service.Key;10 11 public class Lenovo implements Computer{12 //下面是集合屬性13 private List<String> size;14 private Set price;15 private Map<String , Key> key;16 private Properties health;17 //private Key key;18 19 //各屬性的setter方法20 public void setSize(List<String> size) {21 this.size = size;22 }23 24 25 public void setPrice(Set price) {26 this.price = price;27 }28 29 30 public void setKey(Map<String, Key> key) {31 this.key = key;32 }33 34 35 public void setHealth(Properties health) {36 this.health = health;37 }38 39 @Override40 public void useKey() {41 System.out.println(size);42 System.out.println(price);43 System.out.println(key);44 System.out.println(health);45 }46 47 }下面來看一下我們的applicationContext.xml的配置代碼:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 7 <!-- 將配置Lenovo實例 --> 8 <bean id="lenovo" class="com.sep.basic.service.impl.Lenovo"> 9 <property name="size">10 <!-- 為list屬性配置屬性值 -->11 <list>12 <!-- 為每個value、ref、bean配置一個List元素 -->13 <value>17'</value>14 <value>21'</value>15 <value>30'</value>16 </list>17 </property>18 <property name="key">19 <!-- 為Set設置屬性值 -->20 <set>21 <!-- 為每個value、ref、bean配置一個Set元素 -->22 <value>普通的字符串</value>23 <bean class="com.sep.basic.service.impl.LogicTech"/>24 <ref local="logicTech"/>25 </set>26 </property>27 <property name="cpu">28 <!-- 為Map類型設置屬性值 -->29 <map>30 <!-- 每個entry配置一個key-value對 -->31 <entry key="cpu1" value="intel"/>32 <entry key="cpu2" value="amd"/>33 <entry key="cpu3" value="other"/>34 </map>35 </property>36 <property name="keyType">37 <!-- 為Map類型設置屬性值 -->38 <map>39 <!-- 每個entry配置一個key-value對 -->40 <entry key="羅技鍵盤" value-ref="logicTech"/>41 </map>42 </property>43 <property name="health">44 <!-- 為properties類型設置屬性值 -->45 <!-- 為每一個prop元素配置一個屬性項,其中key指定屬性名 -->46 <props>47 <prop key="溫度">正常</prop>48 <prop key="存取速度">正常</prop>49 </props>50 </property>51 </bean>52 <!-- 將配置LogicTech實例-->53 <bean id="logicTech" class="com.sep.basic.service.impl.LogicTech"/>54 55 </beans>
這樣我們就成功地將所有集合屬性賦值了。
新聞熱點
疑難解答