收藏 分享(赏)

Spring基础.doc

上传人:kpmy5893 文档编号:7857545 上传时间:2019-05-27 格式:DOC 页数:19 大小:78KB
下载 相关 举报
Spring基础.doc_第1页
第1页 / 共19页
Spring基础.doc_第2页
第2页 / 共19页
Spring基础.doc_第3页
第3页 / 共19页
Spring基础.doc_第4页
第4页 / 共19页
Spring基础.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

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营业执照举报