1.什么是IOC,其是干什么的 有何作用
Spring核心思想,控制反轉或依賴注入,把所有的javaBean都交給spring容器來管理,是通過.xml的形式對javaBean之間的依賴關系進行管理。所謂的反轉是相對正傳而言,假如有兩個類A 和B,
若是在A類中需要調用B類的方法,正向是直接new獲得。ioc 中就是把所有的控制權交給了Spring容器,不在主動的去獲取是被動的等待,等待容器把建好的對象給他。
spring的ioc解決的就是各個bean之間的耦合關系,其是可以簡單理解成在不同的bean之間添加了一個中間層(IOC容器)由它去處理bean之間的關系,這樣就達到了松散耦合的效果了。
控制反轉(IOC)也可以理解成依賴注入(DI),如 上面所說A類中用到了B類中的方法,就是所A依賴與B所以在需要把B對象通過spring容器注入導A的bean中,我的理解是bean之間通過依賴spring容器來注
入一些需要的資源。這個也可以說是和ioc是一樣的吧,只是以不同的角度去理解的。
2.常用的IOC的注入方式
2.1 setter方法注入 這種方式運用廣泛
2.2 構造器注入
2.3 接口注入
setter注入:若有兩個類 A類和B類 ,我需要在A類中調用B類的方法 ,B就是一個簡單的類 其只有一個方法bb();
1 public class A{ 2 private B b; 3 public void setB(B b) { 4 this.b = b; 5 } 6 7 public void amethod(){ 8 //這里邊調用B對象的dem01方法 ,若是不用IOC的方式 直接可以new對象調用就可以 9 b.bb(); 10 } 11 12 }
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"
>
<!--set方法注入 把B對象注入到了A中-->
<bean id="a" class="com.myspring.A">
<!-- 解釋一下property標簽 ,其中的name指的事在A中聲明的B 的名字,ref指的是B對應的bean的唯一id -->
<property name="b" ref="b"></property>
<!-- A類找那個定義了B這個屬性,有其setter方法,這樣spring容器就會在初始化的時候把把通過setter方法注入到A中 -->
</bean>
<bean id="b" class="com.myspring.B">
</bean>
</beans>
測試代碼:
1 public static void main(String[] args) { 2 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 3 A a=(A)ac.getBean("a"); 4 a.amethod(); 5 }//結果成功調用了B類的方法
構造方法注入:
1 public class A{ 2 private B b; 3 //注意這里邊沒有生成seter方法,因此不能用setter注入 4 public A(B b){ 5 this.b=b; 6 } 7 public void amethod(){ 8 //這里邊調用B對象的dem01方法 ,若是不用IOC的方式 直接可以new對象調用就可以 9 b.bb(); 10 } 11 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" 8 > 9 <bean id="a" class="com.myspring.A"> 10 <constructor-arg ref="b"></constructor-arg> 11 </bean> 12 <bean id="b" class="com.myspring.B"> 13 </bean> 14 </beans>
這兩種注入方式,比較容易理解 ,配置起來也很簡便,但是假如我需要在A對象中注入很多個對象那,難道還是向上邊那樣一個一個的寫property或constructor-arg 標簽嗎 答案肯定是否定的
其實Spring 有自動裝配這種機制,更加的實用。
3.Spring 的自動裝配
為了提高開發的效率spring提供了自動裝配,其默認是不開啟的,我們可以通過配置autowire屬性來設置適合自己的裝配方式,autowire可以在beans里配置,也可以直接在bean里配置
常用的自動裝配方式有:byname bytype by constructor autudetect no 5種。其中最常用的就是 byname 和 bytype。
通過byName自動裝配
1 public class A{ 2 3 private B ss; 4 5 public void setSs(B ss) { 6 this.ss = ss; 7 } 8 public void amethod(){ 9 ss.bb(); 10 } 11 } 12 <?xml version="1.0" encoding="UTF-8"?> 13 <beans xmlns="http://www.springframework.org/schema/beans" 14 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 15 xmlns:util="http://www.springframework.org/schema/util" 16 xmlns:p="http://www.springframework.org/schema/p" 17 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 18 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" 19 default-autowire="byName"> 20 <!-- spring的自動裝配,其實就是為了解決 property標簽過多帶來的不便 --> 21 <bean id ="a" class="com.myspring.A" ></bean> 22 <bean id ="ss" class="com.myspring.B"></bean> 23 </beans>
代碼解釋:A類的setter方法是必須要有的,Spring會自動尋找與屬性名字“ss”相同的bean(就是在A類中聲明的那個屬性名),找到id為ss的那個bean ,通過setter方法注入到A類中。
byType:
1 public class A{ 2 3 private B ss; 4 5 public void setSs(B ss) { 6 this.ss = ss; 7 } 8 public void amethod(){ 9 ss.bb(); 10 } 11 } 12 <?xml version="1.0" encoding="UTF-8"?> 13 <beans xmlns="http://www.springframework.org/schema/beans" 14 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 15 xmlns:util="http://www.springframework.org/schema/util" 16 xmlns:p="http://www.springframework.org/schema/p" 17 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 18 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" 19 default-autowire="byType"> 20 <!-- spring的自動裝配,其實就是為了解決 property標簽過多帶來的不便 --> 21 <bean id ="a" class="com.myspring.A" ></bean> 22 <bean class="com.myspring.B"></bean> 23 </beans>
代碼解釋:Spring會總動尋找與屬性類型相同的bean,找到后,通過調用setter將其注入。這里邊我沒有給B類的bean 設置id ,就是為了強調 是通過類型去查找的,不需要name.
一旦有兩種相同數據類型的bean被配置,將拋出UnsatisfiedDependencyException異常.
constructor: 設置 default-autowire="constructor" ,其他寫法都是和上邊的一樣,Spring會尋找與參數數據類型相同的bean,通過帶參數的構造函數public A(B b)將其注入。
autodetect:spring首先會尋找是否有帶參的構造函數,若有就會和constructor一樣用 構造器注入,否則就和byype一樣 setter注入:
最常用的是byName 和byType.