`
lahmygc
  • 浏览: 5867 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

1
2
分享到:
评论
2 楼 lahmygc 2012-08-12  
huangyunbin 写道
感觉你的例子说的是个抽象工厂方法而已

其实springIOC就是为了解耦我们的对象,就是实例不依赖某个对象,这里通过配置文件去动态注入要实现的类,也就是IOC的精髓,而这种实现必须依赖接口,这就跟抽象工厂方法有点像了
1 楼 huangyunbin 2012-08-07  
感觉你的例子说的是个抽象工厂方法而已

相关推荐

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,ioc aop

    浅谈Spring IoC容器的依赖注入原理

    主要介绍了浅谈Spring IoC容器的依赖注入原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈springioc实例化bean的三个方法

    下面小编就为大家带来一篇浅谈springioc实例化bean的三个方法。小编觉得挺不错的,现在就想给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈spring ioc的注入方式及注入不同的数据类型

    主要介绍了浅谈spring ioc的注入方式及注入不同的数据类型,具有一定借鉴价值,需要的朋友可以参考下

    myspring.rar

    手工撸一个springIOC框架,对于理解springIOC的原理有很大的帮组,特别是想学习spring框架的同学,特别是spring的启动原理。

    小米_spring1

    1、Spring中自动装配的方式有哪些 3、springIOC原理是什么 4、谈一下autowired 和resource区别是什么 5、介绍一下bean的生命

    Spring.net框架

    在Step3到Step5的例子中,我们将利用Spring.net提供的Ioc框架,轻松完 成解耦以及系统改造等工作。 一、类之间的依赖 我们的第一个例子主要用于说明程序的基本构造,并且作为一个反面典型,引出为什么要解耦,以及...

    Java轻量级IOC框架Guice

    Guice是由Google大牛Bob lee开发的一款轻量级的java IoC容器。...  在我们谈到IOC框架,首先我们的话题将是构造,属性以及函数注入方式,Guice的实现只需要在构造函数,字段,或者注入函数上标注@I

    基于SpringBoot+Vue实现学生选课管理系统前后端分离源码+数据库文件分享

    所谓事实标准就是虽然 Java 官方没有说它就是开发标准,但是在当前 Java 开发的众多项目中,当我们谈到产品级的 Java 项目的时候,大多都是基于 Spring 或者应用了 Spring 特性的。 Spring 基于 IOC 和 AOP 两个...

    ssh商城代码

    言归正传Spring+Struts+Hibernate是越来越少了Spring+SpringMVC+Mybatis的更多Spring,怎么都得用的,IOC,AOP,事务管理都太宝贝了。struts太重太繁琐,SpringMVC各方面,完胜,没接触过struts2,不评。Hibernate太...

    大厂面试专栏,冲击大厂必备

    面试技巧、职业规划、谈薪资 第七篇:Redis 缓存那点破事 !单线程、数据类型、淘汰机制、集群模式 第八篇:MySQL 那点破事!索引、SQL调优、事务、B+树、分库分表 第九篇:Mybatis 那点破事! ORM,动态SQL、动态...

    一些比较经典的java面试题

    1、JSP有哪几个内置对象? 2、Servlets的生命周期?...请谈一下AOP、IOC是如何应用的? 4、习惯哪个数据库,简述? 5、采用什么测试方法(是用工具测试?还是手动测试?)? 6、简答对Struts认识? ……

    Expert One-on-One J2EE Development without EJB

    再譬如说,书中着力介绍的Spring、Hibernate、WebWork等都是时下流行的开源框架,IoC、AOP之类都是时下流行的概念词汇。而最大的看点就赫然摆在这本书的封面上:“without EJB”。我们曾经在无数的书籍和文章中看到...

    MyEclipse 6 Java 开发中文教程.pdf

    本人人为电子文档编写“细腻而全面”的介绍了在MyEclipse工具下开发项目各个发面。 本书的 ...第十章重点介绍 Spring 的 IOC,AOP和整合Hibernate 的开发; 下过,看过后,你再回来顶一下我的资源吧。

    JAVA自学之路

    Spring IOC + AOP, 面向对象 + 面向切面,完善的旅程。 把以前自己的小项目加入Struts、Spring、Hibernate的元素吧。 去研究各种商业项目的业务逻辑吧,才能在你的简历中加入浓重的一笔。 EJB3.0,java在走了...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

Global site tag (gtag.js) - Google Analytics