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