1. 程式人生 > >spring核心機制

spring核心機制

  核心機制是以BeanFactory為基礎,管理bean與benn之間的依賴的.Spring以bean防是組織管理java應用中的各元件,元件之間的依賴關係鬆耦合執行良好.這依賴與spring德核心機制:依賴注入.Spring使用BeanFactory作為應用中富者生產和管理各種元件的工廠,同事也是元件執行的容器.BeanFactory根據配置的檔案確定容器中bean的實現.管理bean之間的關係.

  將bean對bean實現類的依賴解耦,變成對介面的依賴,程式從面向具體的類的程式設計,轉向程式設計面向介面的程式設計,極大的降低應用中的元件的耦合.

spring能有效的組織j2ee應用各層的物件.不管是控制層的actiong物件.還是業務層的service物件.還有持久層的dao物件,都可以在aispring的管理機制下有機協調的執行,spring將各層的物件以鬆耦合的訪華四組織在一起.阿香體哦那個物件無需關心service.

依賴注入(Dependency Injection)和控制反轉(Inversion of contro)是同一個概念,具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個java例項,被呼叫者)的協助的時候.在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項,但在spring裡面,建立被呼叫者的工作不再有呼叫者來完成.因此稱為控制反轉.建立被呼叫者實力的工作通常由spring容器來完成.然後注入呼叫者.因此也稱為依賴注入.

原理程式碼簡單重現:

設定注入:

   設定注入是指通過setter方法傳入被呼叫者的例項,這彙總注入方式簡單,直觀,因而在spring的依賴注入裡面大量使用.以下是一個Person介面:

//定義Person介面

Public interface Person

{

   //person接口裡面定義的一個使用斧子的方法

   public void useAxe();

}

____________________________________________________________________

public interface Axe

{

  //Axe接口裡面有個砍的方法

  public void chop();

}

____________________________________________________________________

Person的實現類如下:

public ckass Chinese implements Person

{

  private Axe axe;//面向Axe介面程式設計,而不是具體實現類.

  public Chisese(){//預設構造器

  }

  //設定注入所需的setter方法

    public void serAxe(Axe axe)

  {

    this.axe = axe;

  }

   //實現person介面類的useAxe方法

    public void useAdxe(){

    System.out.pringln(axe.chop());

  }

}

____________________________________________________________________

//Axe的第一個實現類 StoneAxe

public class StoneAxe implements Axe

{

   //預設構造器

   public StoneAxe(){}

   //實現Axe介面的chop方法

   public Stirng chop()

   {

      return "用勢頭斧子去砍柴";

   }

}

____________________________________________________________________

下面是關鍵,是採用spring的配置檔案將person例項和Axe例項組織在一起,配置如下:

____________________________________________________________________

<!--Spring 配置檔案的根元素 -->

<beans>

  <!-定義第一bean,該bean得id失chidese,class指定該bean例項的實現類 -->

  <bean id = "chainese" class="lee.Chinese">

 <!-property元素用來指定需要容器注入的屬性,axe屬性需要容器注入,此處是沒有設定注入,因此Chisese類必須擁有setAxe方法 -->

<property name = "axe">

<!-- 此處將另一個bean的引用注入給chinese bean -->

<ref local = "stoneAxe"/>

</property>

</bean>

<!-- 定義stoneAxe bean -->

<bean id = "stoneAxe" class ="lee.StoneAxe"/>

</beans>

下面看主程式部分:

public class BeanTest

{

   public static void main(Sting[] args) throws Exveption

  {

      //因為是獨立的應用程式,顯式地市厲害spring的上下文

      ApplicationContext ctx = new FileSystemXmlApplicationContest("bean.xml")

      //通過Person Bean的id來獲取bean例項,面向介面程式設計.因此,此處通過強制型別轉換為介面型別

      Person p = (Person)ctx.getBean("chinese");

     //直接執行Person的useAxe()方法

     p.useAxe();

  }