分享Java快乐

我有一份快乐,分给你一些;我还是有一份快乐,你也有一份快乐。

mxj ID:javamxj
522510次访问,排名78好友0人,关注者13
javamxj的文章
原创 82 篇
翻译 0 篇
转载 0 篇
评论 720 篇
javamxj的公告

    版权声明:在此发表的有关文章均属本人javamxj原创,转摘或引用请注明出处。



联系方式:
Email:
javamxj@gmail.com

友情Blog

最近评论
linuxghs:删除configuration,eclipse不能启动了。郁闷
xinghui100:学习中
IvonXiao:谢谢博主的分享
xkpkhu:wow power leveling
xkpkhu:wow power leveling
文章分类
收藏
    相册
    有空逛逛
    java开源大全(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 快速上手Spring--2.HelloWorld(2)收藏

    新一篇: 快速上手Spring--3. 加载Bean的配置文件 | 旧一篇: 快速上手Spring--2.HelloWorld(1)

    这是第二部分。
    3. 采用“工厂模式”
     
    · 新建一个包,包名:javamxj.spring.beginning2,在这个包下,新建一个“Hello”接口,这个接口含有一个方法。 

    Hello.java

    package javamxj.spring.beginning2;

    public interface Hello {
        void sayHello();
    }
     
    · 分别新建两个类,实现这个接口。
    HelloWorld.java
    package javamxj.spring.beginning2;

    public class HelloWorld implements Hello {

        public void sayHello() {
            System.out.println("Hello World!");
        }
    }
     

    HelloJavamxj.java

    package javamxj.spring.beginning2;

    public class HelloJavamxj implements Hello {

        public void sayHello() {
            System.out.println("Hello, javamxj!");
        }
    }
     
    · 建立一个工厂类,调用上面两个实现接口的子类。 

    HelloFactory.java

    package javamxj.spring.beginning2;

    public class HelloFactory {

        public Hello getHello(String hello) {

            if (hello.equals("world"))
                return new HelloWorld();
            else if (hello.equals("javamxj"))
                return new HelloJavamxj();
            else
                throw new IllegalArgumentException("输入参数错误!");
        }
    }
     
    · 最后,利用工厂类,测试一下。

    Test.java

    package javamxj.spring.beginning2;

    public class Test {
        public static void main(String[] args) {

            Hello hello = null;
            HelloFactory factory = new HelloFactory();

            hello = factory.getHello("world");
            hello.sayHello();

            hello = factory.getHello("javamxj");
            hello.sayHello();
        }
    运行Test,控制台输出如下语句:
    Hello World!
    Hello, javamxj!
     
     
     
    4. Setter Injection
     
    讲了这么多,似乎一点都不关Spring的事,别急,下面就看看用Spring是如何实现的。
     
    · 新建一个包,包名:javamxj.spring.beginning3
    · 在这个包下,新建一个HelloBean的类,这个类有一个属性:helloWorld属性,这个属性只是一个字符串。可以通过setHelloWorld方法设置这个属性,getHelloWorld方法得到这个属性。

    HelloBean.java

    package javamxj.spring.beginning3;

    public class HelloBean {

        private String helloWorld = "Hello!World!";

        public void setHelloWorld(String helloWorld) {
            this.helloWorld = helloWorld;
        }

        public String getHelloWorld() {
            return helloWorld;
        }

    }
     
    · 同样,在这个包下,建立一个XML文件,它是Spring配置文件。

    bean.xml

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
        <bean id="helloBean" class="javamxj.spring.beginning3.HelloBean">
            <property name="helloWorld">
                <value>Hello! Javamxj!</value>
            </property>
        </bean>
    </beans>
     
      Spring配置文件必须遵循spring-beans.dtd定义的内容模型。
     
      这个XML文件在Spring容器中声明了一个HelloBean的实例,并且将它的helloWorld属性设置为“Hello! Javamxj!”。
      分析这个XML文件,位于根部的是<beans>元素,它是任何Spring配置文件的根元素。<bean>元素用于告诉Spring容器一个类以及它是如何配置的。这里,id属性用于为Bean helloBean命名,而class属性指定了这个Bean的全限定类名。
      在<bean>元素内,<property>元素用于设置一个属性,在本例中它是helloWorld属性。通过使用<property>,我们告诉Spring容器当设置这个属性时调用setHelloWorld方法。greeting属性的值定义在<value>元素内。在这里我设置为“Hello! Javamxj!”。
     
      bean.xml必须在您的CLASSPATH可以存取到的目录中。
     
     
     
    · 新建Main.java,测试一下。

    Main.java

    package javamxj.spring.beginning3;

    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;

    public class Main {
        public static void main(String[] args) {

            // 直接调用HelloBean
            HelloBean helloBean = new HelloBean();
            System.out.println(helloBean.getHelloWorld());

            // 利用Spring调用HelloBean
            Resource res = new ClassPathResource("javamxj/spring/beginning3/bean.xml");
            BeanFactory factory = new XmlBeanFactory(res);

            helloBean = (HelloBean) factory.getBean("helloBean");
            System.out.println(helloBean.getHelloWorld());
        }
    }
     
      这里使用的BeanFactory类就是Spring容器。在将hello.xml文件装入容器后,main方法调用BeanFactory的getBean方法检索出了helloBean服务的一个引用。通过这个引用,它调用了getHelloWorld方法。当我们运行这个Hello应用时,它会打印出“Hello! Javamxj!”。
     
     
    · 另外,为了更好的调试程序,了解运行机理,建立一个log4j.properties,放在src目录下。 

    src/log4j.properties

    log4j.rootLogger=warn, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%c{1} - %m%n 
     
     
     
     
    5. Constructor Injection
     
    · 新建一个包,包名:javamxj.spring.beginning3
    · 新建一个HelloBean.java文件,可以与Setter Injection中的HelloBean比较一下,注意是通过Constructor设置helloWorld属性值的。

    HelloBean.java

    package javamxj.spring.beginning4;

    public class HelloBean {

        private String helloWorld;

        public HelloBean(String helloWorld) {
            this.helloWorld = helloWorld;
        }

        public void sayHello() {
            System.out.println(helloWorld);
        }
    }
     
    · 同样,在这个包下,也需要一个Spring配置文件。

    bean.xml

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>
        <bean id="helloBean" class="javamxj.spring.beginning4.HelloBean">
            <constructor-arg>
                <value>Hello! Javamxj!</value>
            </constructor-arg>
        </bean>
    </beans>
       这里通过<constructor-arg>来表示将使用 constructor injection。如果constructor的参数不只一个,那么需要利用index属性指定参数的位置索引,即<constructor-arg index="索引值">,索引值从0开始。 
     
    · 测试一下。 

    Main.java

    package javamxj.spring.beginning4;

    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;

    public class Main {
        public static void main(String[] args) {

            Resource res = new ClassPathResource("javamxj/spring/beginning4/bean.xml");
            BeanFactory factory = new XmlBeanFactory(res);

            HelloBean helloBean = (HelloBean) factory.getBean("helloBean");
            helloBean.sayHello();
        }
    }
     
     
     
       这样,通过BeanFactory的getBean方法,以及xml配置文件,避免了在Main类中直接实例化HelloBean,消除了应用程序(Main)与服务(HelloBean)之间的耦合,实现了IOC(控制反转)或者说实现了依赖的注射(Dependency Injection)。
      
       Setter Injection和Constructor Injection都有自己的长处和不足。至于,是选择Setter Injection,还是选择Constructor Injection?在《Spring in Action》、《Inversion of Control Containers and the Dependency Injection pattern》和《Spring开发指南》都有比较详细的论述,这里就不多说了。

    发表于 @ 2005年06月27日 17:20:00|评论(loading...)|编辑

    新一篇: 快速上手Spring--3. 加载Bean的配置文件 | 旧一篇: 快速上手Spring--2.HelloWorld(1)

    评论

    #Anubis 发表于2005-06-28 09:52:00  IP: 61.186.252.*
    《Spring开发指南》中关于两种方式的评价
    <注>type2=Setter Injection; type3=Constructor Injection
    ///////////////////////////////////
    几种依赖注入模式的对比总结
    接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如
    其他两种注入模式,因而在IOC的专题世界内并不被看好。
    Type2和Type3型的依赖注入实现则是目前主流的IOC实现模式。这两种实现方式各有特点,也各具
    优势(一句经典废话J)。
    Type2 设值注入的优势
    1. 对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直
    观,更加自然。
    2. 如果依赖关系(或继承关系)较为复杂,那么Type3模式的构造函数也会相当庞大(我们需
    要在构造函数中设定所有依赖关系),此时Type2模式往往更为简洁。
    3. 对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts
    中的Action),此时Type3类型的依赖注入机制就体现出其局限性,难以完成我们期望的功
    能。
    SpringFrameWork Developer’s Guide Version 0.6
    October 8, 2004 So many open source projects. Why not Open your Documents?
    Type3 构造子注入的优势:
    1. “在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type3无疑是最好的
    响应者。
    2. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,
    更加易读。
    3. 由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于
    相对“不变”的稳定状态,无需担心上层代码在调用过程中执行setter方法对组件依赖关系
    产生破坏,特别是对于Singleton模式的组件而言,这可能对整个系统产生重大的影响。
    4. 同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。
    对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的
    层次清晰性提供了保证。
    5. 通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量
    依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的
    先决条件是组件的DataSource及相关资源已经被设定。
    可见,Type3和Type2模式各有千秋,而Spring、PicoContainer都对Type3和Type2类型的依赖注
    入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type3类型为主,辅之以Type2
    类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,
    Type2使用更加广泛。
    //////////////////////////////////////
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © javamxj