控制:指誰來控制對象的創建 ,傳統的應用程序對象的創建是由程序本身來控制的;使用Spring框架後對象的創建由Spring來控制。
反轉:正常是由程序主動創建對象,而反轉指的是程序被動的接收對象。(主動→被動)
總結:
未使用Spring框架:程序主動創建對象。
使用Spring框架:程序被動接收Spring創建的對象。
IOC的實現是通過IOC容器實現的,IOC容器---BeanFactory。
一、使用IOC創建對象的三種方式:
1、通過無參構造函數創建:
調用默認無參構造函數創建。默認情況下,如果類中沒有默認無參構造函數,則創建失敗,會報異常。(常用)
<!-- 使用默認無參構造函數來創建對象-->
<bean id = "studentService" class="service.impl.StudentServiceImpl" scope="prototype"></bean>
2、使用靜態工廠中的方法創建對象:
需要使用bean標籤的factory-method屬性,指定靜態工廠中創建對象的方法。
靜態工廠類如下:
public class StaticFactory {
public static IStudentService getStudentService(){
return new StudentServiceImpl();
}
}
配置使用靜態工廠創建對象:
<!-- 配置使用靜態工廠創建對象-->
<bean id = "staticStudentService" class="factory.StaticFactory" factory-method="getStudentService"></bean>
3、使用實例工廠中的方法創建對象:
需要使用bean標籤的factory-bean和factory-method屬性,指定靜態工廠中創建對象的方法。
實例工廠類如下:
public class InstanceFactory {
public IStudentService getStudentService(){
return new StudentServiceImpl();
}
}
配置使用實例工廠創建對象:
<!-- 配置使用實例工廠創建對象-->
<bean id = "instanceFactory" class="factory.InstanceFactory"></bean>
<bean id = "instanceStudentService" factory-bean="instanceFactory" factory-method="getStudentService"></bean>
二、配置文件
1、Bean的配置:
(1)id是bean的標識符,必須唯一,如果沒有配置id,name默認爲標識符;如果既配置了id又配置了name,那麼name是別名(別名可以有多個,分隔符可以是空格、逗號、分號等)。如果不配置id和name,那麼可以根據applicationContext.getBean(Class)來獲取對象。
(2)class是bean的全限定名,包括包名+類名。
2、團隊合作使用Import來實現:
<!--引用其他文件-->
<import resource="bean.xml"/>
三、依賴注入(dependency injection)
依賴:指bean對象創建依賴於容器。Bean對象的依賴資源。
注入:指bean對象依賴的資源由容器設置和配置。
1、構造函數注入:
(1)涉及的標籤:constructor-arg
(2)標籤的屬性:
type: 指定參數的類型。
index:指定參數的索引位置,從0開始
name:指定參數的名稱(常用)
value:指定基本數據類型或String類型的數據
ref:指定其他bean 類型數據
(3)標籤出現的位置:寫在bean標籤內部
<bean id= "studentService" class="service.impl.StudentServiceImpl">
<constructor-arg name="driver" value="com.mysql.jdbc.Driver"></constructor-arg>
<constructor-arg name="port" value="3306"></constructor-arg>
<constructor-arg name="today" ref="now"></constructor-arg>
</bean>
<bean id = "now" class="java.util.Date"></bean>
2、set方法注入:
(1)涉及的標籤:property
(2)標籤的屬性:
name:指定參數的set方法名稱
value:指定基本數據類型或string類型的數據
ref:指定其他bean類型數據
array:數組類型數據;list:list類型數據;set:set類型數據;Properties:Properties類型數據。
p命名空間注入:要求有對應屬性的set方法,需要在文件頭加入
xmlns:p="http://www.springframework.org/schema/p"
c命名空間注入:要求有對應參數的構造方法,需要在文件頭加入
xmlns:c="http://www.springframework.org/schema/c"
(3)標籤出現的位置:寫在bean標籤內部
<bean id= "studentService" class="service.impl.StudentServiceImpl">
<!--常量注入-->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<!--常量注入-->
<property name="port" value="3306"></property>
<!--bean注入-->
<property name="today" ref="now"></property>
<!--數組注入-->
<property name="myStr">
<array>
<value>java</value>
<value>python</value>
</array>
</property>
<!--list注入-->
<property name="myList">
<list>
<value>java</value>
<value>python</value>
</list>
</property>
<!--map注入-->
<property name="myMap">
<map>
<entry key="中國銀行" value="123456"></entry>
<entry>
<key><value>招商銀行</value></key>
<value>8888888</value>
</entry>
</map>
</property>
<!--set注入-->
<property name="mySet">
<set>
<value>足球</value>
<value>籃球</value>
</set>
</property>
<!--Properties注入-->
<property name="myProps">
<props>
<prop key="學號">20200101</prop>
</props>
</property>
<!--null注入-->
<property name="salary"><null/></property>
</bean>
<!--p命名空間注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" p:driver="ppp"/>-->
<!--c命名空間注入-->
<!--<bean id= "studentService" class="service.impl.StudentServiceImpl" c:driver="ppp"/>-->
<bean id = "now" class="java.util.Date"></bean>
四、bean的作用範圍
(1)可以通過配置的方式來調整作用範圍
(2)配置的屬性:bean標籤的scope屬性。
(3)屬性的取值:
1)singleton:單例的(默認)
2)prototype:多例的(當我們讓spring接管struts2的action創建時,action必須配置此值)
3)request:作用範圍是一次請求 ,和當前請求的轉發。
4)session:作用範圍是一次會話。
5)globalsession:作用範圍時一次全局會話。