- 浏览: 380985 次
文章分类
最新评论
-
小尜:
写的很详细,也很简单,一看就懂。多谢啦。
关于工厂模式和spring的IOC -
fjjiaboming:
代码排版!!!!!
JDBC事务和JTA (XA)事务 -
fjjiaboming:
排版有问题吗? 望交流.
做人有三个层次 -
fjjiaboming:
看来数据库连接池 必须用JNDI 注册在容器 , 对吗?
JDBC事务和JTA (XA)事务 -
fd1803:
SSL工作原理:http://www.wosign.com/B ...
SSL(Server Socket Layer)简介
原文转之:
http://gocom.primeton.com/modules/gSpace/pick1061.htm?PHPSESSID=df81a3fde2d88ab19b2a3588347d1d6d
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"?>
- <!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程序如下:
- 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能有效地组织J2EE应用各层的对象。不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调、运行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对象无须关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写量将大大减少。
上面所说的一切都得宜于Spring的核心机制,依赖注入。依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。理解依赖注入
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。
(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。
(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。
(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。
第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。
第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。
第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。
所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。依赖注入通常有两种:
·设值注入。
·构造注入。
.......
发表评论
-
[软件人生]什么是程序员
2008-09-06 19:18 1073一个大专学历想做程序员的朋友和我的对话,很短,我觉得,至少能说 ... -
软件公司怎么消亡的?
2008-09-03 23:45 991最近读了一篇非常有趣的文章,原文是英文,和大家共享,其大概意思 ... -
世上没有B/S系统,只有B系统和S系统. (转载)
2007-10-28 23:02 1105世上没有B/S系统,只有B ... -
从原则出发的软件开发(转载)
2007-06-24 18:57 1158原文:http://gocom.primeton.co ... -
关于java 的methode的内存区域问题
2007-06-12 14:49 1345用java这么长时间了,对于static method 大家都 ... -
java中静态方法和非静态方法覆盖的区别
2007-06-12 14:07 4675首先我们提供两个类,基类为Parent,派生类为Child。在 ... -
关于继承初始化的精典试题 (转载)
2007-06-07 15:50 1185一、 class First { void tt() { ... -
关于synchronized
2007-05-30 21:17 1092synchronized 关键字,它 ... -
关于Connection的问题
2007-05-29 09:48 1120最近在看Datasource时候想到,datasource是数 ... -
0碎的知识
2007-05-26 15:57 10581.软件设计模式针对的是代码片段的复用,而SOA实施中讨论的是 ... -
appfuse中/mainMenu.html的定向问题
2007-05-08 22:26 1516找了半天,终于找到了 : http://blog.matr ... -
JSTL介绍
2007-05-02 14:07 2826使用JSTL改进JSP来简化网 ... -
Robbin推荐的java类书籍
2007-04-30 20:54 1253http://www.iteye.com/article/52 ... -
候捷谈Java反射机制
2007-04-08 14:19 1173Java反射机制<o:p></o:p> ... -
JDBC事务和JTA (XA)事务
2007-04-03 21:10 21820事务简介 一般情况下,J2EE应用服务器支持JDBC事务、 ... -
inline函数的用法小议(转载)
2007-03-14 15:22 8457inline函数的用法小议( ... -
关于java的JIT知识
2007-03-14 13:42 15879刚看Practical java ,对jit ... -
当前Java软件开发中几种认识误区
2007-03-12 21:07 1230当前Java软件开发中几种 ... -
在websphere上安装动态高速缓存监控器
2007-02-07 20:49 3503动态高速缓存的安装和配置 这一节探讨如何安装和配置动态高速缓存 ... -
SSL(Server Socket Layer)简介
2007-02-07 19:52 2087SSL(Server Socket Layer)简介 在网络 ...
相关推荐
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
工厂模式几种类型的测试,并有spring ioc 的简单实现!
使用spring框架,工厂模式的IoC应用,非常简单的小例子。
Spring IOC控制反转和依赖注入的实现、工厂设计模式、配置式和注解驱动式实现IOC
一、Spring简介 1. 概述 ...工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --> 面向切面编程
在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring IoC的控制反转和简单工厂模式。 该资源主要包含以下内容(项目文件实例和注释齐全可以帮助你理): Spring框架简介:对Spring...
SpringIOC 的概念和作用 工厂模式设计一个简单的IOC 容器 SpringIOC 的XML 方式HelloWorld SpringIOC 的XML 方式创建对象配置细节 SpringIOC 的XML 方式依赖注入 SpringIOC 的注解方式 Spring ...
工厂模式大体实现过程如下:工厂 + 反射 + 配置文件<bean id = "us" class = "com.kentanvictor.UserService
spring的设计思想是,单例模式和工厂模式 2 spring的四大特点(优点) 轻量级,低侵入的设计 Spring的DI机制降低了业务对象替换的复杂性 spring不依赖于web容器,独立于各种应用服务器, Write Once,Run Anywhere...
1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...
●运用工厂模式设计程序●理解JavaBean和POJO对象●理解控制反转思想●理解IOC容器在一个乡村小学校,一天只上三节课,有三名老师和一个校长。张老师负责教学生语文,王老师教学生数学,李老师教音乐,校长负责安排...
重构第三步——工厂(Factory)模式的改进 10 重构第四步-IoC容器 11 控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean(组件)的...
重构第三步——工厂(Factory)模式的改进 10 重构第四步-IoC容器 11 控制反转(IoC)/依赖注入(DI) 11 什么是控制反转/依赖注入? 11 依赖注入的三种实现形式 12 BeanFactory 14 BeanFactory管理Bean...
这是一个基于b/s模式的spring web工程代码生产工具.附有一视频例子。 <br>支持bean定义配置,web配置,java源代码生成,dao,service,mvc各个层次集成的配置以及相关页面的生产。 <br>涉及技术:spring mvc,...
Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...
我的春天Spring IOC容器简单实现,实现了一些基本的核心功能以及简单的MVC基本框架及映射访问说明文档目前已实现: xml注入注解注入简单MVC功能注入支持递归注入属性注入引用注入(但未解决循环依赖)注解配置单例...
观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量...
前言11第 1 章第 1 章设计用户持久化类设计用户持久化类33第 2 章第 2 章工厂模式工厂模式66第 3 章第 3 章工厂模式改进工厂模式改进88第 4
实现IOC的主要设计模式是工厂模式。 AOP(面向切面)是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程 (OOP)。 AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向...
主要内容:单例模式, 工厂模式, 策略模式, spring IOC ,反射机制