`
lahmygc
  • 浏览: 6013 次
  • 性别: 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 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

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

    浅谈Spring IoC容器的依赖注入原理 Spring IoC容器的依赖注入原理是Spring框架的核心机制之一,负责将服务对象(Bean)实例化并将其提供给客户端使用。依赖注入原理可以分为两个阶段:IoC容器初始化和Bean实例化。 ...

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

    浅谈Spring IOC实例化Bean的三个方法 Spring IOC(Inversion of Control,控制反转)是Spring Framework中的一种核心机制,用于管理Bean的生命周期。实例化Bean是IOC的核心步骤之一,本文将详细讲解Spring IOC实例...

    浅谈Spring中的Quartz配置

    Quartz与Spring的集成使得我们可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)特性来管理任务。这篇博文主要探讨了如何在Spring应用中配置和使用Quartz。 首先,我们需要...

    myspring.rar

    这不仅锻炼了我们的编程技巧,也加深了对Spring的理解。 7. **总结** Spring的IOC功能强大且灵活,通过“myspring.rar”中的实践,我们可以更直观地感受这一特性。无论你是初学者还是经验丰富的开发者,深入理解...

    浅谈Spring单例Bean与单例模式的区别

    "浅谈Spring单例Bean与单例模式的区别" 本文主要介绍了Spring单例Bean与单例模式的区别,通过对比两者的定义、实现机制和应用场景,帮助读者更好地理解这两种概念的异同。 一、单例模式的定义和实现 单例模式是一...

    浅谈Spring解决jar包依赖的bom

    浅谈Spring解决jar包依赖的bom 本文主要介绍了浅谈Spring解决jar包依赖的bom,具有一定借鉴价值。下面我们将详细介绍Spring解决jar包依赖的bom的知识点: 一、什么是BOM? BOM(bill of materials):材料清单,...

    浅谈Spring中Bean的作用域、生命周期

    1. singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域。 2. prototype:原型模式,每次通过Spring容器获取...

    浅谈Spring与SpringMVC父子容器的关系与初始化

    在`web.xml`中,我们配置了一个`DispatcherServlet`,这个Servlet是Spring MVC的核心,它有自己的ApplicationContext,也就是子容器。`DispatcherServlet`的`init-param`配置项指定了Spring MVC的配置文件路径。当`...

    Test05_Spring_Context_XML.rar

    当我们谈到“Spring工程的初始化模块与基础配置”时,我们通常指的是设置Spring IoC(Inversion of Control)容器,该容器负责管理对象的生命周期和依赖关系。在XML配置文件中,我们可以通过`...

    ibatis_spring源代码

    6. **Spring的IoC容器**:`iBatis`的SqlSession和Mapper实例可以通过`Spring`的IoC容器管理,避免手动创建和关闭,减少资源泄漏的可能性。 7. **测试支持**:整合后的`iBatis`和`Spring`项目可以方便地进行单元测试...

    浅谈spring中的default-lazy-init参数和lazy-init

    浅谈Spring中的default-lazy-init参数和lazy-init 在Spring框架中,有两个重要的参数default-lazy-init和lazy-init,它们都是用于控制Bean实例化的时机的。下面我们将详细介绍这两个参数的作用和区别。 一、...

    Java轻量级IOC框架Guice

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

    浅谈Spring的两种配置容器

    Spring框架的核心特性之一是它的Inversion of Control (IOC) 容器,该容器负责管理和装配应用中的对象。本文将深入探讨Spring的两种配置容器:BeanFactory和ApplicationContext,以及它们的实现方式和应用场景。 ...

    Hibernate Spring整合入门程序

    当我们谈到“Hibernate Spring整合”,就是将这两个强大的工具结合在一起,以实现更高效、更灵活的应用开发。 Hibernate是一个流行的ORM框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以用...

    Spring面试专题.rar

    Tomcat作为最常用的Java Web服务器,其性能优化和运行机制也是面试常谈: 1. **Tomcat架构**:介绍Catalina、 Coyote、Jasper等核心组件的功能。 2. **部署与启动**:如何配置server.xml,以及调整线程池参数以...

    浅谈SpringBoot启动那些事儿.pdf

    3. **初始化Spring容器**:创建并初始化Spring IoC容器,加载bean定义,实例化bean。 4. **初始化Web容器**(如果应用是Web应用):如果应用包含Web组件,则会启动嵌入式Servlet容器(如Tomcat)。 5. **启动监听器...

    浅谈SSH学习要点

    最后,Spring框架,以其依赖注入(IoC)和面向切面编程(AOP)闻名。IoC使得对象间的依赖关系可以通过配置文件或注解来管理,降低了代码的耦合度。AOP则是处理横切关注点,如日志、事务等,使代码更清晰。基础使用中...

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

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

Global site tag (gtag.js) - Google Analytics