spring--配置詳解
本博文參考傳智播客、黑馬程式設計師視訊講座
IoC(控制反轉)
Inverse of Control
控制反轉,把本來由程式設計師建立物件和依賴注入的工作轉交給spring完成。
DI(依賴注入)
Dependency Injection
注入方式:set方法注入+構造方法注入+欄位注入(相當於類成員是public,可以直接呼叫賦值)
注入型別:值型別注入(8種基本資料型別)+引用型別注入
spring容器
BeanFactory介面(每次獲取物件時才會建立物件)
ApplicationContext介面:(每次容器啟動時就會建立容器中配置的所有物件),一般從類路徑下載入配置檔案ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ac = new FileSystemXmlApplicationContext("硬碟上的絕對路徑");
由於BeanFactory介面是在獲取物件的時候才建立物件,而ApplicationContext在容器啟動的時候就把配置檔案中配置的物件都創建出來了,那就比較耗費資源了,又由於硬體發展的比較好了,一般直接用ApplicationContext容器,因為其功能比原始的BeanFactory強大的多。除非是硬體資源非常匱乏的情況下,才會考慮用BeanFactory。
spring配置詳解—Bean元素
<!-- 把User物件交給spring容器管理 --> <!-- Bean元素:spring容器所管理的物件的資訊 class屬性:被管理物件的全限定名 name屬性:被管理物件的名字,可重複,可使用特殊字元,(建議用name而不是id) id屬性:與name屬性類似,不可重複,不可使用特殊字元 --> <bean name="user" class="cn.ccnuacmhdu.bean.User"></bean>
Bean的scope屬性
常用的兩個值:singleton(預設)和prototype
singleton:在spring容器中只有一個物件例項
prototype:多例,每次獲得都會建立一個新的例項
另外還有request屬性值和session屬性值,在web環境下,物件與request或session生命週期一致。
Bean的生命週期屬性
init-method方法:spring在建立物件之後立即呼叫
destroy-method方法:spring在銷燬所有容器物件之前呼叫
<bean name="user" class="cn.ccnuacmhdu.bean.User" init-method="init" destroy-method="destroy"></bean>
spring配置詳解—建立物件的方式
工程依舊使用原來的工程:https://blog.csdn.net/ccnuacmhdu/article/details/84988785
空參構造
為User物件提供空參構造方法,證明spring預設使用空參構造建立物件。
public User() {
System.out.println("空參構造方法。。。");
}
其他方式還有靜態工廠方式(呼叫靜態工廠的某個靜態方法建立物件)和例項工廠模式(呼叫例項工廠中的某個非靜態方法建立物件),瞭解下即可,具體配置方式略。
spring配置詳解—模組化配置
主配置檔案中引入其他spring配置檔案:
<import resource="去掉src之前的路徑後剩下的路徑/applicationContext.xml"/>
spring配置詳解—屬性注入方式
set方法注入
<bean name="user" class="cn.ccnuacmhdu.bean.User">
<!-- 為User物件的屬性注入值 -->
<property name="name" value="Tom"></property>
<property name="age" value="19"></property>
</bean>
構造方法注入
提供構造方法:
public User(String name, Car car) {
super();
this.name = name;
this.car = car;
}
書寫配置檔案:
<bean name="car" class="cn.ccnuacmhdu.bean.Car">
<property name="name" value="大眾"></property>
<property name="price" value="120"></property>
</bean>
<!-- 構造方法注入 -->
<bean name="user2" class="cn.ccnuacmhdu.bean.User">
<constructor-arg name="name" value="Lucy"></constructor-arg>
<constructor-arg name="car" ref="car"></constructor-arg>
</bean>
注意:如果配置檔案中還存在剛才的user配置,並且user僅僅提供了一個構造方法,沒有提供空參構造。由於只要在配置檔案中配置了user,spring容器就會去建立他,必定要通過空參構造,但是找不到空參構造,報錯!!!
變態情況1
user有下面兩個構造方法
public User(String name, Car car) {
super();
this.name = name;
this.car = car;
}
public User(Car car, String name) {
super();
this.name = name;
this.car = car;
}
用index屬性指定形參順序,確定使用哪個構造方法:
變態情況2
指定每個引數的型別:
複雜型別注入
package cn.ccnuacmhdu.bean;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Collection {
private Object[] arr;
private List list;
private Map map;
private Properties props;
public Object[] getArr() {
return arr;
}
public void setArr(Object[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
}
@Override
public String toString() {
return "Collection [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", props=" + props + "]";
}
}
<!-- 複雜型別注入 -->
<!-- 陣列 -->
<bean name="collection" class="cn.ccnuacmhdu.bean.Collection">
<!-- 陣列只有一個元素的時候可以用下面這一句程式碼 -->
<!-- <property name="arr" value="Tom"></property> -->
<!-- 多個元素注入 -->
<property name="arr">
<array>
<value>lucy</value>
<value>jack</value>
<ref bean="car" />
</array>
</property>
<!-- list只有一個元素的時候可以用下面這一句程式碼 -->
<!-- <property name="list" value="jack"></property> -->
<property name="list">
<list>
<value>lucy</value>
<value>jack</value>
<ref bean="car" />
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key1" value-ref="car"></entry>
<entry key-ref="car" value-ref="car"></entry>
</map>
</property>
<property name="props">
<props>
<prop key="name">name</prop>
<prop key="password">password</prop>
</props>
</property>
</bean>
另外還有p名稱空間注入和spel方式注入,具體略。
註解配置代替XML
略。