代码之家  ›  专栏  ›  技术社区  ›  janetsmith

为什么Spring使用XML进行组件连接?

  •  5
  • janetsmith  · 技术社区  · 17 年前

    我理解国际奥委会的概念,我们可以通过布线来混合和匹配不同的等级。 通过将连接/关系处理委托给基础xml(上下文xml),每个类都可以摆脱硬代码的依赖性。

    我的问题是,为什么我们要使用xml?我们可以使用java类简单地连接所有组件。

    <bean id="helloWorld" class="com.vaannila.HelloWorld">
        <property name="message" value="HelloWorld"></property>
    </bean>
    
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
        helloWorld.display();
    }
    

    我们可以使用

    HelloWorld helloWorld = new HelloWorld();
    helloWorld.setMessage("HelloWorld");
    helloWorld.display();   
    
    7 回复  |  直到 17 年前
        1
  •  8
  •   Jon Skeet    17 年前

    这基本上就是 Guice 需要,是的。

    此外,Spring使用了一个事实,即它都是以声明方式配置的,以支持AOP之类的功能。你 所有这些都是用手做的,但是有点冗长。

        2
  •  5
  •   Nate    17 年前
        3
  •  3
  •   soru    17 年前

    有些人有一个奇怪的想法,XML不是代码,因此与代码有着神奇的不同。有时候你不得不容忍有这种想法的人。

        4
  •  2
  •   Brandon Yarbrough    17 年前

    我想说,Spring支持XML而不是Java的原因是这两种语言用于两种不同的任务。Java是一种编程语言。它的目的是描述算法、程序、控制流等。如果推导程序的结构需要复杂的控制流,那么Java将是一个不错的选择。

    XML有着根本的不同。它不是一种编程语言。它是一种描述有序数据的方法,如烹饪书或矢量图形。如果程序系统的组织和相互依赖关系是静态值,那么XML可能是放置它们的合适位置。

    <book>
      <chapter>It was the best of times, it was the worst of times</chapter>
    </book>
    
    public static void main(String[] args)
    {
        String chapter1 = BookXMLParser.loadChapter(1);
        System.out.println(chapter1);
    }
    

    显然也可以完全用Java完成:

    public static void main(String[] args)
    {
        String chapter1 = "It was the best of times, it was the worst of times");
        System.out.println(chapter1);
    }
    

    显然,这是一个荒谬的例子。书有几百页长。将它们保存在Java代码中是愚蠢的。然而,我会对Spring配置提出相同的论点。我最大的程序之一是SpringXML,总共有数千行。

    当然,肯定有人赞成用Java定义这些东西。最特别的是,IDE将能够更容易地提供关于哪些类正在使用什么的额外帮助,而其他静态分析工具也将更擅长于分析代码中的问题。

    bean1.setName("fred");
    if( System.currentTimeMillis() > 1234567890l ) {
       //Automatically use new feature after next Thursday
       bean1.setNewFeature(1);
    } else if( x > 17 ) {
      switch(y) {
       case POTATO:
         bean1.setNewFeature(0);
         break;
       case POTAHTO:
         bean1.setNewFeature(1);
       case WHO_COULD_ASK_FOR_ANYTHING_MORE_FALLTHROUGH:
         bean1.setFoo(bar);
         break;
       default:
         baz? bean1.setBar(baz) : if(17 > t) 
             { bean1.setNewFeature(q) } else {
              throw new RuntimeException("That's odd...");
             }
      }
    }
    

    好吧,你明白了。很明显,您的代码一开始不会那么糟糕,但您可能会在某个地方使用if语句,然后使用另一个,然后再使用另一个。。。。

        5
  •  0
  •   Brian Agnew    17 年前

    它使您能够在现场自由地修改应用程序的构造或配置。

    所有配置的参数都相同。您可以在代码中完成这一切。但是什么时候合适呢?

        6
  •  0
  •   duffymo    17 年前

    XML不是100%必需的。甚至Spring现在也提供了使用注释的选项。他们会改变你的观点吗?

    由于IoC,Spring可以通过动态代理为您做的所有事情都很难用手写代码为您自己重现。

    Spring碰巧使用XML将配置外部化,但如果您拥有Spring2.5或更高版本,则可以自由使用注释。

    你的问题让我困惑,因为你给出的使用Java代码的示例根本不是IoC。当你用那种方式叫“新”的时候,你没有接线。我建议回去再看一次Martin Fowler的国际奥委会文章: http://www.martinfowler.com/articles/injection.html

        7
  •  -1
  •   matt b    17 年前

    HelloWorld helloWorld = new HelloWorld();
    helloWorld.setMessage("HelloWorld");
    helloWorld.display();
    

    当您的环境中有少量bean时,这可能是有意义的。

    但是,如果你有一个更复杂的环境,在这个环境中,你在春天有几十个或几百个豆子呢?我当前的应用程序在大约四个不同的XML文件中映射了大约205个bean。用代码连接这些将是一场噩梦。