Spring概念的解釋和兩個簡單例子

1. 關於輕量重量級的解釋
    夏昕說:現在的輕量級和重量級的確很難區分了,沒有一個明確的衡量標準,之前有人說,有classloader的算是重量級;也有人說,超過3MB的算是重量級,spring core算是輕量級的,但是加上期於的部件,估計就得列入重量記的範疇了。
林信良說:用了spring並不等於輕量級開發。重點是您有沒有采納其精神,用了IOC就輕量級了嗎?不見得。什麼都來不DI,我看也是很沉重的;如果你在設計時善用IoC,即使不用spring也是輕量級。不要爲了spring而spring。
2. IoC的理解
   Don't call me,I will call you!程序不依賴於實現,而是依賴與抽象接口。在設計業務類時,我們設計爲它依賴於某抽象接口,具體的需要哪個實現類是由配置文件來幫我們注入的。這就是面向接口編程的思想,當業務需求發生變動時,我們只需修改其實現類的具體實現,而接口並沒有改變,所以低層業務代碼不做任何改動,既增加了代碼的複用率,也是功能接口變得清晰。Don't call me,you should call my interface!
3. DI 依賴注入的理解
    保留抽象接口,讓組件依賴抽象接口,當組件要與其他實際的對象發生依賴關係時,由抽象接口來注入依賴的實際對象。依賴注入,注入你所依賴的實現類,由 spring容器幫你注入適合的實現類,而不是你自己去創建bean實例。有3種基本實現方式:Interface injection、Setter injection與Constructor injection。
4. 應用程序中獲取bean
1     <bean id="helloBean" class="chapter2.HelloBean">
2         <property name="helloWord">
3             <value>Hello yangay!</value>
4         </property>
5     </bean>

    public static void main(String[] args) {
        Resource rs = new ClassPathResource("applicationContext.xml");//從classpath下加載配置信息
        BeanFactory factory = new XmlBeanFactory(rs);//基於xml格式配置文件的實例化方式,得到一個BeanFactory
        HelloBean hello = (HelloBean)factory.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調用bean裏定義的所有方法
        System.out.println(hello.getHelloWord());
    }
  
    這是通過beanFactory管理Bean的方式,BeanFactory負責讀取Bean定義文件;管理對象的加載、生成;維護Bean對象之間的依賴關係;負責Bean的生命週期,對於簡單的應用程序來說,使用BeanFactory就已經足夠來管理Bean了。BeanFactory接口提供了六個方法管理Bean。
另外還可以通過ApplicationContext來獲取Bean對象:

1 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//從classpath下加載配置信息
2 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調用bean裏定義的所有方法

                            第二章 spring IoC、AOP實例及分析
1. IoC實例一
    控制反轉用得最多的是爲業務類注入Bean對象,典型的應用是在結合struts開發是,爲struts的action類來注入springDao,這樣在業務層如action類中不再介入spring API,但同時又可以利用spring提供的所有便捷功能。低層實現細節發生的變化,對業務層來說是透明的,不但降低了程序的偶合性,而且也提高了DAO 對象的重用性。在這個例子中,爲了簡單起見,我們只爲HelloBean注入了一個字符串,而不是注入實體Bean。但這隻體現出了控制反轉的特點,對於依賴注入DI並沒有得到明顯的體現。
1)首先編寫一個簡單的JAVABEAN
1 public class HelloBean {
2     private String helloWord;

3     public String getHelloWord() {
4         return helloWord;
5     }
6     public void setHelloWord(String helloWord) {
7         this.helloWord = helloWord;
8     }
9 }
2)接下來編寫 Bean定義文件,定義文件告訴spring如何完成以來關係的注入等動作。我們這裏命名文件爲applicationContext.xml,定義文件中省略了xml文件的頭
1     <bean id="helloBean" class="chapter2.HelloBean">//應用程序中用於取得bean的標誌
2         <property name="helloWord">//設置了bean中setter的名稱
3             <value>Hello yangay!</value>//設置了將要注入的值
4         </property>
5     </bean>

3)最後編寫一個簡單的示範程序
1 public class SpringDemo {
2
3     public static void main(String[] args) {
4         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
5         HelloBean hello = (HelloBean)ctx.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調用bean裏定義的所有方法
6         System.out.println(hello.getHelloWord());
7     }
8 }
運行之,將會看到在bean定義文件中爲"helloWord"設置的值"Hello yangay!"被打印出來。
--------------------
2. 1. IoC實例二
    其實spring IoC的初衷就是降低程序的偶合性,使開發者面向接口編程,使業務層設計不以來於實現,具體依賴與哪個bean是在speing培植文件中來定義的。同樣在這裏寫一個示範程序,包括一個接口,兩個實現類,一與業務有關的Business類,Business類依賴的是接口,而不是接口的實現,具體需要哪個實現是由spring容器來實現注入的。
1)接口
只聲明瞭一個保存的方法
1 public interface IDeviceWriter {
2     void svaeToDevice();
3 }
2)第一個實現IDeviceWriter接口的類,存儲到軟盤
1 public class FloppyWriter implements IDeviceWriter{
2
3     public void svaeToDevice() {
4         System.out.println("存儲至軟盤");
5     }
6 }
3)第二個實現IDeviceWriter接口的類,存儲到硬盤
1
2 public class DiskWriter implements IDeviceWriter{
3
4     public void svaeToDevice() {
5         System.out.println("存儲至硬盤");
6     }
7 }

4)業務類,依賴於抽象的IDviceWriter接口,要 存儲到磁盤還是軟盤是由spring配置文件來決定的
 1 public class Business {
 2
 3     private IDeviceWriter writer;
 4     public void save(){
 5         writer.svaeToDevice();
 6     }
 7
 8     public IDeviceWriter getWriter() {
 9         return writer;
10     }
11     public void setWriter(IDeviceWriter writer) {
12         this.writer = writer;
13     }
14 }
5)bean的定義文件
1     <bean id="floppyWriter" class="chapter2.FloppyWriter"/>
2     <bean id="diskWriter" class="chapter2.FloppyWriter"/>
3     <bean id="business" class="chapter2.Business">
4         <property name="writer">
5             <ref bean="floppyWriter"/>
6         </property>
7     </bean>
    將id爲writer的bean注入到business Bean中,在Business對象中可以調用FloppyWriter的所有方法,實現了將數據保存至軟盤的功能。

6)測試類
1 public class SpringDemo2 {
2
3     public static void main(String[] args) {
4         Resource rs = new ClassPathResource("applicationContext.xml");
5         BeanFactory factory = new XmlBeanFactory(rs);
6         Business business = (Business) factory.getBean("business");
7         business.save();
8     }
9 }

    現在如果我們想要把數據保存到硬盤,而不是軟盤了,我們只需要修改bean的配置文件,讓業務類Business依賴於diskWriter既可,Business不做任何的修改。這也是面向接口編程的好處所在。
 

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章