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

  • 相关阅读:
    skywalking简介
    .Net Core微服务——Consul(4):搭建集群
    .Net Core微服务——Consul(3):健康检查
    .Net Core微服务——Consul(2):自动扩展、服务调用
    .Net Core微服务——Consul(1):服务发现
    SpringBoot数据访问之整合Mybatis配置文件
    SpringBoot数据访问之Druid启动器的使用
    SpringBoot数据访问之Druid数据源的自定义使用
    Spring Boot核心技术之Restful映射以及源码的分析
    SpringBoot之yaml语法及静态资源访问
  • 原文地址:https://www.cnblogs.com/yeshanghai/p/2622156.html
Copyright © 2011-2022 走看看