Spring中的IoC

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" />



相關文章
相關標籤/搜索