`
lingyunlujixin
  • 浏览: 16849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

IoC小例子(了解一下IoC设计模式入门)

    博客分类:
  • JAVA
阅读更多
(说明:本文中除了Kissable,Boy,Girl这几个类借鉴了网络实例,其他组织均为原创)



IoC是 Spring的的核心设计模式之一。要学习IoC机制,当然可以通过搭建一个Spring框架或者SSH(Struts + Spring + Hibernamte)框架来学习。以入门为目的,仅仅体验一下IoC而写一个IoC小例子的话,并非只有在架起的框架结构下才可以,普通的JAVA APPLICATION就可以实现。



苦于自己对IoC设计模式的无知,急需弄个小例子体验一下。通过网上的例子,经过几个小时的琢磨,完成了自己的JAVA Application实现这么一个例子。

步骤如下:

step 1 .建立如下目录


         D:Temp\IoCTest\src

         D:Temp\IoCTest\lib\





step 2 .搜索所需资源

         spring-context.jar包(在spring框架lib下可以找到,由于是小例子采用什么版本均可)

         spring-support.jar包(在spring框架lib下可以找到)

         spring-beans.jar     (在spring框架lib下可以找到)

         spring-core.jar       (在spring框架lib下可以找到)

         commons-logging.jar(struts框架的lib下可以找到)

         将以上jar包放于step 1 中的D:Temp\IoCTest\lib\目录下。



step 3 .写JAVA代码



写一个接口Kissable:

interface Kissable
{
    void kiss( Object kisser);
}


建立一个实现上述Kissable的类Boy:

class Boy implements Kissable
{
    public void kiss( Object kisser)
    {
        System.out.println("I was kissed by " + kisser);
    }
}



建立一个依赖于上述类Boy的类Girl:

class Girl
{
    private Kissable kissable;

    public Kissable getKissable()
    {
        return kissable;
    }

    public void setKissable( Kissable kissable)
    {
        this.kissable = kissable;
    }

    public void kissSomeone()
    {
        kissable.kiss(this);
    }
}




编写测试主函数:InterfacesTestCase.java

 

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

 

public class InterfacesTestCase
{
    public static void testKissing()
    {
        Girl girl = new Girl();
        girl.setKissable(new Boy());


        girl.kissSomeone();
    }

    public static void main(String[] args) {

        testKissing();
        testKissingIoC();

    }

 

    // 为了与没有使用IoC设计模式的testKissing函数对比
    public static void testKissingIoC()
    {
        ApplicationContext ctx = new
        FileSystemXmlApplicationContext("spring.xml");
        Girl girl = (Girl)ctx.getBean("girl");

        girl.kissSomeone();
    }
}



将以上代码放于step 1 中的D:Temp\IoCTest\src目录下。



step 4 .创建spring.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="girl" class="Girl">
        <property name="kissable">
            <ref local="boy" />
        </property>
    </bean>
    <bean id="boy" class="Boy">
    </bean>
</beans>

将其放在D:Temp\IoCTest\下。



step 5 . 用Ant(基于java的自动化脚本工具)编译运行我们的程序。build.xml如下:



<?xml version="1.0" ?>
<project name="ioc" default="build" basedir=".">
    <property name="base.dir" value="." />
    <property name="src.dir" value="src" />
    <property name="lib.dir" value="lib" />
    <property name="build.dir" value="classes" />

    <path id="myclasspath">
        <fileset dir="${lib.dir}">
            <include name="*.jar" />
        </fileset>
        <!--pathelement location="${build.dir}" /-->
     </path>

     <target name="init">
         <mkdir dir="${build.dir}" />
     </target>

     <target name="build" depends="init" description="compile the source files">
         <javac classpathref="myclasspath" srcdir="${src.dir}" destdir="${build.dir}" />
         <copy todir="${build.dir}" >
             <fileset dir="${src.dir}" >
                 <exclude name="*.java"/>
             </fileset>
         </copy>
      </target>
      <target name="run" depends="build">
          <java classpathref="myclasspath" classpath="${build.dir}" classname="InterfacesTestCase" fork="true" />
      </target>
      <target name="clean">
          <delete includeEmptyDirs="true">
              <fileset dir="${build.dir}" />
          </delete>
      </target>
</project>




step 6 .此时组成如下目录结构:



└─IoCTest
    │  build.xml
    │  spring.xml
    │
    ├─lib
    │      commons-logging.jar
    │      spring-beans.jar
    │      spring-context.jar
    │      spring-core.jar
    │      spring-support.jar
    │    
    └─src
            Boy.java
            Girl.java
            InterfacesTestCase.java
            Kissable.java



step 7 .命令行模式下切换到目录D:\Temp\IoCTest\下

如果你已经配置了ant_home 和 path变量,那么直接在命令行下运行「ant run」命令即可;如果没有配置ant相关环境变量,可以如下进行配置:

假设你的ant安装目录是:D:\apache-ant\
set ANT_HOME=D:\apache-ant\
set path=%path%;%ANT_HOME%\bin


配置之后,运行「ant run」命令。



运行结果如下(其中有意义的部分已经标记为红色)



[java] I was kissed by Girl@14318bb (注:此处为非IoC模式的输出)
     [java] 2008-12-18 16:52:07 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
     [java] 信息: Loading XML bean definitions from file [D:\TEMP\j\ioc\IoCTest\spring.xml](这里spring.xml文件的路径为什么是IoCTest目录而不是classes目录,因为我的测试类InterfacesTestCase编译完以后是在classes目录下,谁知道为什么,可以告诉我。这里我很不明白。)
     [java] 2008-12-18 16:52:08 org.springframework.context.support.AbstractRefreshableApplicationContext refreshBeanFactory
     [java] 信息: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext;hashCode=3327002]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [girl,boy]; root of BeanFactory hierarchy
     [java] 2008-12-18 16:52:08 org.springframework.context.support.AbstractApplicationContext refresh
     [java] 信息: 2 beans defined in application context [org.springframework.context.support.FileSystemXmlApplicationContext;hashCode=3327002]
     [java] 2008-12-18 16:52:08 org.springframework.core.CollectionFactory <clinit>
     [java] 信息: JDK 1.4+ collections available
     [java] 2008-12-18 16:52:08 org.springframework.context.support.AbstractApplicationContext initMessageSource
     [java] 信息: Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@4a5ab2]
     [java] 2008-12-18 16:52:08 org.springframework.context.support.AbstractApplicationContext initApplicationEventMulticaster
     [java] 信息: Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@e53108]
     [java] 2008-12-18 16:52:08 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
     [java] 信息: Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [girl,boy]; root of BeanFactory hierarchy]
     [java] I was kissed by Girl@117a8bd (注:此处为IoC模式的输出)



此时,目录结构为:


└─IoCTest
    │  build.xml
    │  spring.xml
    │  t.txt
    │
    ├─classes
    │      Boy.class
    │      Girl.class
    │      InterfacesTestCase.class
    │      Kissable.class
    │    
    ├─lib
    │      commons-logging.jar
    │      spring-beans.jar
    │      spring-context.jar
    │      spring-core.jar
    │      spring-support.jar
    │    
    └─src
            Boy.java
            Girl.java
            InterfacesTestCase.java
            Kissable.java



完毕。以上例子经测试可以运行,有兴趣的朋友可以看一下。觉得写的已经够详细了。

源代码可以从附件中下载,问题有的话,email:lingyunlujixin@163.com。Thanks。

注:转载请标明文章出处。
2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics