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://yeshanghai.ueuo.com/