`
ayumi11111
  • 浏览: 23039 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring中IoC的入门实例

阅读更多

Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用。这一章先从Spring的IoC开始。所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的。

   数据模型

   1、如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类。 

源代码如下:

 

package cn.com.chengang.spring;
public interface Human {
void eat();
void walk();
}

package cn.com.chengang.spring;
public class Chinese implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("中国人对吃很有一套");
}

/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("中国人行如飞");
}
}

package cn.com.chengang.spring;
public class American implements Human {
/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#eat()
*/
public void eat() {
System.out.println("美国人主要以面包为主");
}

/* (非 Javadoc)
* @see cn.com.chengang.spring.Human#walk()
*/
public void walk() {
System.out.println("美国人以车代步,有四肢退化的趋势");
}
}

 2、对以上对象采用工厂模式的用法如下

 


   创建一个工厂类Factory,如下。这个工厂类里定义了两个字符串常量,所标识不同的人种。getHuman方法根据传入参数的字串,来判断要生成什么样的人种。

 

package cn.com.chengang.spring;
public class Factory {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";

public Human getHuman(String ethnic) {
if (ethnic.equals(CHINESE))
return new Chinese();
else if (ethnic.equals(AMERICAN))
return new American();
else
throw new IllegalArgumentException("参数(人种)错误");
}
}

 

  下面是一个测试的程序,使用工厂方法来得到了不同的“人种对象”,并执行相应的方法。

 

package cn.com.chengang.spring;   
public class ClientTest {   
public static void main(String[] args) {   
Human human = null;   
human = new Factory().getHuman(Factory.CHINESE);   
human.eat();   
human.walk();   
human = new Factory().getHuman(Factory.AMERICAN);   
human.eat();   
human.walk();   
}   
}  

 3、采用Spring的IoC的用法如下:在项目根目录下创建一个bean.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>

xml 代码
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
<beans>   
<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>   
<bean id="American" class="cn.com.chengang.spring.American"/>   
</beans>  

 修改ClientTest程序如下:

java 代码


package cn.com.chengang.spring;   
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.FileSystemXmlApplicationContext;   
public class ClientTest {   
public final static String CHINESE = "Chinese";   
public final static String AMERICAN = "American";   
  
public static void main(String[] args) {   
// Human human = null;   
// human = new Factory().getHuman(Factory.CHINESE);   
// human.eat();   
// human.walk();   
// human = new Factory().getHuman(Factory.AMERICAN);   
// human.eat();   
// human.walk();   
  
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");   
Human human = null;   
human = (Human) ctx.getBean(CHINESE);   
human.eat();   
human.walk();   
human = (Human) ctx.getBean(AMERICAN);   
human.eat();   
human.walk();   
}   
}
 


 

从这个程序可以看到,ctx就相当于原来的Factory工厂,原来的Factory就可以删除掉了。然后又把Factory里的两个常量移到了ClientTest类里,整个程序结构基本一样。

 

  再回头看原来的bean.xml文件的这一句:

 

<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>
 

 

 id就是ctx.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在ClientTest类里获得Chinese对象就是这么一句

 

human = (Human) ctx.getBean(CHINESE);

 

 因为getBean方法返回的是Object类型,所以前面要加一个类型转换。

总结

   (1)也许有人说,IoC和工厂模式不是一样的作用吗,用IoC好象还麻烦一点。
   举个例子,如果用户需求发生变化,要把Chinese类修改一下。那么前一种工厂模式,就要更改Factory类的方法,并且重新编译布署。而IoC只需要将class属性改变一下,并且由于IoC利用了Java反射机制,这些对象是动态生成的,这时我们就可以热插拨Chinese对象(不必把原程序停止下来重新编译布署)
   (2)也许有人说,即然IoC这么好,那么我把系统所有对象都用IoC方式来生成。
   注意,IoC的灵活性是有代价的:设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此使用IoC要看有没有必要,我认为比较通用的判断方式是:用到工厂模式的地方都可以考虑用IoC模式。
   (3)在上面的IoC的方式里,还有一些可以变化的地方。比如,bean.xml不一定要放在项目录下,也可以放在其他地方,比如cn.com.chengang.spring包里。不过在使用时也要变化一下,如下所示:

 

new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");

  另外,bean.xml也可以改成其他名字。这样我们在系统中就可以分门别类的设置不同的bean.xml。

 


   (4)关于IoC的低侵入性。

   什么是低侵入性?如果你用过Struts或EJB就会发现,要继承一些接口或类,才能利用它们的框架开发。这样,系统就被绑定在Struts、EJB上了,对系统的可移植性产生不利的影响。如果代码中很少涉及某一个框架的代码,那么这个框架就可以称做是一个低侵入性的框架。

   Spring的侵入性很低,Humen.java、Chinese.java等几个类都不必继承什么接口或类。但在ClientTest里还是有一些Spring的影子:FileSystemXmlApplicationContext类和ctx.getBean方式等。
现在,低侵入性似乎也成了判定一个框架的实现技术好坏的标准之一。

   (5)关于bean.xml的用法

   bean.xml的用法还有很多,其中内容是相当丰富的。假设Chinese类里有一个humenName属性(姓名),那么原的bean.xml修改如下。此后生成Chinese对象时,“陈刚”这个值将自动设置到Chinese类的humenName属性中。而且由于singleton为true这时生成Chinese对象将采用单例模式,系统仅存在一个Chinese对象实例。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="Chinese" class="cn.com.chengang.spring.Chinese" singleton="true">
<property name="humenName">
<value>陈刚</value>
</property>
</bean>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>
 关于bean.xml的其它用法,不再详细介绍了,大家自己拿Spring的文档一看就明白了。
分享到:
评论

相关推荐

    Spring 之IoC入门实例

    这是俺写的第一个IoC入门实例 刚刚学的Spring

    Spring中IoC的入门实例详解.doc

    Spring中IoC的入门实例详解.doc

    基于Maven构建的Spring IoC源码实例

    Spring IoC 入门实例,包括了多种依赖注入方式,适合Spring初学者学习使用。实例里有详细的注释,一看就懂。

    Spring 入门代码实例

    spring 依赖注入,设值注入和构造注入的两种实现代码。 用JUNIT做测试

    Spring基础与快速入门

    其次针对框架而言,由于业务逻辑中没有Spring的API,所以业务逻辑也可以从Spring框架快速的移植到其他框架。 2 容器:Spring提供容器功能,容器可以管理对象的生命周期,对象与对象之间的依赖关系。你可以写一个...

    springtest.rar

    spring IOC入门实例 maven构建,@Service, @Autowired @Resource 注解 使用和区别,可在单元测试 的Test 方法中直接运行,

    dubbo+Spring+SpringMVC实例,spring配置文件启动

    使用spring配置文件配置dubbo服务,ioc注入。不是其他入门实例的api启动。 每一步可能犯的错误都在下面的地址里有详细描述 详细介绍参见blog http://blog.csdn.net/fangxiaoji/article/details/41845955

    Spring从入门到精通 pdf

    Spring从入门到精通(第七,十四章) pdf (非影印版) 清华大学出版社 作者:郭锋 ISBN:7302138117 IoC DI AOP的讲解,条理非常清晰,结合实例,简单明了。非常适合初次接触这些概念的人。

    spring实例教程

    spring实例教程 spring初级入门教程 手把手教你成为spring高手 近30个实例让你成为spring高手涵盖spring的大部分内容:ioc控制反转 aop面向切面编程等

    Spring框架控制反转IOC和依赖注入DI详解

    本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...

    Spring教程合集.zip

    Spring教程合集.zip ...在Spring中配置Hibernate事务 Struts+Spring+Hibernate开发实例 Struts+Hibernate+Spring练习 Struts+Spring+Hibernate快速入门 sping mvc 理解AOP,IOC,Spring Spring Framework最佳实践

    spring 入门例子学习文档

    spring入门的实例介绍,包括aspectJ,Ioc,持久化等技术。分注解模式,和配置模式。非常适合初学者。

    spring.net中文手册在线版

    IoC快速入门 25.1.简介 25.2.Movie Finder 25.2.1.开始建立MovieFinder应用程序 25.2.2.第一个对象定义 25.2.3.属性注入 25.2.4.构造器参数注入 25.2.5.总结 25.2.6.日志 25.3.应用程序上下文和IMessageSource接口 ...

    Spring框架(详细 一).md

    本篇博文适合零基础的同学...Ioc 入门案例; Di 入门案例; 核心API介绍; 装配bean基于xml---实例化方式; bean种类; bean作用域; 生命周期; 属性注入--setter方法 p命名空间; sqel; 集合注入; 装配bean基于注解;

    Spring攻略(第二版 中文高清版).part1

    1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 ...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能...附录B 在Spring中开发Web Service

    【2019版】Spring4.3入门视频课程

    一、Spring IOC Spring简介、核心概念 第一个Spring程序、IOC容器的类型、数据装配 bean生命周期、实例化bean的方式和时机、bean的作用域、继承配置 .自动装配、FactoryBean、两种后处理器 二、Spring AOP AOP简介、...

    Spring入门到精通2017视频教程

    本次课程的主要内容:掌握系统框架设计原理,工厂模式,委托模式的实现,Spring的IOC依赖注入技术,Struts2,Hibernate与Spring的整合,ApplicationContext读取资源文件的3种方法,多个配置文件的加载与导入,静态...

Global site tag (gtag.js) - Google Analytics