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

加入VIP,省得不是一点点
 

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

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

下载须知

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

版权提示 | 免责声明

本文(51CTO下载-大型门户网站是这样炼成+这个只是spring+部分.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

51CTO下载-大型门户网站是这样炼成+这个只是spring+部分.doc

1、这个只是 spring 部分6.1.3 Spring 2.5 拿手戏-控制反转与依赖注入人类社会由数以亿计的拥有不同本领的人组成,通过这些人的不同分工协作完成了许多不可思议的惊天杰作,从而呈现出一幅又一幅美妙的生活全景图。我们习惯将这种组合称为团队,团队讲求的是分工与协作,谁也离不开谁。在 Java EE 的世界里,充满了身怀绝技的 Java 类,通过这云云 Java 类的分工协作,造就了五彩缤纷的 Java EE 应用王国。当我们需要别人的帮助才能完成某项工作时,毫不犹豫地就会想到“请“ ,这种“请“无疑是一种盛情的、主动的“请求“ 。沿用这种处事风格,我们的 Java EE 应用开发走过了

2、漫长的“ 请“ 的岁月。例如:1. /* 负责处理用户管理底层数据访问 */ 2. public class UserDao 3. /保存用户数据 4. public void saveUser(User user) 5. /进行数据的保存工作,省略代码 6. 7. . 8. 9. 10. /* 负责处理用户管理业务逻辑 */ 11. public class UserService 12. /主动创建数据访问组件 13. UserDao dao = new UserDao(); 14. /处理新增用户业务逻辑 15. public void addUser(String userName,S

3、tring userPwd) 16. User user = new User(); 17. user.setUserName(userName); 18. user.setUserPwd(userPwd); 19. /调用 UserDao 的 saveUser 方法进行数据保存 20. dao.saveUser(user); 21. 22. . 23. 24. 25. /* 负责处理用户管理业务请求 */ 26. public class UserAction 27. /主动创建业务逻辑处理组件 28. UserService service = new UserService(); 29.

4、 /处理新增用户请求 30. public void addUser() 31. String userName = “liubin“; 32. String userPwd = “123456“; 33. /调用 UserService 的 addUser 方法进行业务逻辑处理 34. service.addUser(userName,userPwd); 35. 36. . 37. 上面这种风格(见图 6-2)的代码是那么眼熟,又是那么亲切,毕竟用了那么多年,不知是习惯了还是麻木了。在一个类(如 UserAction 类)中需要用到另一个类(如UserService 类),也就是一个类依赖另

5、一个类时,顺手就是一个“new“,当应用变得庞大,依赖关系网也随之复杂,为测试与维护带来的困难呈指数上升。那能不能做到“ 不请自来“呢?答案是可以的。想象一下,如果有一座工厂专门负责生产 Bean 实例的话,“new“的工作就可以交给它了,倘若还能 “送货上门“的话,自然也就“不请自来“ 。这就是 Spring 最初的动机,自 Spring 呱呱坠地之日起,理想变为现实,从此 Java EE 应用开发步入了“不请自来“的时代。例如:1. /* 负责处理用户管理底层数据访问 */ 2. public class UserDao 3. /保存用户数据 4. public void saveUser

6、(User user) 5. /进行数据的保存工作,省略代码 6. 7. . 8. 9. 10. /* 负责处理用户管理业务逻辑 */ 11. public class UserService 12. /仅声明数据访问组件的引用 13. UserDao dao; 14. /处理新增用户业务逻辑 15. public void addUser(String userName,String userPwd) 16. User user = new User(); 17. user.setUserName(userName); 18. user.setUserPwd(userPwd); 19. /调

7、用 UserDao 的 saveUser 方法进行数据保存 20. dao.saveUser(user); 21. 22. /提供一条 UserDao 对象的注入通道 23. public void setDao(UserDao dao) 24. this.dao=dao; 25. 26. . 27. 28. 29. /* 负责生产与分发 Bean 的小作坊 */ 30. public class BeanFactory 31. /生产一个数据访问组件 32. UserDao dao = new UserDao(); 33. /再生产一个业务逻辑处理组件 34. UserService ser

8、vice = new UserService(); 35. /将数据访问组件装配到业务逻辑处理组件中 36. service.setDao(dao); 37. /分发 业务逻辑处理组件 38. public UserService getUserService() 39. return service 40. 41. 42. 43. /* 负责处理用户管理业务请求 */ 44. public class UserAction 45. /实例化 Bean 小作坊 46. BeanFactory beanFactory=new BeanFactory(); 47. /从 Bean 小作坊中取出业务

9、逻辑处理组件实例 48. UserService service=beanFactory.getUserService(); 49. /处理新增用户请求 50. public void addUser() 51. String userName = “liubin“; 52. String userPwd = “123456“; 53. /调用 UserService 的 addUser 方法进行业务逻辑处理 54. service.addUser(userName,userPwd); 55. 56. . 57. 上述代码中,BeanFactory 是我们特意设计的一个 Bean 小作坊,用于

10、生产、装配与分发 Bean 实例。大家可以看到,业务控制器 UserAction 中从 Bean 小作坊取回的业务逻辑组件是已经完全装配好的成品 Bean,在业务逻辑组件 UserService 中再也看不到往昔“new“ 的身影了,这种基于 Bean 容器的设计模式,使控制层、逻辑层及数据层实现充分解耦,如图 6-3 所示,可以提高可测试性与可维护性于是很多保守与固执的“老资历“Java EE 工程师开始呐喊:“反了!反了!“ 。没错,是反了,是控制权发生了反转,应用本身不再负责依赖对象的创建及维护,依赖对象的创建及维护交由外部容器负责。这样控制权就由应用转移到了外部容器,这种控制权的转移就

11、是所谓的控制反转或反转控制。所谓依赖注入就是指程序在运行期,由外部容器动态地将依赖对象注入到组件中。这种依赖注入的过程就如同生产车间将零件装配到机器上一样,注入的过程其实就是一种装配的过程。正是基于这种思想,Spring 才推出了功能强大的 Bean 工厂与控制反转 IoC 容器,在 IoC 容器里通过简单地装配完成 Bean 实例之间的依赖注入6.1.4 何为“面向切面编程 AOP“在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录、事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码。当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心业务逻辑处理

12、才那么几行,如图 6-4 所示。方法复方法,类复类,就这样子带着无可奈何遗憾地度过了多少个春秋。这倒也罢,倘若到了项目的尾声,突然决定在权限控制上需要进行大的变动时,成千上万个方法又得一一“登门拜访“,痛苦“ 雪上加霜 “。如果能把图 6-4 中众多方法中的所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码的话,最起码可以解决两个问题:Java EE 程序员在编写具体的业务逻辑处理方法时,只需关心核心的业务逻辑处理,既提高了工作效率,又使代码变更简洁优雅。在日后的维护中由于业务逻辑代码与共有代码分开存放,而且共有代码是集中存放的,因此使维护工作变得

13、简单轻松。面向切面编程 AOP 技术就是为解决这个问题而诞生的,切面就是横切面,如图 6-5 所示,代表的是一个普遍存在的共有功能,例如,日志切面、权限切面及事务切面等。下面我们以用户管理业务逻辑组件 UserService 的 AOP 实现过程(见图 6-6)为例,深度剖析一下 AOP 技术的实现原理。AOP 技术是建立在Java 语言的反射机制与动态代理机制之上的。业务逻辑组件在运行过程中,AOP 容器会动态创建一个代理对象供使用者调用,该代理对象已经按 Java EE 程序员的意图将切面成功切入到目标方法的连接点上,从而使切面的功能与业务逻辑的功能同时得以执行。从原理上讲,调用者直接调用

14、的其实是 AOP 容器动态生成的代理对象,再由代理对象调用目标对象完成原始的业务逻辑处理,而代理对象则已经将切面与业务逻辑方法进行了合成。现将图 6-6 中涉及到的一些概念解释如下。切面(Aspect ):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通 Java 类,之所以能被 AOP 容器识别成切面,是在配置中指定的。通知(Advice ):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After )与

