Spring中的IoC:java
1)概念:把對象的建立、初始化、銷燬等工做交給spring容器來作。由spring容器控制對象的生命週期。 2)目的:爲了解決多個對象之間的依賴關係。 3)原理: 1)經過配置文件(或註解)的方式來描述bean與bean之間的依賴關係。 2)經過動態代理和java的反射機制來實例化bean,同時創建bean之間的依賴關係。 4)spring容器建立對象的3種方式(bean的實例化): 1)使用Spring的IoC建立對象:調用默認的構造函數(默認) 1>指定bean的class屬性 2>class須要一個默認的空構造器 <bean id="helloWorld" class="com.jxn.HelloWorld" /> 獲得實例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 2)在Spring中使用工廠模式建立對象: 使用靜態工廠方法 1>指定class屬性外 2>經過factory-method屬性來指定建立bean實例的靜態工廠方法 <bean id="helloWorld" class="com.jxn.HelloWorldFactory" factory-method="createInstance"></bean> 注:至關於調用了 HelloWorldFactory.createInstance(); public class HelloWorldFactory { public static HelloWorld createInstance(){ return new HelloWorld(); } } 獲得實例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 使用實例工廠方法 1>定義一個工廠類 2>經過factory-bean屬性指定工廠類,經過factory-method屬性指定該工廠類的非靜態工廠方法 <bean id="helloWorldFactory" class="com.jxn.HelloWorldFactory" /> <bean id="HelloWorld" factory-bean="helloWorldFactory" factory-method="createInstance" /> 注:至關於調用了 new HelloWorldFactory.createInstance(); public class HelloWorldFactory { public HelloWorld createInstance(){ return new HelloWorld(); } } 獲得實例對象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld"); 3)使用Spring的IoC建立對象 VS 使用工廠模式建立對象 當建立的對象須要修改(eg:新增屬性)時: Spring的IoC只須要修改對象對應的類便可。 工廠模式須要修改或添加工廠方法。 5)DI(依賴注入):給對象的屬性賦值 1)使用屬性的setter方法進行注入: 說明:經過調用無參構造器或無參static工廠方法實例化bean以後,調用該bean的setter方法,便可實現基於setter的依賴注入。 舉例: <!-- property是用來描述一個類的屬性:直接變量(基本類型、String類型等)用value賦值,引用類型用ref賦值 --> <bean id="student" class="com.jxn.domain.Student" /> <bean id="person" class="com.jxn.domain.Person"> <!-- 直接變量 --> <property name="name" value="aaa" /> <!-- 引用類型 --> <property name="student" ref="student"> <!-- List --> <property name="lists"> <list> <value>list1</value> <ref bean="student"/> <value>list3</value> </list> </property> <!-- Map --> <property name="map"> <map> <entry key="m1"> <value>map1</value> </entry> <entry key="m2"> <ref bean="student"/> </entry> </map> </property> <!-- Properties --> <property name="properties"> <props> <prop key="key1">value1</prop> <prop key="key2">value2</prop> </props> </property> </bean> 2)使用構造器注入:經過調用帶參數的構造器來實現: 說明: 1>若是spring的配置文件的bean中沒有<constructor-arg>標籤,則調用默認的構造方法 2>若是spring的配置文件的bean中有<constructor-arg>標籤,則該元素肯定惟一的構造方法,該標籤的屬性 index 指參數的位置,從0開始 type 指參數的類型,若是不寫仍可肯定惟一的構造方法,則能夠省略type屬性 value 給基本類型賦值 ref 給引用類型賦值 舉例: <bean id="person" class="com.jxn.domain.Person"> <constructor-arg index="0" type="java.lang.Long" value="1"></constructor-arg> <constructor-arg index="1" value="zhangsan"></constructor-arg> <constructor-arg index="2" ref="student"></constructor-arg> </bean> <bean id="student" class="com.jxn.domain.Student" />