<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
    統(tǒng)計
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10163
    • 排名 - 2380

    最新評論

    閱讀排行榜

    評論排行榜

     

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

    IoC的應用示例

    例如,實現(xiàn)一個男人給一個女人送花的程序。

    首先定義花的接口。

    public interface Flower {

        public String getName();

    }

     

    然后實現(xiàn)一種特定的花——玫瑰花。

    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現(xiàn)在和Rose是緊耦合的。修改如下:

    public class Man{

        public Man() {

        }

     

        public void sendFlower(Woman woman){

            Flower flower = new Lily();

            woman.recieveFlower(flower);

        }

    }

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

     

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

    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)  編輯  收藏

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


    網(wǎng)站導航:
     
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 最新亚洲精品国偷自产在线| 亚洲精品视频在线观看免费| 亚洲成在人线在线播放无码| 99久久免费国产精品特黄| 亚洲精品乱码久久久久久下载| 人人揉揉香蕉大免费不卡| 亚洲av午夜福利精品一区人妖| 免费h视频在线观看| 亚洲成亚洲乱码一二三四区软件| 久久福利青草精品资源站免费| 亚洲AV无码久久精品成人| 99re6在线精品视频免费播放 | 手机看片国产免费永久| 自拍偷自拍亚洲精品情侣| 两个人看的www免费视频中文| 亚洲无线码一区二区三区| 一级做a爰全过程免费视频| 亚洲日韩乱码中文无码蜜桃| 免费99精品国产自在现线| 亚洲精品无码永久在线观看男男| 日韩在线免费看网站| 午夜免费国产体验区免费的| 精品国产_亚洲人成在线高清| 久9这里精品免费视频| 亚洲制服丝袜第一页| 国产一级淫片a免费播放口之| 日本永久免费a∨在线视频| 亚洲国产精彩中文乱码AV| 四虎最新永久免费视频| 日本亚洲中午字幕乱码| 亚洲AV无码欧洲AV无码网站| 欧洲黑大粗无码免费| 日日摸夜夜添夜夜免费视频| 亚洲AV无码AV男人的天堂| 成人免费一级毛片在线播放视频| 疯狂做受xxxx高潮视频免费| 久久久久久a亚洲欧洲aⅴ| 九九精品免费视频| 2022免费国产精品福利在线| 91亚洲一区二区在线观看不卡| 国产精品免费_区二区三区观看|