ImageVerifierCode 换一换
格式:DOC , 页数:19 ,大小:78KB ,
资源ID:7857545      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7857545.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring基础.doc)为本站会员(kpmy5893)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

Spring基础.doc

1、第 3 章 springFramework3.1. 概述对 spring 的描述莫过于作者本人之言Developing software applications is hard enough even with good tools and technologies. Implementing applications using platforms which promise everything but turn out to be heavy-weight, hard to control and not very efficient during the development cy

2、cle makes it even harder. Spring provides a light-weight solution for building enterprise-ready applications, while still supporting the possibility of using declarative transaction management, remote access to your logic using RMI or webservices, mailing facilities and various options in persisting

3、 your data to a database. Spring provides an MVC framework, transparent ways of integrating AOP into your software and a well-structured exception hierarchy including automatic mapping from proprietary exception hierarchies. 即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。如果使用了超重量级,难于控制,不能有效控制开发周期的平台那么就让应用开发变得更为困难。Spri

4、ng 为已建立的企业级应用提供了一个轻量级的解决方案,这个方案包括声明性事务管理,通过 RMI 或webservices 远程访问业务逻辑,mail 支持工具以及对于数据和数据库之间持久层的各种配置的支持。Spring 还提供了一个 MVC 应用框架,可以通过集成AOP 透明的嵌入你的软件和一个优秀的异常处理体系,这个异常体系可以自动从属性异常体系进行映射。-springFramework referencespringFramework 是种非侵入式轻量级框架,允许自由选择和组装各部分功能,还提供和其他软件集成的接口,如与 Hibernate、Struts 的集成(后面的章节中会提到)。它提

5、供的功能有 Spring IOC、spring AOP、Spring ORM、Spring DAO、Spring MVC.笔者在项目中用到的主要是 IOC 和 AOP 功能,ORM 用 hibernate 取代,MVC 用 Struts 取代。本文讲述 springFramework 在web 环境下的使用。3.2. 为什么使用 Spring1、利用延时注入思想组装代码,提高系统扩展性,灵活性,实现插件式编程。2、利用 AOP 思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。3、利用其对 Hibernate 的 SessionFactory、事务管理的封装,更简洁的应用Hiberna

6、te。3.3. 快速入门要使用 Spring 非常简单,来体验下:例 3.1. MyClass.javapublic interface MyClasspublic void execute();例 3.2. MyClassImpl.javapublic class MyClassImpl implements MyClasspublic void execute().通过 Spring 注入 MyClassImpl 的实例,需在配置文件中做如下配置:例 3.3. SpringConfig.xml这样在代码中就可以通过 Spring 体验到什么叫延时装载了例 3.4. ApplicationC

7、ontext ac = new FileSystemXmlApplicationContext(“SpringConfig.xml“); (1)MyClass cls = (MyClass) ac.getBean(“myClass“); (2)cls.execute();(1) 载入 Spring 配置文档,上例中 SpringConfig.xml 放置在工作路径根目录中。这种引用方式其配制文件只能相对于工作路径的引用。 (2) 实例化配置的对象,以配置文件的 bean 节点 ID 值作为实例引用的关键字。 上面的例子中得到了实现类的实例,但是代码中并没有硬编码具体实现类,而是将这种依赖转移到

8、配置文件中。3.4. 搭建 Web 应用环境1、下载 springFramework 最新版本 http:/www.springframework.org,将springFramework 下的*.jar 拷贝到项目 lib 中,并引用。 2、在 Web.xml 中配置 spring 的启动方式。 springFramework 提供两种形式的 web context,基于 Listener接口的实现和基于 Servlet 接口的实现。 例 3.5. web.xmlTestcontextConfigLocation/WEB-INF/spring_bean.xmlorg.springframew

9、ork.web.context.ContextLoaderListenercontextorg.springframework.web.context.ContextLoaderServlet2Initcom.m5.Initializtion3tomcat 启动时会装载/WEB-INF/spring_bean.xml 文件,如果不指定contextConfigLocation 参数,默认装载/WEB-INF/applicationContext.xml 文件。然后在 tomcat 启动时初始化一个自定义 servlet,在这里实现springFramework 的装载。 例 3.6. Init

10、ializtion.javapublic class Initializtion extends HttpServletpublic void init(ServletConfig config) throws ServletExceptionWebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext(); super.init(config);InitSpring.Init(AbstractApplicationContext)

