afrag  
          記錄學習和成長的歷程
          日歷
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345
          統(tǒng)計
          • 隨筆 - 9
          • 文章 - 5
          • 評論 - 2
          • 引用 - 0

          導航

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          •  

          積分與排名

          • 積分 - 10202
          • 排名 - 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: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 永顺县| 冕宁县| 吉隆县| 栾城县| 信丰县| 石林| 东乡县| 大竹县| 保德县| 株洲市| 台北县| 横峰县| 乡城县| 麻栗坡县| 行唐县| 卢湾区| 永胜县| 江北区| 多伦县| 道真| 温泉县| 株洲市| 舒城县| 古浪县| 桂林市| 分宜县| 和硕县| 镇平县| 贡山| 商丘市| 三原县| 祁东县| 五峰| 夏津县| 永年县| 武功县| 丰台区| 克山县| 儋州市| 会泽县| 乌鲁木齐市|