1.spring bean的xml配置裏name或id均可以指定它們中的一個時都做爲「標識符」,那爲何還要有id和name同時存在呢?java
這是由於當使用基於XML的配置元數據時,在XML中id是一個真正的XML id屬性,所以當其餘的定義來引用這個id時就體現出id的好處了,能夠利用XML解析器來驗證引用的這個id是否存在,從而更早的發現是否引用了一個不存在的bean,而使用name,則可能要在真正使用bean時才能發現引用一個不存在的bean。spring
2.Spring IoC容器中根據Bean定義建立Bean主要有3種方式:xml
A.使用構造器實例化Bean;索引
<!-- 使用空構造器進行定義-->資源
<bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/> get
<!-- 指定構造器參數 index表示位置,value表示常量值,也能夠指定引用,指定引用使用ref來引用另外一個Bean定義--> class
<bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2"> 容器
<constructor-arg index="0" value="Hello Spring!"/> 配置
</bean> 依賴注入
B.使用靜態工廠方式實例化Bean;使用這種方式除了指定必須的class屬性,還要指定factory-method屬性來指定實例化Bean的方法,並且使用靜態工廠方法也容許指定方法參數.
public class HelloApiStaticFactory { //靜態工廠類代碼
public static HelloApi newInstance(String message) { //工廠方法
return new HelloImpl2(message); //返回須要的Bean實例
} }
<!-- 使用靜態工廠方法定義bean -->
<bean id="bean3" class="cn.javass.spring.chapter2.HelloApiStaticFactory"
factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
C.使用實例工廠方法實例化Bean。使用這種方式不能指定class屬性,此時必須使用factory-bean屬性來指定工廠Bean,factory-method屬性指定實例化Bean的方法,並且使用實例工廠方法容許指定方法參數,方式和使用構造器方式同樣。
public class HelloApiInstanceFactory { //實例工廠類代碼
public HelloApi newInstance(String message) {
return new HelloImpl2(message);
} }
<!—一、定義實例工廠Bean -->
<bean id="beanInstanceFactory" class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/>
<!—二、使用實例工廠Bean建立Bean -->
<bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"></constructor-arg>
</bean>
這三種方式只是配置不同,從獲取方式看徹底同樣,沒有任何不一樣。
3.Spring IoC容器注入依賴資源主要有如下三種基本實現方式:
構造器注入:就是容器實例化Bean時注入那些依賴,經過在在Bean定義中指定構造器參數進行注入依賴,包括實例工廠方法參數注入依賴,但靜態工廠方法參數不容許注入依賴;
1、根據參數索引注入,使用標籤「<constructor-arg index="1" value="1"/>」來指定注入的依賴,其中「index」表示索引,從0開始,即第一個參數索引爲0,「value」來指定注入的常量值
2、根據參數類型進行注入,使用標籤「<constructor-arg type="java.lang.String" value="Hello World!"/>」來指定注入的依賴,其中「type」表示須要匹配的參數類型,能夠是基本類型也能夠是其餘類型,如「int」、「java.lang.String」,「value」來指定注入的常量值
3、根據參數名進行注入,使用標籤「<constructor-arg name="message" value="Hello World!"/>」來指定注入的依賴,其中「name」表示須要匹配的參數名字,「value」來指定注入的常量值
<!-- 經過構造器參數索引方式依賴注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
<!-- 經過構造器參數類型方式依賴注入 -->
<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg type="java.lang.String" value="Hello World!"/>
<constructor-arg type="int" value="2"/>
</bean>
<!-- 經過構造器參數名稱方式依賴注入 -->
<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg name="message" value="Hello World!"/>
<constructor-arg name="index" value="3"/>
</bean>
方法注入:能經過配置方式替換掉Bean方法,也就是經過配置改變Bean方法 功能。
靜態工廠方法注入和實例工廠注入.
setter注入:經過setter方法進行注入依賴;
setter注入,是經過在經過構造器、靜態工廠或實例工廠實例好Bean後,經過調用Bean類的setter方法進行注入依賴. 在Bean的配置中增長property。
Spring如何知道setter方法?如何將值注入進去的呢?其實方法名是要遵照約定的,setter注入的方法名要遵循「JavaBean getter/setter 方法命名約定」。