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定義檔案。