资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第八章,使用Spring容器管理对象,All Right Reserved Copyright 中南大学 2010,回顾,补全下面的代码。,public List searchByTitle(String title) Session session = super.getSession();String hql = “ (1) “; (2) ;/创建Query对象query.setString(“ (3) “, title); return (4) ; ,All Right Reserved Copyright 中南大学 2010,预习检查,根据你的理解,“依赖注入”是什么?根据你的理解,谈谈“依赖注入”适于在项目中应用吗?你理解的“面向方面编程(AOP)”是什么样的?,All Right Reserved Copyright 中南大学 2010,本章任务,使用“依赖注入”实现“动态组装”的打印机 使用“面向方面编程”实现日志系统,配置为使用colorInk、 b5Paper时的运行结果,配置为使用greyInk、 a4Paper时的运行结果,All Right Reserved Copyright 中南大学 2010,掌握Spring依赖注入的原理 掌握Spring AOP原理,本章目标,All Right Reserved Copyright 中南大学 2010,Spring之父,Rod JohnsonSpringFramework创始人, interface21 CEO 丰富的c/c+背景,丰富的金融行业背景1996年开始关注Java服务器端技术 Servlet2.4和JDO2.0专家组成员 2002年著写Expoert one-on-one J2EE设计与开发,改变了Java世界技术主张:技术实用为本 音乐学博士,All Right Reserved Copyright 中南大学 2010,Spring的绿草丛,Spring : 轻量级框架, Java EE的春天,当前主流框架 目标: 使现有技术更加易用,推进编码最佳实践 内容: 依赖注入容器,AOP实现(声明式事务), DAO/ORM支持,Web集成,“过于”复杂的软件系统 组件化的思想 依赖注入:强制将组件的构建和使用分开,All Right Reserved Copyright 中南大学 2010,为什么使用依赖注入(DI),面向对象使系统的实现变得容易,当系统复杂一定程度时,仅仅面向 象到就不够了,目的:解耦合。实现每个组件块时只关注组件内部的事情,要点:明确定义组件间的接口,组件的使用,组件的生产,接口的定义,运行时注入,All Right Reserved Copyright 中南大学 2010,如何开发一个打印机?打印机功能的实现依赖于 墨盒 和 纸张。 步骤: 1、定义墨盒和纸张的接口标准。 2、使用接口标准开发打印机。 3、组装打印机。 4、运行打印机。,怎样使用依赖注入,彩色墨盒,双色墨盒,All Right Reserved Copyright 中南大学 2010,怎样使用依赖注入,定义组件接口 墨盒接口:Ink 纸张接口:Page 使用接口开发打印机,public interface Ink public String getColor(int r,int g,int b); ,public interface Paper public static final String newline = “rn“; /* 输出字符到纸张*/ public void putInChar(char c); /* 得到输出到纸张上的内容*/ public String getContent(); ,public class Printer public Ink ink = null;public Paper paper = null; public void print(String str)System.out.println(“使用“+ink.getColor(255, 200, 0).+“颜色打印“);for(int i=0;istr.length();+i)/ 逐字符输出到纸张paper.putInChar(str.charAt(i);System.out.print(paper.getContent(); / 将纸张的内容输出 ,我们在开发打印机时,使用了Ink和Paper接口。但并不关心其实现。,ink和paper何时被实例化呢?,3、组装打印机 1、为了方便组装,我们给Printer类的ink和paper属性增加setter方法 2、创建或得到Ink和Paper的实现类 3、使用Spring进行组装编辑applicationContext.xml文件,All Right Reserved Copyright 中南大学 2010,public class Printer public Ink ink = null;public Paper paper = null; . . public void setInk(Ink ink) this.ink = ink;public void setPaper(Paper paper) this.paper = paper; ,怎样使用依赖注入,给项目添加Spring支持,相当于: ColorInk colorInk = new ColorInk();,相当于: TextPaper a4Paper = new TextPaper(); a4Paper.setCharPerLine(10); a4Paper.setLinePerPage(8);,依赖注入,All Right Reserved Copyright 中南大学 2010,组装打印机,依赖注入:组装打印机,All Right Reserved Copyright 中南大学 2010,怎样使用依赖注入,4. 运行打印机,public static void main(String args)ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml“);/ 由Spring创建printer对象,并根据配置文件注入/ 依赖的组件,完成组装Printer printer = (Printer)context.getBean(“printer“);printer.print(“几位轻量级容器的作者曾骄傲地对我.“); ,配置为使用greyInk、 a4Paper时的运行结果,通过Spring: 我们可以象更换打印机的墨盒和打印纸一样地更换程序组件。 这就是依赖注入带来的魔力!,配置为使用colorInk、 b5Paper时的运行结果,All Right Reserved Copyright 中南大学 2010,项目中应用依赖注入,使用依赖注入组装原有系统,action,biz,DAO,XDAO xDAO = new XDAOJdbcImpl();,将组件的实现类硬编码,以前的系统,自从有了依赖注入 .,private XDAO xDAO = null; public void setXDAO(XDAO dao)xDAO = dao; ,不再依赖具体实现类。通过setter方法运行时注入。,现在的系统,All Right Reserved Copyright 中南大学 2010,小结,编写gbeens.xml,使下面的程序输出:“张嘎说:三天不打小鬼子,手都痒痒”,public class Greeting private String person ;private String words ; public String setPerson(String p)persion = p; public String setWords(String w)words = w; public void sayGreeting()System.out.println(person + “说:“ + words); ,public static void main(String args)ApplicationContext context = new ClassPathXmlApplicationContext(“gbeens.xml“);Greeting g = (Greeting)context.getBean(“g“);g. sayGreeting(); ,All Right Reserved Copyright 中南大学 2010,面向方面编程(AOP),Spring带来的好处:让我们可以 “专心做事”,依赖注入 (DI),编写程序时不用关心其依赖的组件,面向方面编程 (AOP),将程序中涉及的公共问题集中解决,怎样实现的呢?,All Right Reserved Copyright 中南大学 2010,Aspect:方面,哪些“方面”需要关注:,public void doSameBusiness (long lParam,String sParam)/ 记录日志log.info(“调用 doSameBusiness方法,参数是:“+lParam);/ 输入合法性验证if (lParam=0)throws new IllegalArgumentException(“xx应该大于0“);if (sParam=null | sParam.trim().equals(“)throws new IllegalArgumentException(“xx不能为空“);/ 异常处理try .catch(.)catch(.)/ 事务控制tx.commit(); ,我们构建系统的目的是解决业务问题,在编码实现业务逻辑前,需要先解决如此繁多而且复杂的多个方面的事情,注意力被分散了,业务代码质量得不到保障,这些方面又都是不可或缺的,绝不能丢开不管,这正是AOP要解决的问题,Follow me!,怎样才能“专心”做事?,All Right Reserved Copyright 中南大学 2010,怎样使用AOP,使用AOP方式实现日志系统 业务介绍:将业务逻辑层每个方法的调用时间和参数输出到控制台 AOP思路:分别编写 业务逻辑代码 和 “方面”代码,运行时再组装 1、编写业务逻辑接口和实现类,不用关心“方面”,只需要编写业务逻辑相关的代码,All Right Reserved Copyright 中南大学 2010,怎样使用AOP,2、编写方面代码,实现 MethodBeforeAdvice接口,编写前置通知需要实现MethodBeforeAdvice接口。,Advice:通知,定义一个“方面”要实现的功能。分前置通知、后置通知、环绕通知和异常通知等类型。,通过配置,前置通知中的代码将在方法调用前自动执行。,将要执行的方法,参数和对应的对象,描述“方面”逻辑的代码,All Right Reserved Copyright 中南大学 2010,怎样使用AOP,3、组装,采用代理的方式,target:目标,被代理的bean,包含业务代码,通知bean:包含“方面”代码,代理类:最终通过代理类访问业务逻辑,将“业务逻辑代码”和“方面代码”组装进代理类,All Right Reserved Copyright 中南大学 2010,怎样使用AOP,4、运行,得到的是代理类的实例,面向接口编程,不涉及具体实现类,方法调用前自动执行了“方面”代码,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号