也谈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/) 

posted @ 2012-08-03 19:05  叶尚海  阅读(1378)  评论(2编辑  收藏  举报