`

spring简单demo——翻转

 
阅读更多

Spring 实例入门

本文结合实例理解解容器,DI,IOC,耦合,解耦等Spring所涉及的概念,同时了解Spring的最基本也是最核心的使用方法。

 

1. Spring容器 Spring容器负责对象的实例化,对象生命周期的管理,被Spring管理的对象称之为Bean。

 例如有Soldier类需要交由Spring容器管理,我们先编写类

package com.hb; public class Soldier {

  private String name; 

  public String getName() {   return name;  }

  public void setName(String name) {   this.name = name;

  }

}

 

 

在Spring配置文件中添加如下配置

<bean id="s1" class="com.hb.Soldier"></bean>

 

 

初始化Spring容器

public class Test {

  public static void main(String[] args) {

 ApplicationContext context = new  ClassPathXmlApplicationContext("applicationContext.xml");

  }

}

 

 

从Spring容器中取得对象实例  

Soldier s1 = (Soldier) context.getBean("s1");

Spring默认使用单例的方式创建对象。可以通过修改<bean>的配置改变成其它创建方式。这个属性为Scope,称之为作用域或生命周期,它的值为singleton(单例,默认值),prototype(每次产生一个新的实例)等。   

<bean id="s1" class="com.hb.Soldier" scope="prototype"></bean> 

 

 

2. 注入方式有setter注入,构造注入方式,接口注入(不需掌握)。建议多使用Setter注入方式。

 

Setter注入:

Soldier类中有一个属性name,如何在创建Soldier的时候使name的值变为”RANBO”?

配置如下:

<bean  id="s1"  class="com.hb.Soldier">

 <property  name="name"  value="RANBO"/>

</bean>

这样创建的Soldier对象的name属性就有值了,测试代码:

public static void main(String[] args) {

 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

 Soldier s1 = (Soldier) context.getBean("s1");

 System.out.println(s1.getName());

 

构造注入: 我们先修改下Soldier类,给它添加一个构造方法:

package com.hb;

public class Soldier {

  private String name;

  public Soldier(String name) {   this.name = name;  }

  public String getName() {   return name;  }

}

配置如下:

<bean  id="s1"  class="com.hb.Soldier">

  <constructor-arg  value="RANBO"></constructor-arg>

</bean>

测试结果同上。 

 

 

3. 依赖 当A对象使用了B对象的方法,A对B产生依赖,称之为A依赖B。

下面的例子中Soldier类依赖HandGun类。

package com.hb;

/** 

* 士兵类

*/

public class Soldier {

  /** 

  * 打仗  

 */

  public void fight(){

   HandGun handGun = new HandGun();

   handGun.killEnemy();

  } 

}

 

 

package com.hb;

/** 

 * 手-枪类 

 */

public class HandGun {

  /**  

 * 手-枪杀敌  

 */ 

public void killEnemy(){

   System.out.println("手-枪杀敌");

  }

}

当HandGun发生变化时,必然导致Soldier必须做相应修改,同时,当Soldier需要使用OtherGun时也必须重新编写代码,导致代码重用度不高。  当对象之间的依赖关系很强时(耦合),会使程序代码死板,不利于后期的维护和扩展。降低对象之间的依赖关系称之为解耦。Spring能够很好的解决这一问题。 

 

 

 4. 控制反转控制反转控制反转控制反转(Inversion of Control,简称IOC)和依赖注入依赖注入依赖注入依赖注入(Dependence Inject简称DI) 我们运用Spring的setter注入方式解决HandGun和Soldier的耦合问题。修改Soldier的代码,将HandGun定义为Soldier的属性并提供setter方法:

 

package com.hb;

/** 

* 士兵类 

*/

public class Soldier {

  private HandGun handGun;

  public void setHandGun(HandGun handGun) {

   this.handGun = handGun;

  } 

/**  

 * 打仗  

*/ 

public void fight(){

   handGun.killEnemy();

  } 

}

 

配置如下

<bean  id="s1" class="com.hb.Soldier">

 <property name="handGun">

   <ref bean="handgun"></ref>

 </property>

</bean>

<bean id="handgun" class="com.hb.HandGun"></bean>

 

到这里,我们已经降低了HandGun和Soldier的部分依赖关系,至少在Soldier中不用再自己去实例化HandGun了。然而并没有彻底解决问题,Soldier中仍然可以看到HandGun类,因此我们使用接口进一步改进代码:

package com.hb;

/** 

 * 武器接口 

 */

public interface Weapon {

/**  

 * 杀敌  

 */ 

  void killEnemy();

}

package com.hb;

/** 

 * 手-枪类 

*/

public class HandGun implements Weapon{

  /**  

  * 手-枪杀敌  

  */ 

public void killEnemy(){   System.out.println("手-枪杀敌");  } }

 

 

package com.hb;

/**  * 士兵类  */

public class Soldier {

  private Weapon weapon;

  public void setWeapon(Weapon weapon) {

   this.weapon = weapon; 

   } 

/**   * 使用武器打仗   */ 

public void fight(){

   weapon.killEnemy();

  } 

}

 

配置如下

<bean id="s1" class="com.hb.Soldier">

 <property name="weapon">

 <ref bean="handgun"></ref>

 </property>

</bean>

<bean id="handgun" class="com.hb.HandGun"></bean>

 

测试:

ApplicationContext context = new  ClassPathXmlApplicationContext("applicationContext.xml"); Soldier s1 = (Soldier) context.getBean("s1");

s1.fight();

 

至此,我们使用Spring很好的解决了HandGun和Soldier的耦合问题。Soldier类中再也看不到HandGun的踪影了,Soldier只依赖于接口,而最终Soldier还是使用了HandGun,这是为什么呢?Spring在这里管理了单个的对象,也管理了对象之间即Soldier和HandGun的依赖关系。原本是由Soldier控制HandGun的实例化的,转变为由Spring容器来控制,这里发生了控制权的转移,这就是控制反转控制反转控制反转控制反转(Inversion of Control,简称IOC)。当Soldier需要HandGun时,Spring会自动将HandGun对象注入给Soldier,这就是依赖注入依赖注入依赖注入依赖注入了。   看一下你是否已经有所领悟了: 假如“手-枪“已经不满足“士兵”的需要,我们需要将“手-枪”更换为更先进的“机枪”,你的程序如何编写呢?自己试一下吧!!

 

 

 

 

 

 

 

分享到:
评论
1 楼 u010314339 2014-05-12  
虽然很简单,但是用实例把spring的控制反转和依赖注入讲得很清楚了,赞一个!!!

相关推荐

    spring cloud demo

    本文将深入探讨基于Spring Cloud的"spring cloud demo"项目,包括消费者、生产者以及注册中心等核心组件,旨在为你提供一个可借鉴的实践案例。 一、Spring Cloud简介 Spring Cloud是一系列框架的集合,它为开发者...

    spring仿写demo代码

    spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码spring仿写demo代码...

    Spring开发指南——中文版

    《Spring开发指南——中文版》是由夏昕编著的一本针对Spring框架的中文教程,旨在帮助开发者更好地理解和应用Spring框架。Spring是Java平台上的一个核心框架,广泛应用于企业级应用开发,提供了一种全面的编程和配置...

    spring完整demo实例

    首先,Spring的核心特性——依赖注入,是它简化软件开发的关键。依赖注入允许我们解耦组件,使得代码更加模块化,易于测试和维护。通过配置文件或注解,我们可以声明一个对象需要哪些其他对象作为依赖,Spring会自动...

    spring-demo

    【标题】"spring-demo"是一个关于Spring框架的实践项目,主要涵盖了Spring的核心特性以及与其他技术的集成。这个项目包括了Spring的IOC(Inversion of Control)依赖注入、AOP(Aspect Oriented Programming)面向切...

    spring4.0框架demo

    《Spring 4.0框架深度探索:基于Maven构建的实战Demo》 Spring框架作为Java企业级应用开发的基石,自推出以来就以其强大的功能和灵活性赢得了广大开发者的心。Spring 4.0作为其一个重要版本,引入了许多改进和新...

    springcloud DEMO

    SpringCloud是一款基于Java的微服务开发框架,它简化了在分布式系统(如配置管理、...以上就是SpringCloud DEMO所涵盖的关键知识点,通过这个DEMO,开发者可以学习到如何构建和管理一个基于SpringCloud的微服务架构。

    Demo——使用Spring的Validator接口进行数据验证

    这个Demo示范了怎么通过Spring的Validator接口来进行数据验证,包括Validator的复用、jsp错误信息的展示等。可参考本人博客: http://blog.csdn.net/oLanMoMo/article/details/50530352

    springdemo:spring框架演示——学习

    在"springdemo:spring框架演示——学习"项目中,我们可以深入理解并实践Spring框架的多种功能。 1. **IoC(控制反转)与 DI(依赖注入)**:Spring 框架的核心特性之一就是IoC,通过反转对象创建和管理的控制权,...

    spring dubbo demo

    Spring Dubbo Demo是一个基于Spring和Dubbo框架的简单示例项目,主要用于展示如何在IntelliJ IDEA(简称Idea)开发环境中实现生产者-消费者模式。在这个项目中,我们将探讨Dubbo的核心概念、Spring整合Dubbo的方式...

    Spring技术内幕——深入解析Spring架构与设计 (揭秘系列丛书) - 计文柯.mobi

    Spring技术内幕——深入解析Spring架构与设计 (揭秘系列丛书) - 计文柯.mobi

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...

    三、Spring源码分析——ApplicationContext

    《Spring源码分析——ApplicationContext》 在Java世界中,Spring框架是不可或缺的一部分,它以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性,极大地...

    spring简单demo

    在这个"spring简单demo"中,我们将深入探讨这两个关键概念以及如何在实践中应用它们。 **依赖注入(DI)**是Spring框架的核心特性之一,它简化了组件之间的耦合,使得代码更加灵活和易于测试。通过DI,对象的依赖...

    基于maven的cxf+spring简单demo

    【标题】"基于maven的cxf+spring简单demo"是一个示例项目,它演示了如何结合Apache CXF和Spring框架来构建一个简单的Web服务。Apache CXF是一个开源的Java框架,主要用于创建、部署和管理Web服务。而Spring是另一个...

    spring boot整合JPA——demo

    本示例“spring boot整合JPA——demo”将演示如何在Spring Boot项目中配置和使用JPA。 首先,我们需要理解Spring Boot与JPA的关系。Spring Boot是基于Spring框架的快速开发工具,它通过自动化配置减少了常规设置...

    Spring-Boot-Demo

    首先,我们要理解Spring Boot的核心理念——约定优于配置。在Spring Boot项目中,我们不再需要手动编写大量的XML配置文件,而是通过自动配置类和starter模块来简化配置。对于Mybatis的整合,我们可以引入`spring-...

    最简单的 SpringCloud 教程——服务的注册与发现(Eureka)

    在本教程中,我们将深入探讨SpringCloud的核心组件之一——Eureka,它是一个服务注册与发现的工具,使得微服务架构中的各个服务能够互相找到并进行通信。我们将通过两个主要步骤来学习如何使用Eureka:创建服务注册...

Global site tag (gtag.js) - Google Analytics