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();
}
}