15、环绕通知(Around )5 种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。连接点(Joinpoint ):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但 Spring 只支持方法级的连接点。切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP 容器的切入。代理对象(Prox

16、y):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种 AOP 实现的特殊编译器;发生在类装载期,就要求有一个支持 AOP 实现的特殊类装载器;只有发生在运行期,则可直接通过 Java 语言的反射机制与动态代理机制来动态实现。 6.1.6 开始 Spring 2.5 旅程-H

17、ello World6在对 Spring 2.5 有了一个初步的了解之后,下面我们将以 Spring 2.5 在 Java App 中的应用 SpringHelloWorld 项目为例,全面演示一下 Spring 的基本使用步骤,请大家重点注意一下面向接口编程的实际应用及 applicationContext.xml 的具体配置。(1)创建一个“Java Project“,命名为“SpringHelloWorld“。(2)创建一个文件夹“lib“用于存放 Spring 2.5 框架的 Jar 包。(3)将 Spring 2.5 所需的 spring-beans.jar、spring-conte

18、xt.jar、spring-core.jar、commons- attributes-compiler.jar、commons-attributes-api.jar、commons-logging.jar 及 log4j-1.2.15.jar 复制到 lib 文件夹下,将这些 Jar 包加入到项目的Classpath 中。(4)创建以下几个包,用于存放项目的类或接口:test.spring.dao 包(存放数据访问接口)、test.spring.dao.impl 包(存放数据访问接口实现)、test.spring.service 包(存放业务逻辑接口)、test.spring.service.

