java時斷時續之————spring

來源:互聯網
上載者:User

 

Spring架構的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現松耦合。

 

Spring架構的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現松耦合。

    使用IoC,對象是被動的接受依賴類,而不是自己主動的去找。容器在執行個體化的時候主動將它的依賴類注入給它。可以這樣理解:控制反轉將類的主動權轉移到介面上,依賴注入通過xml設定檔在類執行個體化時將其依賴類注入。通過下面的執行個體來逐步的理解:

    首先假設有一個需求,類Business需要調用類Dependency的方法f(),按照日常的做法,得到下面的代碼:
//**類Dependency**
public class Dependency {
    public void f() {};
}
//**類Business**
public  class Business {
    Dependency d;
    public Business() {
    d = new Dependency();
    }
    public void doSth() {
        d.f();
    }
}

    對上述實現做出如下修改:
    首先,將Business裡的Dependency執行個體的獲得該為setter方式,其次,將Dependency類改為某個介面的實現。故可以得到下面新的代碼:
//**介面IDependency**
public interface IDependency {
    void f();
}
//**類Dependency**
public class Dependency {
    public void f() {};
}
//**類Business**
public  class Business {
    IDependency d;
    public Business() {}
    public void doSth() {
     d.f();
    }
    public void setDependency(IDependency d) {
        this.d = d;
    }
}

 

 

    在新的代碼中,首先Business的變數d可以接收任何IDependency的執行個體,另外,Dependency的執行個體不是通過Business來獲得,而是通過setter(也可以用構造器)來由外部傳給它。這似乎跟我們往常的代碼沒什麼不同,但這已經是一個良好的設計。關鍵就是Dependency的執行個體如何從外部注入給Business呢?
這就要通過xml來實現了。

    建立一個SpringFirst.xml,進行簡單的配置:
<beans>
    <bean id = "dependency" class = "aopfirst.business.Dependency" />
    <bean
        id = "business"
        class = "aopfirst.business.Business"
    >
        <property name = "dependency">
            <ref bean = "dependency" />
        </property>
    </bean>
</beans>
    這個設定檔裡將Dependency類和Business類加入,並將Dependency作為Business的一個參數。

    單有了這個xml檔案還不夠,還需要一個測試類別來載入該xml檔案,spring提供了現成的API,在載入上面的xml的時候,就進行了如下工作:執行個體化Dependency類,執行個體化Business類,並將Dependency的執行個體作為參數賦給了Business執行個體的
setDependency()方法。下面是該測試程式:

public class StartServer {
    public static void main(String [] args) {
     ClassPathResource cr = new ClassPathResource("SpringFirst.xml");
     BeanFactory factory = new XmlBeanFactory(cr);
     Business b = (Business)factory.getBean("business");
     b.doSth();
    }
}

    上面的程式載入了xml以後,獲得id為"business"的bean,即Business類的執行個體,並調用了其doSth()方法。由此可見,Business的依賴類Dependency是通過xml來注入的,而且Business是通過介面IDependency來接收Dependency執行個體。因此,當我們又有新的IDependency的實現時,只需要修改xml檔案即可,測試程式只需要根據xml裡的id值來獲得需要的參數。

    總結上面的例子,對控制反轉和依賴注入已經能理解了。依賴類(Dependency)是通過外部(xml)來注入的,而不是由使用它的類(Business)來自己製造,這就是依賴的注入。另一方面,Business對類Dependency的依賴轉移到對介面IDependency的依賴,控制權由類轉移到了介面,即由"實現"轉移到"抽象"中。這就是控制反轉。

其實,依賴性注入(Dependency Injection)和控制反轉(Inversion of Control)二者是同一個概念。具體含義是:當某個角色(可能是一個Java執行個體,調用者)需要另一個角色(另一個Java執行個體,被調用者)的協助時,在傳統的程式設計過程中,通常由調用者來建立被調用者的執行個體。但在Spring/Struct裡,建立被調用者的工作不再由調用者來完成,因此稱為“控制反轉”;建立被調用者執行個體的工作通常由Spring/Struct容器來完成,然後注入調用者,因此也稱為“依賴性注入”。

 

 

spring主要採用了java反射機制,

  Java 反射機制是指Java程式可以在執行期載入,探知,使用編譯期間完全未知的classes.這種機制對與軟體架構的開發非常有效。和我以前在vb中用的callbyname等方法非常類似。

 Java 反射機制主要提供了以下功能:
    1.在運行時判斷任意一個對象所屬的類;
    2.在運行時構造任意一個類的對象;
    3.在運行時判斷任意一個類所具有的成員變數和方法;
    4.在運行時調用任意一個對象的方法;
    5.產生動態代理 

  JDK中,實現反射機制的類在java.lang.reflect包中。

    1. Class 類:代表一個類
       它有以下方法
     (1) getName():
            獲得類的完整名字。
     (2) getFields():
            獲得類的public類型的屬性。
     (3) getDeclaredFields():
             獲得類的所有屬性,包括public、protected、預設和private存取層級的屬性。
     (4) getMethods():
             獲得類的public類型的方法。
     (5) getDeclaredMethods():
              獲得類的所有方法。
     (6) * getMethod(String name, Class[] parameterTypes):
                獲得類的特定方法,name參數指定方法的名字,parameterTypes參數指定方法的參數類型。
    (7) * getConstrutors():
               獲得類的public類型的構造方法。
     (8) * getConstrutor(Class[] parameterTypes):
                獲得類的特定構造方法,parameterTypes參數指定構造方法的參數類型。
     (9) newInstance():
              通過類的不帶參數的構造方法建立這個類的一個對象。

    2. Field 類:代表類的成員變數(類的屬性)。

    3. Method類:代表類的方法。
        Method類的invoke(Object obj,Object args[])方法用於動態執行一個對象的特定方法,
        它的第一個 obj 參數指定具有該方法的對象,第二個args 參數指定向該方法傳遞的參數。

    4. Constructor類:代表類的構造方法。

    5. Array 類:提供了動態建立數組,以及訪問數組元素的靜態方法。

 

1、spring 沒有面向介面編程,其實用處不是特別大,應該逐步改進,而不是為spring而spring

2、spring也是一個容器,容器就是能夠裝載對象的對象

3、spring aop————面向方面編程,可以攔截方法、屬性

5、spring 輕量級模型,  依賴注入

 

Spring與Hibernate的整合天衣無縫

        可以直接配置sessionbean和hibernate xml定義檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.