《使用Spring容器管理对象.ppt》由会员分享,可在线阅读,更多相关《使用Spring容器管理对象.ppt(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、IBM 课程体系 2011 IBM CorporationJ2EE第八章第八章第八章第八章使用使用使用使用SpringSpring容器管理容器管理容器管理容器管理对对象象象象IBM 课程体系 2010 IBM Corporation2J2EE回顾回顾补全下面的代码。补全下面的代码。public List searchByTitle(String title)Session session=super.getSession();String hql=(1);(2);/创建创建Query对象对象 query.setString(3),title);return (4);IBM 课程体系 2010
2、IBM Corporation3J2EE本章任务本章任务使用使用“依赖注入依赖注入”实现实现“动态组装动态组装”的打印机的打印机使用使用“面向方面编程面向方面编程”实现日志系统实现日志系统配置为使用配置为使用colorInk、b5Paper时的运行结果时的运行结果配置为使用配置为使用greyInk、a4Paper时的运行结果时的运行结果IBM 课程体系 2010 IBM Corporation4J2EE掌握掌握Spring依赖注入的原理依赖注入的原理掌握掌握Spring AOP原理原理本章目标本章目标IBM 课程体系 2010 IBM Corporation5J2EESpring之父之父Rod
3、 JohnsonSpringFramework创始人创始人,interface21 CEO丰富的丰富的c/c+背景,丰富的金融行业背景背景,丰富的金融行业背景1996年开始关注年开始关注Java服务器端技术服务器端技术Servlet2.4和和JDO2.0专家组成员专家组成员2002年著写年著写Expoert one-on-oneJ2EE设计与开发设计与开发,改变了,改变了Java世界世界技术主张:技术实用为本技术主张:技术实用为本音乐学博士音乐学博士IBM 课程体系 2010 IBM Corporation6J2EESpring的绿草丛的绿草丛的绿草丛的绿草丛Spring:轻量级框架轻量级框架
4、,Java EE的春天的春天,当前主流框架当前主流框架目标目标:使现有技术更加易用使现有技术更加易用,推进编码最佳实践推进编码最佳实践内容内容:依赖注入容器依赖注入容器,AOP实现实现(声明式事务声明式事务),DAO/ORM支持支持,Web集成集成IBM 课程体系 2010 IBM Corporation7J2EE为什么使用依赖注入(为什么使用依赖注入(DI)面向对象使系统的实现变得容易面向对象使系统的实现变得容易当系统复杂到一定程度时,仅仅面向当系统复杂到一定程度时,仅仅面向对象就不够了对象就不够了目的:解耦合。实现每个组件块目的:解耦合。实现每个组件块时只关注组件内部的事情时只关注组件内部
5、的事情要点:明确定义组件间的接口要点:明确定义组件间的接口“过于过于”复杂的软件系统复杂的软件系统组件化的思想组件化的思想依赖注入:强制将组件的构建和使用分开依赖注入:强制将组件的构建和使用分开 组件的使用组件的使用 组件的生产组件的生产 接口的定义接口的定义运行时注入运行时注入IBM 课程体系 2010 IBM Corporation8J2EE如何开发一个打印机?如何开发一个打印机?打印机打印机功能的实现依赖于功能的实现依赖于 墨盒墨盒 和和 纸张纸张。步骤:步骤:1、定义墨盒和纸张的、定义墨盒和纸张的接口接口标准。标准。2、使用接口标准开发打印机。、使用接口标准开发打印机。3、组装、组装打
6、印机。打印机。4、运行打印机。、运行打印机。怎样使用依赖注入怎样使用依赖注入A4B5彩色墨盒彩色墨盒双色墨盒双色墨盒IBM 课程体系 2010 IBM Corporation9J2EE怎样使用依赖注入怎样使用依赖注入1.定义组件接口定义组件接口墨盒接口:墨盒接口:Ink纸张接口:纸张接口:Page2.使用接口开发打印机使用接口开发打印机public interface Ink public String getColor(int r,int g,int b);public interface Paper public static final String newline=rn;/*输出字符到
7、纸张输出字符到纸张*/public void putInChar(char c);/*得到输出到纸张上的内容得到输出到纸张上的内容*/public String getContent();public class Printer public Ink ink=null;public Paper paper=null;public void print(String str)(使用使用+ink.getColor(255,200,0).+颜色打印颜色打印);for(int i=0;istr.length();+i)/逐字符输出到纸张逐字符输出到纸张paper.putInChar(str.charA
8、t(i);System.out.print(paper.getContent();/将纸张的内容输出将纸张的内容输出 我们在开发打印机我们在开发打印机时,使用了时,使用了Ink和和Paper接口。但并接口。但并不关心其实现。不关心其实现。ink和和paper何时何时被实例化呢?被实例化呢?IBM 课程体系 2010 IBM Corporation10J2EE怎样使用依赖注入怎样使用依赖注入3、组装打印机、组装打印机1、为了方便组装,我们给、为了方便组装,我们给Printer类的类的ink和和paper属性增加属性增加setter方法方法2、创建或得到、创建或得到Ink和和Paper的实现类的实
9、现类3、使用、使用Spring进行组装进行组装编辑编辑applicationContext.xml文件文件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
10、TextPaper();a4Paper.setCharPerLine(10);a4Paper.setLinePerPage(8);依赖注入依赖注入IBM 课程体系 2010 IBM Corporation11J2EE组装打印机组装打印机依赖注入:组装打印机依赖注入:组装打印机A4B5双色墨盒双色墨盒彩色墨盒彩色墨盒 IBM 课程体系 2010 IBM Corporation12J2EE怎样使用依赖注入怎样使用依赖注入4.运行打印机运行打印机public static void main(String args)ApplicationContext context=new ClassPathXm
11、lApplicationContext(applicationContext.xml);/由由Spring创建创建printer对象,并根据配置文件注入对象,并根据配置文件注入/依赖的组件,完成组装依赖的组件,完成组装Printer printer=(Printer)context.getBean(printer);printer.print(几位轻量级容器的作者曾骄傲地对我几位轻量级容器的作者曾骄傲地对我.);配置为使用配置为使用greyInk、a4Paper时的运行结果时的运行结果通过通过SpringSpring:我们可以象更换打我们可以象更换打印机的墨盒和打印印机的墨盒和打印纸一样地更换
12、程序纸一样地更换程序组件。组件。这就是依赖注入带这就是依赖注入带来的魔力!来的魔力!配置为使用配置为使用colorInk、b5Paper时的运行结果时的运行结果IBM 课程体系 2010 IBM Corporation13J2EE项目中应用依赖注入项目中应用依赖注入使用依赖注入组装原有系统使用依赖注入组装原有系统actionbizDAO依赖依赖依赖依赖依赖依赖依赖依赖XDAO xDAO=new XDAOJdbcImpl();将组件的实将组件的实现类硬编码现类硬编码以前的系统以前的系统以前的系统以前的系统自从有了依自从有了依自从有了依自从有了依赖赖注入注入注入注入.private XDAO xD
13、AO=null;public void setXDAO(XDAO dao)xDAO=dao;不再依赖具体实现不再依赖具体实现类。通过类。通过setter方法方法运行时注入。运行时注入。现在的系统现在的系统现在的系统现在的系统IBM 课程体系 2010 IBM Corporation14J2EE小结小结编写编写gbeens.xml,使下面的程序输出:,使下面的程序输出:“张嘎说:三天不打小鬼子,手都痒痒张嘎说:三天不打小鬼子,手都痒痒”public class Greeting private String person;private String words;public String se
14、tPerson(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();IBM
15、课程体系 2010 IBM Corporation15J2EE面向方面编程(面向方面编程(AOP)Spring带来的好处:带来的好处:让我们可以让我们可以让我们可以让我们可以“专心做事专心做事专心做事专心做事”依赖注入依赖注入依赖注入依赖注入(DIDI)编写程序时不用关心其依编写程序时不用关心其依赖的组件赖的组件面向方面编程面向方面编程面向方面编程面向方面编程(AOPAOP)将程序中涉及的公共问题将程序中涉及的公共问题集中解决集中解决怎样实现的呢?怎样实现的呢?IBM 课程体系 2010 IBM Corporation16J2EEAspect:方面:方面哪些哪些“方面方面”需要关注:需要关注:
16、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(.)ca
17、tch(.)/事务控制事务控制 mit();我们构建系统的目的我们构建系统的目的是解决业务问题是解决业务问题在编码实现业务逻辑在编码实现业务逻辑前,需要先解决如此前,需要先解决如此繁多而且复杂的多个繁多而且复杂的多个方面的事情方面的事情注意力被分散了,注意力被分散了,业务代码质量得业务代码质量得不到保障不到保障这些方面又都是这些方面又都是不可或缺的,绝不可或缺的,绝不能丢开不管不能丢开不管这正是这正是AOPAOP要解要解决的问题决的问题,Follow Follow meme!怎样才能怎样才能“专心专心”做事?做事?IBM 课程体系 2010 IBM Corporation17J2EE怎样使用怎
18、样使用AOP使用使用AOP方式实现日志系统方式实现日志系统业务介绍:将业务逻辑层每个方法的调用时间和参数输出到控制台业务介绍:将业务逻辑层每个方法的调用时间和参数输出到控制台AOP思路:分别编写思路:分别编写 业务逻辑代码业务逻辑代码 和和“方面方面”代码,运行时再组装代码,运行时再组装1、编写业务逻辑接口和实现类,不用关心、编写业务逻辑接口和实现类,不用关心“方面方面”只需要编写业务只需要编写业务逻辑相关的代码逻辑相关的代码IBM 课程体系 2010 IBM Corporation18J2EE怎样使用怎样使用AOP2、编写方面代码,实现、编写方面代码,实现 MethodBeforeAdvic
19、e接口接口编写前置通知需要实现编写前置通知需要实现MethodBeforeAdvice接口。接口。Advice:通知,定义一个:通知,定义一个“方面方面”要实现的功能。要实现的功能。分前置通知、后置通知、环绕通知和异常通知等类型。分前置通知、后置通知、环绕通知和异常通知等类型。通过配置,通过配置,前置通知前置通知中的代码将在方法调用前自动执行。中的代码将在方法调用前自动执行。将要执行的方法,将要执行的方法,参数和对应的对象参数和对应的对象描述描述“方面方面”逻辑的代逻辑的代码码IBM 课程体系 2010 IBM Corporation19J2EE怎样使用怎样使用AOP3、组装、组装采用代理的方
20、式采用代理的方式target:目标,被代理的:目标,被代理的bean,包含业务代码,包含业务代码通知通知bean:包含:包含“方面方面”代码代码代理类:最终代理类:最终通过代理类访通过代理类访问业务逻辑问业务逻辑将将“业务逻辑代码业务逻辑代码”和和“方面代码方面代码”组装进代理类组装进代理类IBM 课程体系 2010 IBM Corporation20J2EE怎样使用怎样使用AOP4、运行、运行得到的是代理类得到的是代理类的实例的实例面向接口编程,面向接口编程,不涉及具体实不涉及具体实现类现类方法调用前自方法调用前自动执行了动执行了“方方面面”代码代码IBM 课程体系 2010 IBM Cor
21、poration21J2EE小结小结AOP目标:专心做事目标:专心做事AOP原理原理将散布在系统中的公共功能集中解决将散布在系统中的公共功能集中解决AOP实现实现采用一个机制采用一个机制1.将复杂的需求分解出不同方面将复杂的需求分解出不同方面2.专心做事专心做事3.组装起来运行组装起来运行IBM 课程体系 2010 IBM Corporation22J2EE小结小结Spring的的AOP机制机制在方法调用前、后、环绕或抛出异常时,在方法调用前、后、环绕或抛出异常时,“织入织入”方面代码方面代码通过代理访问被代理的类通过代理访问被代理的类环绕通知通知方法执行方法执行前置通知前置通知后置通知后置通
22、知代理代理原原Bean通知(通知(Advice)IBM 课程体系 2010 IBM Corporation23J2EE小结小结在线购书系统中,要求不修改在线购书系统中,要求不修改BookBizImpl代码的情况下代码的情况下增加如下功能:增加如下功能:对买书的用户进行返利:每买一册书返利对买书的用户进行返利:每买一册书返利3元。元。即:每调用一次即:每调用一次buy方法打印:方法打印:“销售返利销售返利时间时间用户名用户名:返利返利3元。元。”提示:提示:1.返利是在购书成功后进行的,因此应该使用后置通知。返利是在购书成功后进行的,因此应该使用后置通知。2.后置通知范例:后置通知范例:publ
23、ic class RakeOffAdvice implements AferReturningAdvice public void afterReturning(Object returnValue,Method m,Object args,Object target)throws Throwable /TODO:your code here IBM 课程体系 2010 IBM Corporation24J2EE总结总结Spring包含哪些内容?包含哪些内容?依赖注入的好处是?依赖注入的好处是?Spring怎么实现依赖注入?怎么实现依赖注入?“面向方面编程面向方面编程”的好处是?的好处是?Spring怎么实现怎么实现AOP?依赖注入容器、依赖注入容器、AOP实现、实现、DAO/ORM支持、支持、Web集成集成分离组件的使用和实现分离组件的使用和实现添加添加getter/setter方法,使用配置文件组装方法,使用配置文件组装将将“方面方面”分离出来,写代码时只需关注当前业务逻辑分离出来,写代码时只需关注当前业务逻辑在方法调用前、后或抛出异常时在方法调用前、后或抛出异常时“织入织入”方面代码方面代码
限制150内