19、impl 包(存放业务逻辑接口实现)、test.spring.action 包(存放业务控制组件)、 test.spring.bean 包(存放 ORM 对象)、test.spring.junit 包(存放 Junit 测试用例)。(5)编写用户 ORM 类 User,代码如下:1. package test.spring.bean; 2. /* 用户持久化类 */ 3. public class User 4. Integer id;/自然 ID 号 5. String userName; /用户名 6. String userPwd;/用户密码 7. /默认构造方法 8. public U

20、ser() 9. /自定义构造方法 10. public User(Integer id, String userName, String userPwd) 11. this.id = id; 12. this.userName = userName; 13. this.userPwd = userPwd; 14. 15. /省略属性的 get/set 方法对 16. (6)编写数据访问接口 UserDao,代码如下:1. package test.spring.dao; 2. import test.spring.bean.User; 3. /* 用户管理底层数据访问接口 */ 4. pub

21、lic interface UserDao 5. /处理新增用户业务逻辑 6. public void addUser(User user); 7. /处理装载用户业务逻辑 8. public User loadUser(Integer id); 9. /处理修改用户业务逻辑 10. public void modiUser(User user); 11. /处理删除用户业务逻辑 12. public void delUser(Integer id); 13. (7)编写数据访问接口实现类 UserDaoImpl,代码如下:1. package test.spring.dao.impl; 2.

22、 import test.spring.bean.User; 3. import test.spring.dao.UserDao; 4. /* 用户管理底层数据访问接口实现 */ 5. public class UserDaoImpl implements UserDao 6. /处理新增用户业务逻辑 7. public void addUser(User user) 8. /由于该实例未实现数据库访问,省略插入数据库记录的代码 9. System.out.println(“用户名为“+user.getUserName()+“的用户新增成功!“); 10. 11. /处理删除用户业务逻辑 12. public void delUser(Integer id) 13. /由于该实例未实现数据库访问,省略删除数据库记录的代码 14. System.out.println(“ID 号为“ +id+“的用户删除成功!“);

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。