第?3?章?springFramework
对spring的描述莫过于作者本人之言
Developingsoftwareapplicationsishardenoughevenwithgoodtoolsandtechnologies.Implementingapplicationsusingplatformswhichpromiseeverythingbutturnouttobeheavy-weight,hardtocontrolandnotveryefficientduringthedevelopmentcyclemakesitevenharder.Springprovidesalight-weightsolutionforbuildingenterprise-readyapplications,whilestillsupportingthepossibilityofusingdeclarativetransactionmanagement,remoteaccesstoyourlogicusingRMIorwebservices,mailingfacilitiesandvariousoptionsinpersistingyourdatatoadatabase.SpringprovidesanMVCframework,transparentwaysofintegratingAOPintoyoursoftwareandawell-structuredexceptionhierarchyincludingautomaticmappingfromproprietaryexceptionhierarchies.即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。如果使用了超重量级,难于控制,不能有效控制开发周期的平台那么就让应用开发变得更为困难。Spring为已建立的企业级应用提供了一个轻量级的解决方案,这个方案包括声明性事务管理,通过RMI或webservices远程访问业务逻辑,mail支持工具以及对于数据和数据库之间持久层的各种配置的支持。Spring还提供了一个MVC应用框架,可以通过集成AOP透明的嵌入你的软件和一个优秀的异常处理体系,这个异常体系可以自动从属性异常体系进行映射。
--springFrameworkreference
springFramework是种非侵入式轻量级框架,允许自由选择和组装各部分功能,还提供和其他软件集成的接口,如与Hibernate、Struts的集成(后面的章节中会提到)。它提供的功能有SpringIOC、springAOP、SpringORM、SpringDAO、SpringMVC.笔者在项目中用到的主要是IOC和AOP功能,ORM用hibernate取代,MVC用Struts取代。本文讲述springFramework在web环境下的使用。
3.2.?为什么使用Spring
1、利用延时注入思想组装代码,提高系统扩展性,灵活性,实现插件式编程。
2、利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。
3、利用其对Hibernate的SessionFactory、事务管理的封装,更简洁的应用Hibernate。
3.3.?快速入门
要使用Spring非常简单,来体验下:
例?3.1.?MyClass.java
publicinterfaceMyClass{ publicvoidexecute();}
例?3.2.?MyClassImpl.java
publicclassMyClassImplimplementsMyClass{ publicvoidexecute() { ... }}
通过Spring注入MyClassImpl的实例,需在配置文件中做如下配置:
例?3.3.?SpringConfig.xml
这样在代码中就可以通过Spring体验到什么叫延时装载了
例?3.4.?
ApplicationContextac=newFileSystemXmlApplicationContext("SpringConfig.xml");(1) MyClasscls=(MyClass)ac.getBean("myClass");(2) cls.execute();
(1) 载入Spring配置文档,上例中SpringConfig.xml放置在工作路径根目录中。这种引用方式其配制文件只能相对于工作路径的引用。 (2) 实例化配置的对象,以配置文件的bean节点ID值作为实例引用的关键字。 http://www.springframework.org,将springFramework下的.jar拷贝到项目lib中,并引用。
2、在Web.xml中配置spring的启动方式。
springFramework提供两种形式的webcontext,基于Listener接口的实现和基于Servlet接口的实现。
例?3.5.?web.xml
Test contextConfigLocation /WEB-INF/spring_bean.xml org.springframework.web.context.ContextLoaderListener Init com.m5.Initializtion 3
tomcat启动时会装载/WEB-INF/spring_bean.xml文件,如果不指定contextConfigLocation参数,默认装载/WEB-INF/applicationContext.xml文件。然后在tomcat启动时初始化一个自定义servlet,在这里实现springFramework的装载。
例?3.6.?Initializtion.java
publicclassInitializtionextendsHttpServlet{ publicvoidinit(ServletConfigconfig)throwsServletException { WebApplicationContextwac=WebApplicationContextUtils.getRequiredWebApplicationContext (config.getServletContext()); super.init(config); InitSpring.Init((AbstractApplicationContext)wac); (1) }}
(1) InitSpring是一个符合单例模式的类。
图?3.1.?AOP分离前
图?3.2.?AOP分离后
从图中能清楚地看出分离的效果,下面继续借助图例来阐述AOP的一些观念
图?3.3.?事务管理之AOP实现序列图
Aspect(方面):我们所关注的,可以被抽取的业务逻辑,如图中的“事务管理”。
JoinPoint(连接点):程序在执行过程中明确的点,如图中execute()方法。
Advice(通知):在特定的连接点执行的动作。如在执行execute()方法前的预处理,在执行完execute()方法后的后处理。
PointCut(切入点):如图中在客户调用execute()时才产生图中所示动作,还也可以设定产生同样动作的方法,如save(),update(),甚至申明成“save.”,这些申明的集合就称之为切入点。
TargetObject(目标对象):包含连接点的对象,也称为被代理的对象。如图中的“业务组件”
理解完概念,接下来看实际例子:
在SpringIOC章节中,DataAccessor.java的Save方法中是未经事务管理分离的实现,我们采用AOP实现后,期望将实现代码变成如下:
例?3.21.?DataAccessor.java
publicvoidsave(Stringsql) { Statements=getStatement(); introws=s.executeUpdate(sql); }
多么美妙的想法,看实现方法:
1、AOP中的“方面”已经明确,即“事务管理”,通常用拦截器来实现其功能。我们可以通过实现AOP联盟提供的通用AOP接口MethodInterceptor自定义拦截器。本例借助Spring中提供的org.springframework.jdbc.datasource.DataSourceTransactionManager事务管理类实现。
2、“目标类”我们也已经明确,即DataAccessor.java。
3、定义切入点,该例中我们期望在执行save方法时做事务管理控制。
4、在SpringConfig.xml文件中进行相关配置
例?3.22.?SpringConfig.xml
org.gjt.mm.mysql.Driver jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=GBKroot (1) (2) (3) (4) (5) PROPAGATION_REQUIRED
(1) 申明事务管理的实现类。 (2) 通过Spring提供的代理工厂类,注入AOP相关实现信息。 (3) 注入事务实现类。 (4) 注入目标类。 (4) 定义切点(save)。
|
|