<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    afrag  
    記錄學習和成長的歷程
    日歷
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567
    統計
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10157
    • 排名 - 2379

    最新評論

    閱讀排行榜

    評論排行榜

     

    Inversion of Control (IoC),直接翻譯過來是控制反轉。那么到底是什么控制被反轉了呢?傳統的,一個對象A如果需要使用對象BBA的依賴),那么A要負責去獲取B的引用,這樣會導致高耦合、難以測試的代碼。所謂的控制反轉,就是A不負責去獲取B的引用,而是由外部實體(負責安排、調整系統中的各個對象的外部實體)來給它它所需要的依賴。所以,控制反轉又叫做依賴注入(dependency injection)。

    IoC的應用示例

    例如,實現一個男人給一個女人送花的程序。

    首先定義花的接口。

    public interface Flower {

        public String getName();

    }

     

    然后實現一種特定的花——玫瑰花。

    public class Rose implements Flower{

        private String name = "Rose";

        public Rose() {

        }

       

        public String getName(){

            return name;

        }

    }

     

    然后是男人和女人。

    public class Man{

        public Man() {

        }

     

        public void sendFlower(Woman woman){

            Flower flower = new Rose();

            woman.recieveFlower(flower);

        }

    }

     

    public class Woman {

        public Woman() {

        }

       

        public void recieveFlower(Flower flower){

            if ("Rose".equals(flower.getName())){

                System.out.println("Oh, thanks” + flower.getName() +  “ is my favorate flower!");

            }

            else{

                System.out.println("Thanks! What's a beautiful " flower.getName());

            }

        }

    }

    最后是主應用程序。

    public class HelloApp {

        public HelloApp() {

        }

     

        public static void main(String[] args) throws Exception{

            Man man = new Man();

           

            Woman woman = new Woman();

           

            man.sendFlower(woman);

        }

    }

     

    看起來沒有什么問題吧,程序運行也是正常的。但是,如果你想測試一下送百合的效果,怎么辦?

    首先,需要添加一個百合類。

    public class Lily implements Flower{

        private String name = "Lily";

        public Lily() {

        }

       

        public String getName(){

            return name;

        }

    }

    但是這個還是不夠的,你還需要修改Man類。因為Man現在和Rose是緊耦合的。修改如下:

    public class Man{

        public Man() {

        }

     

        public void sendFlower(Woman woman){

            Flower flower = new Lily();

            woman.recieveFlower(flower);

        }

    }

    每次你需要換一種花的時候,都需要重新修改、編譯Man類。

     

    如果使用SpringIoC,則可以將Man函數修改如下:

    import java.io.FileInputStream;

    import org.springframework.beans.factory.BeanFactory;

    import org.springframework.core.io.InputStreamResource;

    import org.springframework.beans.factory.xml.XmlBeanFactory;

    import org.springframework.core.io.Resource;

    public class Man{

        public Man() {

        }

     

        public void sendFlower(Woman woman) throws Exception{

            FileInputStream fileInputStream = new FileInputStream("hello.xml");

            Resource resource = new InputStreamResource(fileInputStream);

     

            BeanFactory factory = new XmlBeanFactory(resource);

     

            Flower flower = (Flower)factory.getBean("flower");

           

            woman.recieveFlower(flower);

        }

    }

     

    hello.xml文件如下:
    <?xml version="1.0"?>

    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN//EN"

             "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>

             <bean id="flower"

                       class = "chapter01.hello.Rose">

             </bean>

    </beans>

     

    如果你需要送百合,只需要將xml文件中的<bean id="flower" class = "chapter01.hello.Rose">改成<bean id="flower" class = "chapter01.hello.Lily">,不需要重新編譯程序。

    再最后的Man的版本中,Man獲得的是一朵花,這朵花是由Spring框架給他的。也就是說,具體獲得什么花,是由Spring框架控制,而不是由Man控制。

    posted on 2005-10-29 16:29 afrag 閱讀(305) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 免费人成视频在线观看视频| 免费成人福利视频| 国产yw855.c免费视频| 亚洲美国产亚洲AV| 国产在线98福利播放视频免费| 亚洲成a∨人片在无码2023| 成人爱做日本视频免费| 精品国产日韩亚洲一区91| 国产v片免费播放| yellow视频免费在线观看| 亚洲精品无码久久千人斩| 日本免费人成网ww555在线| 亚洲精品高清视频| 麻豆一区二区免费播放网站| 亚洲色欲色欲www在线播放| 夜色阁亚洲一区二区三区| 久久久久久久国产免费看| 亚洲欧洲国产精品你懂的| 91免费人成网站在线观看18| 亚洲日本VA午夜在线电影| 亚洲精品无码av天堂| 免费在线看黄的网站| 久久精品国产99国产精品亚洲| 国产成人免费a在线视频色戒| 国产免费福利体检区久久| 97久久精品亚洲中文字幕无码| 国产成人A在线观看视频免费 | 亚洲成a人片在线播放| 光棍天堂免费手机观看在线观看 | 成人无码a级毛片免费| 亚洲视频小说图片| 国产色爽免费视频| 免费成人高清在线视频| 亚洲色大成网站www尤物| 亚洲中文字幕久久精品无码喷水 | 91免费国产在线观看| 免费无码又爽又黄又刺激网站| 麻豆亚洲AV永久无码精品久久| 免费高清在线影片一区| 东北美女野外bbwbbw免费| 亚洲AV无码成人专区|