11、wac);(1)(1) InitSpring 是一个符合单例模式的类。例 3.7. InitSpring.javapublic class InitSpring AbstractApplicationContext wac = null;private static InitSpring instance = new InitSpring();private InitSpring()public static void Init(AbstractApplicationContext wac)instance.wac = wac;public static Object getInstance(

12、String objName)return instance.wac.getBean(objName);public static Object getInstance(Class objClass)return getInstance(objClass.getName();经过以上处理,在项目任何一个类中如需得到 Spring 配置文件中的一个类实例,如下即可: InitSpring.getObject(beanId);3.5. Spring IOCIOC(Inversion of Control),译作反转控制,其功能是将类之间的依赖转移到外部的配置文件中,避免在调用类中硬编码实现类,因此

13、也被称作依赖注入(Dependency Injection)。在以往的开发中,通常利用工厂模式(Factory)来解决此类问题,其实不管是工厂模式还是依赖注入,调用类与实现类不可能没有任何依赖,工厂模式中工厂类通常根据参数来判断该实例化哪个实现类,Spring IOC 将需要实例的类在配置文件文件中配置。使用 Spring IOC 能得到工厂模式同样的效果,而且编码更加简洁。看段代码比较一下: 1、用工厂模式来实现 例 3.8. Product.javapublic interface Product public void execute();例 3.9. ConcreteProductA.

14、javapublic class ConcreteProductA implements Productpublic void execute().例 3.10. ConcreteProductB.javapublic class ConcreteProductB implements Productpublic void execute().例 3.11. Factory.javapublic class Factorypublic Product CreateProduct(object param)return ConstructObjects(param);private Produc

15、t ConstructObjects(object param).例 3.12. Client.java(调用类)public class Clientpublic Client()/实例化 ConcreteProductAProduct product = Factory.CreateProduct(paramA);/实例化 ConcreteProductBProduct product = Factory.CreateProduct(paramB);.在 ConstructObjects 方法中设定实例化实现类的逻辑,这样对于调用类来说,不直接实例化实现类,纵然实现类发生变化, 调用代码仍

16、然可以不作修改,给维护与扩展带来便利。 2、Spring IOC 实现 例 3.13. SpringConfig.xml例 3.14. Client.java(调用类)public class Clientpublic Client()/实例化 ConcreteProductAProduct product = (Product)InitSpring.getObject(“productA“);/实例化 ConcreteProductBProduct product = (Product)InitSpring.getObject(“productB“);.调用代码中没有硬编码实现类,比较工厂模

17、式,少了 Factory 类。 Spring 为依赖注入提供三种实现方式:接口注入、设值注入、构造注入。利用这些可以灵活的解决 类之间的依赖关系,让你为所欲为的组装代码。与其说Spring IOC 是一个工具,还不如说搭建了一个思想的舞台。继续看代码: 来实现一个操作多个数据源的切换 例 3.15. DataSource.javapublic class DataSourceprivate String driverClassName;private String url;private String username;private String password;public String

18、 getDriverClassName()return this.driverClassName;public void setDriverClassName(String driverClassName)this.driverClassName = driverClassName;public String getUrl()return this.url;public void setUrl(String url)this.url = url;public String getUsername()return this.Username;public void setUsername(Str

19、ing username)this.username = username;public String getPassword()return this.password;public void setPassword(String password)this.password = password;例 3.16. DataAccessor.javapublic class DataAccessorprivate DataSource dataSource;public void setDriver(DataSource dataSource)this.dataSource = dataSou

20、rce;public void save(String sql)Statement s = getStatement();trys.getConnection().setAutoCommit(false);int rows = s.executeUpdate(sql);s.getConnection().commit();catch(Exception e)s.getConnection().rollback();.finally.private Statement getStatement()Statement s;tryClass.forName(dataSource.getDriverC

21、lassName().newInstance();java.sql.Connection conn = java.sql.DriverManager.getConnection(dataSource.getUrl(),dataSource.getUser(),dataSource.getPassword();trys = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);catch(Exception e).return s;例 3.17. BussinessA.javapublic cl

22、ass BussinessAprivate DataAccessor dao;public void setDao(DataAccessor dao)this.dao = dao;public void execute()dao.save(“insert into tb1 .“);例 3.18. BussinessB.javapublic class BussinessBprivate DataAccessor dao;public void setDao(DataAccessor dao)this.dao = dao;public void execute()dao.save(“insert

23、 into tb2 .“);全部代码就这样了,执行 BussinessA.java、BussinessB.java 代码即可完成数据插入操作,从代码中看, 这两个类具体操作的是什么数据库?什么样的操作细节?让你失望了,代码中找不到这样的关联,看配置文件吧: 例 3.19. SpringConfig.xmlorg.gjt.mm.mysql.Driverjdbc:mysql:/localhost:3306/test1?useUnicode=truecharacterEncoding=GBKrootorg.gjt.mm.mysql.Driverjdbc:mysql:/localhost:3306/t

24、est2?useUnicode=truecharacterEncoding=GBKroot看完配置文件应该明白了,这里承担了所有的依赖关系。 首先,我们通过设值注入方法设置数据源相关参数 然后,我们将数据源实例注入给数据访问类 最后,我们为每个具体业务类注入相应访问器是不是感觉想玩积木似的,在组装你的代码? 例 3.20. DaoTest.javapublic void testSave()BussinessA bussinessA = (BussinessA)InitSpring.getObject(“bussinessA“);bussinessA.execute();bussinessB

25、bussinessB = (BussinessB)InitSpring.getObject(“bussinessB“);bussinessB.execute();执行这段测试代码,数据库 Test1、Test2 中 tb1、tb2 表将分别插入对应的数据,从实现代码来看操作多个数据库和 操作一个数据库完全一样,即使当数据源,数据访问类不断变化,应用代码也可以做到不用任何修改。 希望看完本章节的内容能让读者与我共鸣,Spring IOC 是一种优雅的思想,借助它发挥你无穷的想象吧。 3.6. Spring AOPAOP 的全称为 Aspect Oriented Programming,译为面向方

26、面编程,针对具体业务领域、业务逻辑。AOP 目的是将复杂逻辑进行分离,抽取共性,让各部分实现的功能更为专一。如,Spring AOP 思想实现的经典案例“事务管理”,每个访问数据库的业务类都有可能用到事务控制,将其事务管理代码从具体类中抽取出来,放到一个单独的地方处理,这样大大简化了具体业务类的代码。如图:图 3.1. AOP 分离前图 3.2. AOP 分离后从图中能清楚地看出分离的效果,下面继续借助图例来阐述 AOP 的一些观念 图 3.3. 事务管理之 AOP 实现序列图 Aspect(方面):我们所关注的,可以被抽取的业务逻辑,如图中的“事务管理”。 JoinPoint(连接点):程序

27、在执行过程中明确的点,如图中 execute()方法。 Advice(通知):在特定的连接点执行的动作。如在执行 execute()方法前的预处理, 在执行完 execute() 方法后的后处理。 PointCut(切入点):如图中在客户调用 execute()时才产生图中所示动作,还也可以设定产生同样动作的方法,如 save(),update(),甚至申明成“save.*”,这些申明的集合就称之为切入点。 TargetObject(目标对象):包含连接点的对象,也称为被代理的对象。如图中的“业务组件”理解完概念,接下来看实际例子: 在 Spring IOC 章节中,DataAccessor.

28、java 的 Save 方法中是未经事务管理分离的实现,我们采用 AOP 实现后,期望将实现代码变成如下: 例 3.21. DataAccessor.javapublic void save(String sql)Statement s = getStatement();int rows = s.executeUpdate(sql);多么美妙的想法,看实现方法: 1、 AOP 中的“方面”已经明确,即“事务管理”,通常用拦截器来实现其功能。我们可以通过实现 AOP 联盟提供的通用 AOP 接口 MethodInterceptor 自定义拦截器。本例借助 Spring 中提供的 org.spri

29、ngframework.jdbc.datasource.DataSourceTransactionManager 事务管理类实现。 2、“目标类”我们也已经明确,即 DataAccessor.java。 3、定义切入点,该例中我们期望在执行 save 方法时做事务管理控制。 4、在 SpringConfig.xml 文件中进行相关配置 例 3.22. SpringConfig.xmlorg.gjt.mm.mysql.Driverjdbc:mysql:/localhost:3306/test1?useUnicode=truecharacterEncoding=GBKroot(1)(2)(3)(4

30、)(5)PROPAGATION_REQUIRED(1) 申明事务管理的实现类。 (2) 通过 Spring 提供的代理工厂类,注入 AOP 相关实现信息。 (3) 注入事务实现类。 (4) 注入目标类。 (4) 定义切点(save)。 经过以上的配置,改动下 DataAccessor.java 类的实现,因为这里我们用的dataSource 类为 Spring 提供的 mons.dbcp.BasicDataSource,且我们可以通过 JdbcTemplate执行相关数据库访问操作。 例 3.23. DataAccessor.javapublic class DataAccessor priv

31、ate DataSource dataSource;public void setDataSource(DataSource dataSource)this.dataSource = dataSource; public void save()JdbcTemplate template = new JdbcTemplate(this.dataSource);template.update(“insert into game (name) values (test)“);save ()中代码完全是我们所期望完全样子,不用关系异常处理,不用关系事务管理,设想一下,如果项目 中有 100 百个这样的业务类,那能节省你不少敲这种重复代码的时间了,最重要的是我们让某个业务逻辑得到集中处理,便于日后维护与扩展。 这就是借助 AOP 的好处。以后面对一个复杂的业务逻辑处理时,别忘了想想是否能借助面向方面的思想去解决问题。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报