spring IOC


  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. 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM