Springside 332 技术参考手册Word文件下载.docx
《Springside 332 技术参考手册Word文件下载.docx》由会员分享,可在线阅读,更多相关《Springside 332 技术参考手册Word文件下载.docx(72页珍藏版)》请在冰点文库上搜索。
所以我用SpringSide2
进行开发的时候,写Entity也是两个步骤,但是比第一阶段要简单。
就是先写一个Entity,Entity里面使用Annotation,如下图:
然后修改配置文件,SpringSide2中专门为Hibernate的定义开辟了一个专门的xml文件dataAccessContext-hibernate.xml,里面关于SessionFactory的定义是我们很熟悉的。
我只需要将我的Entity类加入到里面就可以了,如下图中红笔圈出来的部分:
第二阶段和第一阶段相比,配置文件简单多了,不需要维护那么多的.hbm.xml。
但是,每编写一个Entity,依然需要修改一下配置文件。
第三阶段就更了不起了,零配置文件,也就是说我们只管写Entity就行了,不需要管配置文件(当然,项目开始的时候还是要配置一次的)。
打开SpringSide3生成的项目,果然找不到dataAccessContext-hibernate.xml文件。
那么是如何实现零配置的呢?
靠的就是自动扫描,如下图中红笔圈出来的部分:
上面讲Hibernate只是为了举例说明我的观点,事实上SpringSide3中的零配置可不仅仅只存在这一个地方。
Dao层也可以不用配置了。
在SpringSide2中,我们每写一个Dao,都需要在serviceContext.xml中加入这个类,如下图:
SpringSide3中使用自动扫描了,如下图:
以后编写Service后,再也不用修改配置文件了,只要我们在Service中使用如下Annotation:
事务也不用配置了,在SpringSide2中,事务是这样配置的:
SpringSide3中,事务配置是这样的:
Action也不用配置了,不过使得Action零配置的代码却在web.xml中,如下图:
还记得SpringSide2中的Struts配置代码吗?
编写完Action类的代码后,还需要修改两个配置文件,如下:
所以说,SpringSide3的一个优点就是让生活变得更加简单了。
在以上的截图中,SpringSide2项目用的是Eclipse3.2,而SpringSide3项目用的是Eclipse3.4ForJavaEEDevelopers。
哪一个IDE更爽,那也是一目了然。
2.主要库栈
∙JDK:
JDK6.0、UTF-8.
∙IOCcontainer:
Spring3.
∙ORM:
Hibernate3.3.
∙Web:
Struts2.1、JSP2.0、JQuery1.4/DojoBase1.4.
∙WebService:
基于ApacheCXF2.2的JAX-WS/JAXB2.0规范,基于Jersey的JAX-RS规范.
∙Security:
SpringSecurity3.0.
3.层次说明
3.1entity-领域模型层
使用SqlFirst的开发模式,先设计数据库,参考DBA的性能意见而不要太片面追求OO化的表结构。
然后纯手工编写entity与极少量的JPAannotation(约定大于配置),也可以用hibernate-tools从数据库逆向生成后再作修改。
3.2access-资源访问层
资源访问层包括对数据库、JMS、外部的WebService等的访问。
每个领域对象对应一个DAO类,继承于通用的HibernateDao<
T>
,所有以该对象为查询主体的HQL语句统一定义于DAO内并提供查询函数.
在性能紧要而Hibernate又无法满足要求时,可混合使用JDBCTemplate。
3.3service-业务逻辑层
Service层有两类对象,
一类是领域对象管理类(EntityManager),按领域对象划分,每个Manager类负责管理多个紧密关联的Entity的增删改查及其业务逻辑。
一类是业务服务类(Service),按业务脚本划分,可能会访问到多种领域对象与Manager类。
用Spring的Transcationannotation定义事务。
对于HibernateLazyload的关联对象,在性能要求不高时可使用OpenSessionInViewFilter,否则在Service层完成对象的初始化操作。
3.4web-WebMVC层
MVC框架使用Struts2.1这一老牌传统MVC框架+ConventionPlugin实现零配置文件,每个Action实现一组页面操作。
View模板用JSP2.0,尽量使用纯html+JSP2.0EL展示页面。
Javascript与Ajax使用JQuery或DojoBase。
尽量采用CSS框架规范CSS的布局。
3.5ws-WebService接口
使用Javafirst的开发模式,通过JSR181annotation标注WebService接口,用JAXB-2.0annotation标注Java-XMLMapping。
用DTO类实现Entity与外系统的解耦,用WSResult包裹返回结果与返回码,不使用Exception返回错误。
对于Restful服务,同样采用JAX-RSannotation标注。
3.6security-安全控制
使用SpringSecurity的Filter拦截URL,使用SpirngSecurity的taglib拦截页面内容。
采用用户-角色-资源三层控制,角色-资源关系定义于XML的简化模式。
3.7测试
单元测试尽量采用MockObject的方式屏幕所有依赖对象/数据的访问,对于dao层与特别查询与特别数据库操作,采用集成测试连接实际数据库,基于Spring的集成测试Context。
功能测试使用selenium测试主要用户故事的主流程及Javascript的效果,使用Jetty嵌入式Web服务器与H2嵌入式数据库,使用DBUnit预备数据,使得整个测试可以快速运行,对测试环境没有太多的依赖。
4.常见问题
4.1什么时候使用基于接口编程?
基于接口编程、Fascade层等等抽象封装都是有开发和维护的代价的,是否使用归根结底还是看在团队人员的分工情况,在大家不得不依赖这几项技术来解决相互的接口、契约问题时,自然就用了。
4.2Package是先分层还是先分模块
org.springside.模块A.web还是org.springside.web.模块A?
同上,还是看团队人员的分工情况。
如果是每人从头到尾负责一个独立模块的可以先分模块。
反之,按层进行分工并鼓励层内重用的,可以考虑先分层。
∙目录结构描述
1.公共目录结构
完全采用maven的默认布局。
bin
命令脚本目录,详见后。
src
main
主源码目录
main/java
java源文件
main/resources
配置文件、属性文件
main/webapp
Web应用目录
test
测试目录,结构与主源码目录相同
unit单元测试
functional功能测试
data测试数据生成器
target
maven编译目录
2.bin目录结构
文件
描述
db-export/db-init
将当前数据库数据通过dbunit导出到export-data.xml。
执行src/main/sql中的脚本初始化数据库schema,再通过dbunit执行default-data.xml初始化数据。
convert-h2
将真正数据库的sql转换为测试用的H2的sql。
eclipse
生成Eclipse项目文件。
jetty/Jetty-debug
用jetty快速运行本项目。
jetty-debug支持eclipse以debug方式连入,端口为8000
hibernate/generatecode
从数据库逆向生成entity/dao/pojo
2.
基础框架
∙Spring:
SpringFramework
1.参考资料
∙Spring资料(江南白衣博物馆)
1.图书
∙Spring2.5参考手册中文版
(英文版
)(满江红出品)
∙《SpringRecipes-AProblem-SolutionApproach》
Apress,2008
2.文章
∙IntroductiontotheSpringFramework2.5(TSS)
Rod老大的Spring介绍Spring2.5版。
3.笔记
∙Spring2.5的笔记
∙以前的笔记part1
、part2
、part3
有时间会根据Spring的最新变化重新整理。
∙Spring2.5参考手册中文版(满江红出品)
Apress,2008Spring2中较好的参考书。
2.选型
有人说guice好,但我们用Spring不仅是为了IOC,也为了Spring对JEE所做的封装,以及整个JavaEE界众多项目(SpringSecurity,CXF、Struts2等)对它的依赖。
3.inSpringSide3-Mini示例使用的基本特性
∙属性配置及IOC容器
∙@Transcationalannotation标注的事务管理功能
∙集成测试的基类
3.1IOC部分特征使用
详见Spring笔记(江南白衣博物馆)
3.1.1零配置文件的使用场合
Service,Dao层在无特殊配置项时,可使用IOCAnnotation进行配置实现约定俗成大于配置的零配置文件.
而其他Database/SessionFactory,SpringSecurity,CXF等需要进行参数配置时,仍然使用XML配置文件。
3.1.2
零配置文件的annotation
SpringSide3中使用@Component注释所有类别,在setter方法(不需要严格按setter命名)上使用@Autowired进行byType注入,如果需要byName注入则使用@Resource。
3.1.3其他特征
使用@Required注释没有用@Autowired注释的属性,保证对象必然被注入,如果对象没有被注入则报错。
使用JSR250的@PostConstruct来定义在执行完所有setter注入后必须执行的函数。
@PreDestroy来定义JDK关闭时通过shutdownhook调用的函数。
ApplcationContext中默认设置Lazyload与Autowiredbytype仍然是必然的选择。
3.1.4属性文件管理
在配置文件中,很有一些属性会在团队的开发环境,个人的开发环境,集成测试环境,以及生产环境集群的每台服务器中都有所不同的。
详见Spring笔记(江南白衣博物馆)
3.2事务管理
在Service层用@Transactional定义事务,详见Spring笔记(江南白衣博物馆)。
注意Spring3.0的@Transactional终于支持多个TransactionManager了,showcase里演示了多个数据源(不要求联合事务JTA)导致多个TransactionManager的情况。
此时@Transactional默认使用<
tx>
中指定的TransactionManager,但也可以重新指定其他的TransactionManager的BeanName.
在AOP不到的地方,仍然有机会使用TransactionTemplate,(见Showcase的UserJdbcDao与LogJdbcWriter。
)
3.3集成测试的基类
详见测试文档
4.inSpringSide3
4.1Showcase中使用的Spring功能索引
∙JMX:
JMX的Server端封装
∙JMS:
JMSTemplate封装
∙Email:
EMail客户端封装
∙Schedule:
Quartz的封装,ScheduleExecutor的封装
∙Ehcache:
EhcacheServer封装
∙Jdbc:
SpringJdbcTemplate
4.2SpringContextHolder
在SpringApplicationContext启动时,先把Context放入个该类的静态变量,当模块的代码无法通过正常渠道获得SpringContext及其中的Bean时,可直接从该静态变量中获取。
4.3AOPAspect的写法
最新的写法,一切都写在java文件里,只要在applicationContext.xml里面定义一把scan就可以了。
<
aop:
aspectj-autoproxyproxy-target-class="
true"
/>
详见showcase中的TraceLogAspect。
∙Database:
ORM-Hibernate,Jdbc-SpringJdbcTemplate,
数据库-H2、MySQL、Oracle,数据库连接池-DBCP
1.资料
∙数据库访问资料(江南白衣博物馆)
∙JPA与Hibernate笔记(江南白衣博物馆)
因为最近一年来,JPA与EJB3的应用都没有想象中的多,在国内尤其突出。
所以仍然使用纯HibernateAPI+JPA1.0annotation.支持JPA2.0的Hibernate3.5刚出来,要再继续观察。
3.inSpringSide3
3.1Entity类
1.Mini-Web中的User类是entity类的典型,集中演示了缓存,默认命名策略,多对多关系的定义和fetch策略,级联操作策略,子集合的排序和缓存、非持久化属性,见JPA与Hibernate笔记
2.为了统一ID的列名与生成算法,编写了IdEntity基类,演示了自增序列,数据库Sequence(Oracle),UUID(多数据库)的情形。
(如果要在Oracle中为每个Entity对应不同Sequence时-重载getId()函数)。
3.2更换MySQL或Oralce等数据库
详见数据库说明。
1.H2
1.1选型
H2嵌入式模式是功能测试的首选。
测试要求数据库运行要非常快速,而且为免测试间数据的耦合,要能在每个测试间很快速的重建数据,H2刚好满足这个需求。
H2的主要对手是Derby,对比显示H2比Derby更快,而且有着非常好用的Web管理界面(在Web界面里写SQL时居然有表名列名的动态提示....)
1.2inSpringside3
在/tools/h2目录里带了启动H2的命令(借助于maven管理的Jar包)。
另外,H2完全兼容hsqldb的语法,一般依赖数据库的开源项目都附带有hsqldb语法的初始化脚本。
SpringSide3中在使用嵌入式H2提供快速功能测试。
url为jdbc:
h2:
mem:
mini-service;
DB_CLOSE_DELAY=-1
同时运行期的数据库也使用了H2的Server模式,url为jdbc:
tcp:
//localhost/~/mini-service。
2.MySQL与Oracle
开发实际项目时,需要将H2更换为实际数据库,Hibernate支持大部分的数据库
,其中Java程序员选用MySQL和Oracle的最多。
更换MySQL与Oracle主要修改几个地方,SpringSide已在两个mini-example中带了示范配置,取消相应的注释符号即可。
1.pom.xml
<
properties>
一节jar包的groupid与artifactId,version用于下载依赖包。
注意因为版权问题,Oracle的Driver不在maven官网的仓库上,需要自行发布到团队的私服或拷贝到本机的maven仓库目录。
2.src/main/resource/applicationt.properties
用于连接池与hibernate的配置。
3.bin/build.xml
用于导出导入数据到数据库。
4.bin/hibernate/hibernate.cfg.xml
如果需要用hibernate-tools生成代码则修改此文件,否则可忽略。
5.修改entity的ID生成策略。
注意Oracle中一般会为每个主要的表创建一个Sequence,所以继承于IdEntity的子类需要重载getId()方法指定Sequence名。
当然也可以只修改IdEntity基类,所有entity共用一个sequence。
3.3Event机制
在Showcase中的AuditListener,演示了利用Event机制,在save与update时自动为实体加入审计信息(创建人与创建时间,最后修改人与修改时间)
3.4@Version字段
在Showcase中演示,@Version字段用在诸如两个管理员在差不多时间里打开了同一对象的修改页面可能引发的冲突,Struts2的Prepareable机制对其使用有些许影响,需进行编码检查,详见UserAction.
3.5Clob字段
在Showcase中演示,Clob字段用String表示即可,但为了达到LazyLoad的效果,必需进行bytecodeenhancement,见showcase中bin/hibernate/bytecode-instrument中执行的Ant指令。
@Lob
@Basic(fetch=FetchType.LAZY)
publicStringgetContent(){
returncontent;
}
3.6继承
在Showcase中演示,为性能考虑,一般采用同表继承,另外,在基类放一个@ForceDiscriminator有时候很有用。
@Table(name="
SS_POST"
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@ForceDiscriminator
publicabstractclassPost
@Entity
@DiscriminatorValue("
Subject"
publicclassSubjectextendsPost
3.7自定义ID生成器
在Showcase中演示一个16位的UID生成。
3.8关联关系大全
在mini-web中演示@ManyToMany.
在shwocase中演示,单向,双向的@OneToMany,@ManyToOne.
4.inSpringSideII--性能相关
Hibernate其实做了很多性能相关的优化,大家可以尽量使用后,再决定要不要直接跑JDBC。
4.1二级缓存
在Entity类及其Collection属性中都可以声明Hibernate缓存策略。
Entity缓存对象实体,而Collection则缓存对象间的关系。
注意并不是所有对象都适合缓存,需要进行精心选择,详见Hibernate笔记。
这里使用了ehcachecache方案,支持基于JGroups分布式二级缓存,在sessionFactory处配置了ehcache_hibernate.xml的配置文件。
关于Ehcache详见Ehcache部分。
QueryCache本身就是吃力不讨好的事情,在集群环境下更加需要注意,