在JBUilder 中创建Spring的J2SE的应用.doc_第1页
在JBUilder 中创建Spring的J2SE的应用.doc_第2页
在JBUilder 中创建Spring的J2SE的应用.doc_第3页
在JBUilder 中创建Spring的J2SE的应用.doc_第4页
在JBUilder 中创建Spring的J2SE的应用.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

获得Spring的系统库包文件1、下载Spring的系统库包(1)进入到Spring的下载包有两种,一种是带有“with-dependencies”名称的,这种包含了Spring常用到的第三方包,比如Hibernate、aopalliance、jakarta-commons等。这里就使用了这种包,可以省却查找第三方包的麻烦。(2)解压其*.zip文件(3)所需要的*.jar包在其dist和lib目录下,包含有所需要的库l dist/spring.jarl lib/jakarta-commons/commons-logging.jarl lib/log4j/log4j-1.2.9.jar(4)参考文档解压这个包,可以在 docsreference目录下找到Spring 的参考手册,有html和pdf两种格式。如果你的英文不太好,可以看看Spring中文论坛翻译的1.1版本的中文版(pdf格式)。这个参考手册就是入门的不二法宝。(5)Spring中的主要的*.jar包文件的作用(注意:不同的版本可能会由差别!)JAR文件说 明spring-aop.jar这个JAR文件包含在应用中使用Spring的AOP特性时所需的所有类。如果打算使用其它基于AOP的Spring特性,比如声明型事务管理(declarative transaction management),也需要在应用里包含这个JAR文件。 spring-context.jar 这个包里的类为Spring核心提供了大量扩展。你可以找到使用Spring ApplicationContext特性时所需的全部类,以及支持EJB、JNDI和邮件集成所需的类。此外这个包还囊括Spring远程调用(remoting)类,用来与模板(templating)引擎如Velocity和FreeMarker集成的类,以及验证基类(base validation class)。值得注意的是,实际上许多类被包含在这个包里并不是太恰当,比如远程调用和EJB支持之类的特性,打包成单独的JAR文件更为恰当。spring-core.jar 所有应用都要用到这个JAR文件,它包含访问配置文件、创建和管理bean以及进行DI操作相关的所有类。如果你的应用只需基本的DI支持,该JAR文件足以满足需要。此外该JAR文件还包含一组极为有用的工具类,Spring代码库大量使用了这些类,也可以用在自己的应用中。 spring-dao.jar 这个JAR文件囊括Spring DAO支持相关的所有基类,还包含用JDBC和Spring的事务抽象层(transaction abstraction layer)进行数据访问的所有类。为了使用声明型事务支持,还需在自己的应用里包含spring-aop.jar。spring-mock.jar 前面已经提及,Spring提供了一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,因此它们已久经考验,可令你的应用测试更为简单。至于模拟(mock)HttpServletRequest 和HttpServletResponse类在web应用单元测试中的巨大用处,更是毋须赘言。spring-orm.jar这个JAR文件对Spring的标准DAO特性集进行了扩展,使其支持Hibernate、iBATIS和JDO。这个JAR文件里大量的类都依赖spring-dao.jar里的类,毫无疑问你需要同时包含后者。将来每个ORM工具或许会单独打包,这样一来,使用iBATIS时你的应用就无需再包含Hibernate和JDO相关的类。 spring-web.jar这个JAR文件包含web应用使用Spring时所需的核心类,包括自动载入ApplicationContext特性的类、Struts集成类、文件上传的支持类和大量辅助类,用来执行重复性的任务如解析查询(query)字符串里的int值。 spring-webmvc.jar这个JAR文件囊括Spring MVC框架相关的所有类。如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。 (6)Spring所包含的第三方的各个JAR文件依赖关系分组JAR文件说 明antant.jar, ant-junit.jar, ant-launcher.jarSpring采用Apache Ant作为其构建工具,还用来完成大量其它任务如文档生成和测试执行等。运行时Ant根本不起作用,因此发布应用时无需包含该JAR文件。aopallianceaopalliance.jarAOP Alliance(/)是个联合的开源协作组织,在多个项目间进行协作以期提供一套标准的AOP Java接口(interface)。 Spring AOP就是基于AOP Alliance标准API实现的。如果你打算使用Spring的AOP或基于AOP的任何特性,只需这个JAR文件。axisaxis.jar, saaj.jar, wsdl4j.jarSpring采用Apache Axis项目来支持Spring远程调用里的JAXRPC功能。如果使用JAXRPC Remoting,那么只需要这些文件。cauchoburlap-2.1.12.jar, hessian-2.1.12.jarSpring远程调用(remoting)对大量不同种类的协议包括Caucho的Burlap和Hessian提供了支持。要用哪个协议就包含这个分组里相应的JAR文件。cglibcglib-full-2.0.2.jarCGLIB用来生成动态代理类(dynamic proxy classes),供核心DI和AOP实现之用。由于大量Spring功能的实现都要用到CGLIB,因此你的应用几乎总需包含CGLIB。coscos.jarCOS代表com.oreilly.servlet,是个实用类的集合,对Servlets和基于web的应用很有用。Spring在两个地方要用到COS:文件上传处理和e-mail发送。不过在这两种情形中,COS都只是实现选择之一,因此只有选用COS而非其它实现方法时,才需包含cos.jar。dom4jdom4j.jar使用Hibernate时dom4j不可或缺,因此如果你的应用打算采用Hibernate实现ORM,就需要包含这个JAR文件。easymockeasymock.jar, easymockclassextension.jarSpring的测试套件用到了EasyMock,因此只有构建和运行测试套件时才用到这个JAR,无需随你的应用一起发布。freemarkerfreemaker.jarSpring提供了FreeMarker模板引擎的包装类,还为把FreeMarker模板用作web应用的视图提供了支持。只要使用FreeMarker,就需要这个JAR文件。hibernateehcache.jar, hibernate2.jar, odmg.jar如果采用Spring的Hibernate集成和支持类,这些JAR文件不可或缺。如果使用其它ORM工具如iBATIS,则不需要这些JAR文件。如果使用Hibernate,则你的应用还要包含CGLIB JAR文件。hsqldbhsqldb.jarSpring的示例应用使用了hsqldb.jar文件。ibatisibatis-common.jar , ibatis-sqlmap.jar, ibatis-sqlmap-2.jar使用Spring的iBATIS集成类时,这些文件不可或缺;如果使用JDBC或其它ORM工具如Hibernate或JDO,则你的应用不需要这些文件。itextitext-1.02b.jarSpring使用iText提供web层的PDF支持。只有你的web应用需要生成PDF输出时才需包含这个JAR文件。j2eeactivation.jar, connector-api.jar, ejb.jar, jaxrpc.jar, jdbc2_0-stdext.jar, jms.jar, jstl.jar, jta.jar, mail.jar, servlet.jar, xml-apis.jar如左侧所示,J2EE相关的各种不同JAR文件数量相当可观。如果你想要使用Spring邮件支持的JavaMail实现,则需要activation.jar和mail.jar文件。要让Hibernate使用JCA Connector则需connector-api.jar,使用Spring的EJB支持则需要ejb.jar,jms.jar用于Spring的JMS支持。对于web应用,如果想要使用Spring JSTL支持则需要servlet.jar和jstl.jar。Spring远程调用里的JAXRPC支持需要jaxrpc.jar文件,jta.jar用于JTA事务支持。剩下两个JAR文件jdbc2_0-stdext.jar和xml-apis.jar分别用于JDBC和XML配置支持,不过只有你使用1.3版本的JVM时才需要它们。jakartajakarta-commons commons-attributes-api.jar, commons-attributes-compiler.jar, commons-beanutils.jar, commons-collections.jar, commons-dbcp.jar, commons-digester.jar, commons-discovery.jar, commons-fileupload.jar, commons-lang.jar, commons-logging.jar, commons-pool.jar, commons- validator.jarSpring使用了来自Jakarta Commons项目的大量组件。如果你想在应用中使用源码级元数据(metadata),就需要commons-attributes-api.jar,此外还需要commons-attributes-compiler.jar,以便将attributes编译到应用里。Struts要用到BeanUtils、Collections、Digester、Discovery,和Validator JAR文件,其中的Collections,Hibernate也会用到。使用DBCP连接池时,Spring JDBC支持要用到DBCP,Pooling则对有些示例应用不可或缺。如果想使用相应的Spring包装类来处理web应用的文件上传,则需要FileUpload。最后,Spring处处用到了Logging,因此需在所有基于Spring的应用里包含这个JAR文件。jakarta-taglibsstandard.jar这是Jakarta的JSTL实现,一些Spring示例应用使用了这个实现。jbossjboss-common-jdbc-wrapper.jar 运行在JBoss应用服务器上的应用使用Spring的JDBC类时,这个JAR文件不可或缺。jdojdo.jar提供Spring的JDO支持。jdomjdom.jar在Spring里使用iBATIS 1.3时,JDOM不可或缺。本章介绍的iBATIS版本为2.0。jotmjotm.jar, xapool.jar如果你打算配合Spring事务抽象层一起使用JOTM,jotm.jar文件不可或缺。如果打算在自己的应用里将XAPool用于连接池(connection pooling),则只需xapool.jar。junitjunit.jar运行时根本不需要JUnit;它只用来构建和运行测试套件。log4jlog4j-1.2.8.jar如果想要使用Spring配置log4j日志记录,这个文件不可或缺。poipoi-2.5.jar这个JAR可令Spring MVC框架支持Microsoft Excel输出。quartzquartz.jarSpring基于Quartz的调度支持需要该JAR。regexpJakarta-oro-2.0.7.jar使用正则表达式来指定AOP的切入点(pointcut)时需要这个JAR。第六章有更详细的介绍。strutsstruts-1.1.jar欲配合Spring使用Struts构建web应用,Struts JAR必不可少。velocityvelocity-1.4.jar, velocity-tools-generic-1.1.jarSpring提供了Velocity的包装类使其支持DI,同时当你在应用中使用Velocity时,还可减少需要编写的代码量。除此之外,Spring还提供了一些类,支持将Velocity用作web层里的视图提供者(view provider)。只要使用了上述任意特性,都需在发布里包含Velocity JAR文件。xdocletxjavadoc-1.0.jarCommons Attributes用这个JAR解析源代码文件,然后提取属性信息。如果使用了Spring Commons Attributes支持,须包含该JAR文件。2、将Spring的系统库包文件添加到JBuilder中(1)主要涉及spring.jar、commons-logging.jar和log4j-1.2.9.jar在JBuilder 中创建Spring的J2SE的应用1、新建一个J2SE 的 Project(1)名称为SpringJ2SEApp(2)不需要服务器的设置2、在该Project中添加一个应用的主类名称为SpringApplication,包名称为springj2seapp删除所产生的Java Swing的窗口类只需要主类package springj2seapp;public class SpringApplication public SpringApplication() public static void main(String args) new SpringApplication(); 执行该J2SE应用,以观察是否有错误(只要能够正常执行就可以)3、构建Spring基础代码(1)添加一个接口Action该Action 接口定义了一个execute 方法,在我们示例中,不同的Action 实现提供了各自的execute方法,以完成目标逻辑处理的功能。编程该接口package springj2seapp;public interface Action public String doTransfer (String inputStr);为什么要面向接口编程而不是利用继承因为,继承是一种强的耦合关系,子类对父类有很大的可见性,即子类可以使用父类的方法阿,字段什么的,所以当父类变化时,势必对子类有影响。(2)添加对该Action接口的两个实现类-UpperAction类编程该实现类,UpperAction将其message属性与输入字符串相连接,并返回其大写形式。package springj2seapp;public class UpperAction implements Action private String message; public String getMessage() return message; public void setMessage(String string) message = string; public String doTransfer (String inputStr) return (getMessage() + inputStr).toUpperCase(); (3)添加对该Action接口的两个实现类-LowerAction类编程该实现类,LowerAction将其message属性与输入字符串相连接,并返回其小写形式。package springj2seapp;public class LowerAction implements Action private String message; public String getMessage() return message; public void setMessage(String string) message = string; public String doTransfer (String inputStr) return (getMessage()+inputStr).toLowerCase(); 注意:l 面向接口编程是面向对象的核心,因此我们应该尽量要面向抽象编程。l 因为一个组件应该分为两部分: Service-所能够提供功能的声明 Implementation-Service的具体实现这样的好处是:多实现可以任意切换,防止 “everything depends on everything” 问题即具体依赖于具体。l 接口对外暴露方法,而实现接口的类对外隐藏方法Action oneAction =new LowerAction();这样,从外面看oneAction对象中的方法声明,只能看见Action的方法声明,而看不见LowerAction实现类或者UpperAction 实现类中的内部方法实现。4、配置该应用为满足Spring的要求(1)添加前面的Spring的库包到本项目中(2)Spring配置文件SpringApplication.xml由于Spring管理对象是依赖于配置文件,因此任何需要交给Spring管理的对象,都必须在配置文件中(文件名任意)注册,这个过程被称为wiring。l 请确保配置SpringApplication.xml位于工作路径之下(这种引用方式其配制文件只能相对于工作路径的引用),注意工作路径并不等同于CLASSPATH ,JBuilder的默认工作路径为项目根路径,也就是.project文件所在的目录。l 内容如下(对于Spring 1.2版)Spring Quick Start实例化配置的对象,以配置文件的bean节点ID值作为实例引用的关键字。HeLLo,UpperAction 它会被动态地注入到LowerAction的message属性中HeLLo,LowerAction l 内容如下(对于Spring2.0版)Spring Quick Start实例化配置的对象,以配置文件的bean节点ID值作为实例引用的关键字。HeLLo,UpperAction 它会被动态地注入到LowerAction的message属性中HeLLo,LowerAction 注意:l 在此,通过使用bean标签,注册了两个组件对象;然后我们只需要利用Spring框架所提供的接口,加载配置文件,通过指定对象的id,获得该对象。l 在本例中只是为两个组件提供String 类型的数据的依赖注入;实际上我们可以注入任何值类型,也可以注入任何类的实例,也可以注入List、Map、Properties。l 配置文件管理了所有的对象和对象间的关系,而对象则只负责执行自己的功能,他们的职责越少,藕合度越低,系统就越容易测试,管理维护也更容易。(3)关于标签中的id和name属性的问题每一个bean都有一个id(也叫做标志符或名字)。这些id在管理bean的BeanFactory或ApplicationContext中必须是惟一的。在一个XmlBeanFactory中(包括ApplicationContext的形式),我们可以用id或者name属性来指定bean的id(s),并且在这两个或其中一个属性中至少指定一个id。id属性允许我们指定一个id,并且它在XML DTD(定义文档)中作为一个真正的XML元素的ID属性被标记,所以XML解析器能够在其他元素指回向它的时候做一些额外的校验。正因如此,用id属性指定bean的id是一个比较好的方式。然而,XML规范严格限定了在XML ID中合法的字符。因此,如果我们有必要使用这些字符(在ID中的非法字符),那么我们可以通过name属性指定一个bean的标识。(4)pertiesSpring采用Apache common_logging,并结合Apache log4j作为日志输出组件。为了在调试过程中能观察到Spring的日志输出,在CLASSPATH中新建perties配置文件。l 可以从samples/petclinic/war/WEB-INF/perties拷贝一份模板文件到本应用的classes目录中。l 设置其log输出的文件目录# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.log4j.rootLogger=INFO, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p %c - %nlog4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=springapp.loglog4j.appender.logfile.MaxFileSize=512KB# Keep three backup files.log4j.appender.logfile.MaxBackupIndex=3# Pattern to output: date priority category - messagelog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p %c - %m%n注意:上面的springapp.log文件将保存到项目的根目录下。5、添加测试代码-我们将该类看成为业务类的调用者(1)package springj2seapp;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext; public class SpringApplication public SpringApplication() /* 我们根据SpringApplication.xml创建了一个ApplicationContext实例,并从此实例中获取我们所需的Action实现。*/ ApplicationContext ctx=new FileSystemXmlApplicationContext(SpringApplication.xml); Action upperAction = (Action) ctx.getBean(theUpperAction); System.out.println(upperAction.doTransfer(Spring J2SE Application); Action lowerAction = (Action) ctx.getBean(theLowerAction); System.out.println(lowerAction.doTransfer(Spring J2SE Application);获得实现类的实例,但是代码中并没有硬编码具体实现类,而是将这种依赖转移到配置文件中 public static void main(String args) new SpringApplication(); (2)执行该程序(3)注意log文件的输出目录和内容注意:利用Spring框架编程,console打印出log4j:WARN Please initialize the log4j system properly?说明你的perties没有配置。请把perties放到工程的classpath中,eclipse的classpath为bin目录,由于编译后src目录下的文件会拷贝到bin目录下,所以你可以把perties放到src目录下。(4)Spring编程时常见的错误含义l 出现 java.lang.NoClassDefFoundError?一般情况下是由于你没有把必要的jar包放到lib中。比如你要采用spring和hibernate(带事务支持的话),你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包。l java.io.FileNotFoundException: Could not open class path resource .hbm.xml,提示找不到xml文件?原因一般有两个:该xml文件没有在classpath中或者applicationContext-hibernate.xml中的xml名字没有带包名。l org.springframework.beans.NotWritablePropertyException: Invalid property of bean class?出现异常的原因是在application-xxx.xml中property name的错误。property name=. 中name的名字是与bean的set方法相关的,而且要注意大小写。6、体验IoC所带来的“松散藕合”的优点(1)当业务功能发生变化-将UpperAction类中的功能实现由“大写”转换,改变为“小写”(2)目标业务类名称发生变化-替换UpperAction类为LowerAction类只需要修改*.xml中的类名称(3)增加新的功能类-新增加一个新的业务类7、分析程序(1)特点l 在所有程序代码中(除测试代码之外),并没有出现Spring中的任何组件l UpperAction和LowerAction的Message属性均由Spring通过读取配置文件(SpringApplication.xml)动态设置。l 客户代码(这里就是我们的测试代码)仅仅面向接口Action编程,而无需知道实现类的具体名称。同时,我们可以很简单地通过修改配置文件来切换具体的底层实现类。上面所说的这些,对于我们的实际开发有何帮助?(2)作用l 首先,我们的应用组件(本例为LowerAction和UpperAction类)并不需要实现框架指定的接口(本例的接口为我们自己定义的Action),因此可以轻松的将应用组件从Spring框架中脱离,甚至不需要任何修改(这在基于EJB框架实现的应用中是难以想象的)。l 其次,应用组件间的依赖关系减少(LowerAction和UpperAction类各自完成自己的业务处理),极大地改善了代码的可重用性(因为借助于Spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需在编写组件代码时就加以指定)和在相当程度上降低了组件之间的耦合。l 面向接口设计Spring对于面向接口设计的意义,在于它为面向接口编程提供了一个更加自然的平台。基于Spring开发,程序员会自然而然倾向于使用接口来定义不同层次之间的关联关系,这种自发的倾向性,来自于Spring所提供的简单舒适的依赖注入实现。Spring使得接口的定义和使用不再像传统编码过程中那么繁琐(传统编码过程中,引入一个接口,往往也意味着同时要引入一个Factory类,也许还有一个额外的配置文件及其读写代码)。(3)传统的实现模式中实现类似功能的方法在上面的例子中,我们通过Spring,在运行期动态将字符串HeLLo 注入到Action实现类的Message属性中。l 编写一个Helper类现在假设我们回到传统的实现模式,应该如何处理?一般的处理办法也就是编写一个Helper类(辅助类),完成配置文件读写功能,然后在各个Action的构造函数中,调用这个Helper类设置message属性值。l 组件就与这个Helper类库建立了依赖关系此时,我们的组件就与这个Helper类库建立了依赖关系,之后我们需要在其他系统中重用这个组件的话,也必须连同这个Helper类库一并移植。实际开发中,依赖关系往往并非如此简单,组件与项目基层代码之间复杂的关联,使得组件重用性大大下降。l Spring中的依赖注入模式Spring通过依赖注入模式,将依赖关系从编码中脱离出来-而将类之间的依赖关系转移到外部的配置文件中,避免在调用类中硬编码实现类。从而大大降低了组件之间的耦合,实现了组件真正意义上的即插即用。这也是Spring最具价值的特性之一。l 使用Spring IOC能得到工厂模式同样的效果,而且编码更加简洁在以往的开发中,通常利用工厂模式(Factory)来解决此类问题。在工厂模式中工厂类通常根据参数来判断该实例化哪个实现类;而Spring IOC将需要实例的类在配置文件文件中配置。(4)代码示例上面的Action接口及其两个实现类UpperAction和LowerAction都与Spring无关,可以保留。而调用Action的测试代码,如果要实现同样的功能,应该如何编写?首先,我们必须编写一个配置文件读取类,以实现Message属性的可配置化。其次,得有一个Factory模式的实现,并结合配置文件的读写完成Action的动态加载。l 工厂类public class ActionFactory public static Action

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论