spring學習:五(第一部分):在IOC容器中裝配Bean

一、Bean基本配置

裝配一個 bean和bean的命名

<bean id="car" class="com.smart.fb.Car"/>

1.id的命名規範:必須以字母開始,後面可以是字母、數字、連字符、下劃線、句號、冒號等完整約束的符號,逗號和空格都是非法的。如果希望使用特殊字符進行命名,則可以使用name屬性。

id和name都可以指定多個名字,名字之間用逗號、分號或者空格進行分割,如:

<bean id="car,123,$car" name="#car1,123,$car" class="com.smart.simple.Car"></bean>

用戶可以使用getBean("car1"),getBean("123"),getBean("$car")獲取到Ioc容器中的car Bean

spring配置文件不允許出現兩個相同id的bean,但是卻可以出現兩個相同name的bean。多個name相同的 bean,使用getBean(name)獲取Bean時,將返回後邊聲明的那個bean

如果id,name屬性都未指定,如

<bean class="com.smart.simple.Car"></bean>

那麼spring自動將全限定類名作爲Bean的名稱,這時用戶可以通過getBean("com.smart.simple.Car")獲取 bean

二、依賴注入

1.屬性注入

指的是使用setXXX()方法注入Bean的屬性值或依賴對象,具有可選擇性和靈活性高的優點,是實際應用中最常才用的注入方式。

屬性注入要求Bean提供一個默認的構造方法,併爲需要注入的屬性提供對應的 setter方法。

package com.smart.scope;

public class Car {

	private String color;
	private String brand;
	private double price;

	public void setPrice(double price) {
		this.price = price;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public void setColor(String color) {
		this.color = color;
	}

}

2.配置文件注入

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<bean id="car" class="com.smart.attr.Car">
		<property name="brand" value="吉利CT5" />
		<property name="maxSpeed" value="100" />
		<property name="price" value="1000.00" />
	</bean>
	<bean id="boss" class="com.smart.attr.Boss">
		<property name="car">
			<ref parent="car" />
		</property>
	</bean>
</beans>

java屬性命名特殊規範:

一般情況下,屬性變量名才都以小寫字母開頭,特殊情況考慮到一些特定意義的的大寫英文縮略詞(XML等),必須滿足變量的前兩個字母要麼全部大寫,要麼全部小寫,這樣的屬性在啓動spring容器的時候會報錯

3.構造函數注入

按類型匹配入參

<!--構造函數注入:type -->
	<bean id="car1" class="com.smart.ditype.Car">
		<constructor-arg type="java.lang.String">
			<value>紅旗CA72</value>
		</constructor-arg>
		<constructor-arg type="double">
			<value>20000</value>
		</constructor-arg>
	</bean>

按索引匹配入參

  <bean id="boss" class="com.smart.auto.Boss" autowire="constructor">
     <constructor-arg index="0" value="John"/>
  </bean>

聯合使用類型和索引匹配入參:用於解決有多個重載的構造方法,且入參數量相同產生的問題

<!--構造函數注入:type&index -->
	<bean id="car3" class="com.smart.ditype.Car">
		<constructor-arg index="0" type="java.lang.String">
			<value>紅旗CA72</value>
		</constructor-arg>
		<constructor-arg index="1" type="java.lang.String">
			<value>中國一汽</value>
		</constructor-arg>
		<constructor-arg index="2" type="int">
			<value>200</value>
		</constructor-arg>
	</bean>

循環依賴問題:解決方法是將構造函數注入方式調整爲屬性注入方式即可

4.工廠方式注入(不推薦使用,因爲工廠方法需要額外的類和代碼,這些功能和業務是沒有關係的)

非靜態工廠方法:由於是非靜態的,所以需要先定義一個工廠類的bean

<!-- 工廠方法-->
	<bean id="carFactory" class="com.smart.ditype.CarFactory" />
	<bean id="car5" factory-bean="carFactory" factory-method="createHongQiCar">

靜態工廠:直接在<bean>中通過class屬性指定工廠類,然後通過factory-method指定對應的工廠方法

<bean id="car6" class="com.smart.ditype.CarFactory"
		factory-method="createCar"></bean>

三、注入參數詳解

1.字面值 

 指可用字符串表示的值,這些值可以通過<value>元素標籤進行注入

<![CDATA[]]>作用是讓XML解析器將標籤中的字符串當做普通文本解析。

2.引用其他bean

<bean id="brand"
		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject">
			<ref bean="car" />
		</property>
		<property name="targetMethod">
			<value>getBrand</value>
		</property>
	</bean>

<ref>元素有三個屬性:

  • bean:通過該屬性引用同一容器或父容器中的bean
  • local:通過該屬性只能引用同意配置文件中的bean
  • parent:引用父容器中的bean

3.內部bean

如果car只被boss引用,而不被容器中任何其他bean引用,則可以將car以內部bean的方式注入到Boss中

<!-- 內部Bean -->
	<bean id="boss2" class="com.smart.attr.Boss">
		<property name="car">
			<bean class="com.smart.attr.Car">
				<property name="maxSpeed" value="200" />
				<property name="price" value="2000.00" />
			</bean>
		</property>
	</bean>

4.null值

使用專門的null標籤:<null/>

5.級聯屬性

下邊的代碼直接爲car屬性的brand屬性賦值

<bean id="sportsCar" class="com.smart.attr.SportsCar">
		<property name="brand">
			<bean id="car.brand"
				class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
			</bean>
		</property>
	</bean>

6.集合類型屬性

List

<bean id="favoriteList"
		class="org.springframework.beans.factory.config.ListFactoryBean">
		<property name="targetListClass" value="java.util.LinkedList" />
		<property name="singleton" value="false" />
		<property name="sourceList">
			<list>
				<value>看報</value>
				<value>賽車</value>
				<value>高爾夫</value>
			</list>
		</property>
	</bean>

Set:使用<set></set>標籤,其他同list

Map

<property name="jobs">
	<map>
		<entry>
			<key><value>AM</value></key>
			<value>會見客戶</value>
		</entry>
		<entry>
			<key><value>PM</value></key>
			<value>公司內部會議</value>
		</entry>
	</map>
</property>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章