複習之spring基礎(一)——控制反轉(ioc)和依賴注入(di)
阿新 • • 發佈:2018-12-15
Spring的核心——控制反轉
ioc: 反轉控制. 建立物件的方式反轉了.從我們自己建立物件,反轉給spring(程式)來建立.
實現ioc思想需要,di做支援
di: 依賴注入.將必須的屬性注入到物件當中.是實現ioc思想必須條件.
三種物件建立方式
- 無參構造建立物件
<!-- 建立方式一:spring呼叫無參構造建立物件 --> <!-- scope:singleton:表示單例物件,在spring容器中只會存在一個例項 --> <!-- scope:prototype:表示多例物件,每次獲取都會建立一個新的物件;整合struts2時必須為多例 --> <!-- 生命週期方法配置init,destroy --> <bean name="user" class="com.bean.User" scope="singleton" init-method="init" destroy-method="destroy"></bean>
- 通過靜態工廠的某個方法建立一個user物件
<bean name="user1" class="com.bean.UserFactory" factory-method="createUser"></bean>
- 例項工廠建立物件
<bean name="user2" factory-bean="userFactory" factory-method="createUser2"></bean>
<bean name="userFactory" class="com.bean.UserFactory"></bean>
靜態工廠和例項工廠類如下:
public class UserFactory {
public static User createUser(){
System.out.println("通過靜態工廠的某個方法建立一個user物件");
return new User();
}
public User createUser2(){
System.out.println("例項工廠建立物件");
return new User();
}
}
依賴注入的方式
- set方法(主要方式)
<!-- set方式注入 --> 8 <bean name="user" class="top.maniy.User"> 9 <!-- 值型別注入 --> 10 <property name="name" value="maniy"/> 11 <property name="age" value="18"/> 12 <!-- 引用型別注入 --> 13 <property name="city" ref="city"/> 14 </bean>
- 構造方法注入
<bean name="user1" class="top.maniy.User">
<!-- 當構造方法引數位置不同,可以通過index確定引數位置 -->
<!-- 當構造方法引數型別不同,可以通過type確定引數型別 -->
<constructor-arg name="name" value="maniy" index="0" type="java.lang.String"/>
<constructor-arg name="city" ref="city"/>
</bean>
- p屬性注入
<!-- p屬性注入 -->
<!-- 需加入xmlns:p="http://www.springframework.org/schema/p" -->
<bean name="user2" class="com.bean.User" p:name="maniy" p:age="18" p:city-ref="city"/>
spel表示式注入
<!-- spel表示式注入;可以實現動態注入 -->
<bean name="user3" class=""top.maniy.User">
<property name="name" value="#{user.name}"/><!--取user的name賦給user3-->
<property name="age" value="#{user2.age}"/>
<property name="car" ref="car"/>
</bean>
複雜屬性注入
public class CollectionBean {
private Object[] arr;//陣列
private List list;//集合
private Map map;//map集合
private Properties properties;//資原始檔
//get、set、toString方法省略
}
- Array
<!-- 陣列注入 -->
<bean name="cb" class="top.maniy.CollectionBean">
<!-- 只有一個值時 -->
<!--<property name="arr" value="maniy"/>-->
<!-- 多值多元素注入 -->
<property name="arr">
<array>
<value>maniy</value>
<value>mark</value>
<ref bean="user3"/>
</array>
</property>
</bean>
- List\Set
<!-- 集合注入 -->
<bean name="cb2" class="top.maniy.CollectionBean">
<!-- 只有一個值時 -->
<!--<property name="list" value="maniy"/>-->
<!-- 多值多元素注入 -->
<property name="list">
<list>
<value>maniy</value>
<value>mark</value>
<ref bean="user3"/>
</list>
</property>
</bean>
- Map
<!-- map注入 -->
<bean name="cb3" class="top.maniy.CollectionBean">
<property name="map">
<map>
<entry key="name" value="maniy"/><!-- key:字串,value:字串 -->
<entry key="user" value-ref="user3"/><!-- key:字串,value:物件 -->
<entry key-ref="user1" value-ref="user2"/><!-- key:物件,value:物件 -->
</map>
</property>
</bean>
- Properties
<!-- 資源注入 -->
<bean name="cb4" class=top.maniy.CollectionBean">
<property name="properties">
<props>
<prop key="driverClass">com.jdbc.mysql.Driver</prop>
<prop key="userName">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>