一、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>