1. 程式人生 > >複習之spring基礎(一)——控制反轉(ioc)和依賴注入(di)

複習之spring基礎(一)——控制反轉(ioc)和依賴注入(di)

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>