首先明確xml檔案中的一些配置:
id和name:表示標識這個<bean>節點,name可以有特殊字元
scopebean的生存範圍,有singleton(單例,預設)、prototype(非單例)、request、session、globalsession
class表示關聯的類檔名稱(包名 + 類名)
value注入基本資料型別或字串
ref注入一個物件引用
factory-bean呼叫的工廠Bean例項
factory-method呼叫的工廠方法
<property>節點可以呼叫類中的setter方法,name對應引數名稱,value對應引數值。
<constructor-arg>節點可以呼叫類中的構造器,name對應引數名稱,value對應引數值。
一:通過建構函式建立物件。
1.無參建構函式+setter方法注入值
package com.spring.bean;
public class Person {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {//呼叫這個
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {//呼叫這個
this.id = id;
}
}
XML配置:
<!--呼叫了無參建構函式-->
<bean class="com.spring.bean.Person" id="person">
<property name="name" value="LiuChunfu"></property><!--呼叫了setter方法-->
<property name="id" value="125"></property>
</bean>
</beans>
2 利用有參建構函式直接注入
package com.mc.base.learn.spring.bean;
public class Person {
private String name;
private Integer id;
public Person(String name, Integer id) {//呼叫這個
super();
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
xml配置:
<bean class="com.spring.bean.Person" id="person">
<!--有參建構函式注入-->
<!--呼叫有引數建構函式,通過<constructor-arg>標籤注入引數-->
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="LiuChunfu"></constructor-arg>
</bean>
</beans>
二.靜態工廠建立(使用靜態方法)
靜態工廠的物件,在容器載入的時候就被建立了。
public static Person createPerson(Integer id,String name){
return new Person(name,id);
}
xml:
<!--靜態的工廠方法核心是class+factory-method,直接呼叫類方法-->
<bean id="person" class="com.spring.factory.PersonStaticFactory" factory-method="createPerson">
<!--通過property標籤向createPerson傳遞引數 -->
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean>
三、通過例項工廠方式建立物件
例項工廠就是通過例項來呼叫物件,但是所得到的物件最終也是單例模式。例項工廠和靜態工廠建立的物件都是單例模式,兩者的區別就是建立物件的實際不同,靜態工廠是在建立容器的時候就建立了,例項工廠是在呼叫方法的時候才建立。
public class PersonFactory {
//非靜態方法返回例項
public Person createInstance() {
return new Person();
}
}
xml:
<!--建立類的工廠Bean例項-->
<bean id="personFactory" class="cn.test.util.PresonFactoryInstance"></bean>
<!--有了例項之後才能呼叫成員方法-->
<bean id="person4" factory-bean="personFactory" factory-method="createPerson">
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean>
四.自動裝配
在bean節點中, 新增autowire屬性來完成自動裝配的操作
1,no : 預設設定 , 表示關閉自動裝配
2,byName : 通過名稱完成自動裝配:
例如: 當前我們容器中存在一個物件, id為book;
而剛好當前的這個person類中有一個名稱為book的屬性
那麼這個時候, 我們的容器, 會自動完成兩個物件的關聯
byName 不會判斷傳入的引數型別是否匹配, 只要名稱相同, 就會強行建立依賴關係 , 導致報錯!
3, byType : 通過型別完成自動裝配
例如: 當前我們容器中存在一個Book類的物件
而剛好我們當前的Person有一個Book型別的屬性
我們的容器, 就會自動完成兩個物件的關聯。如果存在多個同型別物件則報錯
4,constructor 與byType的方式類似,不同之處在於它應用於構造器引數
5,autodetect 通過bean類來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼將使用byType