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

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

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

    afrag  
    記錄學習和成長的歷程
    日歷
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789
    統計
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10261
    • 排名 - 2370

    最新評論

    閱讀排行榜

    評論排行榜

     

    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 閱讀(308) 評論(0)  編輯  收藏

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


    網站導航:
     
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲AV综合色区无码一区爱AV| 成人免费午夜在线观看| 亚洲av无码不卡私人影院| 亚洲色大成网站WWW国产| 久久久久久久久免费看无码| 亚洲制服丝袜一区二区三区| 免费国产作爱视频网站| 亚洲最大的黄色网| 成人性生免费视频| 亚洲码欧美码一区二区三区| 精品免费国产一区二区三区| 国产午夜亚洲精品不卡| 亚洲狠狠爱综合影院婷婷| a毛片成人免费全部播放| 亚洲午夜国产精品无码| 精品亚洲永久免费精品| 4444亚洲国产成人精品| 免费av欧美国产在钱| 疯狂做受xxxx高潮视频免费| 久久精品亚洲福利| 免费看又黄又无码的网站| 亚洲白色白色永久观看| 全免费a级毛片免费**视频| 美女18毛片免费视频| 亚洲欧洲∨国产一区二区三区| 国产成人一区二区三区视频免费| 亚洲综合小说久久另类区| 成人毛片18女人毛片免费 | 亚洲熟女精品中文字幕| 国产网站免费观看| 女人隐私秘视频黄www免费| 99ri精品国产亚洲| 日韩高清在线免费观看| 久久免费观看视频| 亚洲精品不卡视频| 免费很黄很色裸乳在线观看| 在线涩涩免费观看国产精品 | 亚洲AV永久无码天堂影院 | 国产区卡一卡二卡三乱码免费| 国产精品免费αv视频| 亚洲欧洲日韩在线电影|