zoukankan      html  css  js  c++  java
  • 也谈SpringIOC

    SpringIOC到底是啥玩意儿,我在这里就不再赘述,网上可以找到好多版本来描述它。它到底有啥好,简单来说就是增强了程序的健壮性和可维护性,再简单点说就是不改变原有代码,实现新的逻辑(太夸张了吧,这也可以?是的,SpringIOC真就这么做到了,这也是为什么今年来Spring得到推崇的原因之一,当然还有SpringAOP、SpringMVC等等)。下面我将用最简单的例子阐述SpringIOC到底是如何做到这一点的。

    首先我有这样一个需求就是,我有一个Chinese类,Chinese类有一个方法叫color(),他将显示中国人的肤色。具体代码如下:

    1 public class Chinese{
    2     public void color() {
    3         System.out.println("肤色是黄色的");        
    4     }
    5 }

    然后我有一个Test类,具体代码如下:

    1 public class Test {
    2     public static void main(String[] args) {
    3         Chinese chinese = new Chinese();
    4         chinese.color();
    5     }
    6 }

    很显然,最后控制台输出的是“肤色是黄色的”。

    现在我想让中国人的肤色变成白色,即控制台最后输出“肤色是白色的”。很简单呀,改一下Chinese类的color方法就可以了。没错,这样是可以做的,但这样就破坏了程序的健壮性和可维护性,我们要不改动原来的代码就实现新的需求,这才叫牛逼!那怎么做呢,按照这样的类设计是无法办到的,这时我们想到面向接口的编程思想,我们定义一个Human接口,它有一个color方法显示肤色,但具体是什么肤色我们不知道,具体代码如下:

    1 public interface Human {
    2     public void color();
    3 }

    然后我们修改一下Chinese类,让它去实现Human接口:

    1 public class Chinese  implements Human{
    2     @Override
    3     public void color() {
    4         System.out.println("肤色是黄色的");        
    5     }
    6 }

    当然我们的Test类也要修改:

    1 public class Test {    
    2     public final static String CHINESE = "Chinese";    
    3     public static void main(String[] args) {
    4         ApplicationContext ctx = new FileSystemXmlApplicationContext("src/bean.xml");
    5         Human human = (Human) ctx.getBean(CHINESE);
    6         human.color();
    7     }
    8 }

    我们看到Chinese类的具体实例是从bean.xml中得到的:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    5     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    6     <bean id="Chinese" class="com.andy.test.Chinese"/>    
    7 </beans>

    这样Test类的测试结果也是在控制台打印“肤色是黄色的”。

    好的,现在我们重新定义一个类Chinese2,同样去实现Human:

    1 public class Chinese2  implements Human{
    2     @Override
    3     public void color() {
    4         System.out.println("肤色是白色的");        
    5     }
    6 }

    不同的是我们现在的肤色是白色的。到此为止我们并没有改动任何原来的代码,只是新增了一个类Chinese2。

    好,现在就是见证奇迹的时刻,我们将刚才bean.xml中的bean的class指向Chinese2,即:

    <bean id="Chinese" class="com.andy.test.Chinese2"/>

    我们并没有改动原来的代码哦,亲(^_^)。重新执行Test.java,你会神奇的发现控制台打印的是“肤色是白色的”。至此,你已经发现SpringIOC的无穷魅力,当然它也并非完美无缺,这种方式虽增强了代码的健壮性和可维护性,可因为它是利用java反射动态获取类实例,这样效率上会打点折扣,当然这点牺牲还是值得的,具体看你如何权衡。

    完整源码可从我的googlecode svn下载:http://andy-dreamer.googlecode.com/svn/trunk/SpringIOC

    (在不断的尝试中总结经验,以帮助后面的人更快的上路,http://zhs.guohe.in/) 

  • 相关阅读:
    你所选择的栏目与当前模型不相符请选择白色的选
    DEDECMS首页调用图片集里的多张图片
    dedecms内容页调用图片集文档的图集图片
    Sublime Text 使用介绍、全套快捷键及插件推荐
    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
    nutch
    ant安装
    selenium经过WebDriverWait实现ajax测试
    查看当前android设备已安装的第三方包
    批处理学习总结之常用符号
  • 原文地址:https://www.cnblogs.com/yeshanghai/p/2622156.html
Copyright © 2011-2022 走看看