第5章Spring应用课堂.ppt

上传人:豆**** 文档编号:60591513 上传时间:2022-11-17 格式:PPT 页数:89 大小:1.54MB
返回 下载 相关 举报
第5章Spring应用课堂.ppt_第1页
第1页 / 共89页
第5章Spring应用课堂.ppt_第2页
第2页 / 共89页
点击查看更多>>
资源描述

《第5章Spring应用课堂.ppt》由会员分享,可在线阅读,更多相关《第5章Spring应用课堂.ppt(89页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第5章Spring应用课堂 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望回顾:Struts2应用Struts2Struts2开发流程:开发流程:开发流程:开发流程:2 2个个个个XML+ActionXML+Action类类类类+JSP+JSP页面页面页面页面+JavaBean+JavaBean校验器:校验器:校验器:校验器:validatevalidate方法或者方法或者方法或者方法或者XMLXML校验器校验器校验器校验器 注意:命名注意:命名注意:命名注意:命

2、名+位置位置位置位置拦截器:拦截器:拦截器:拦截器:struts.xmlstruts.xml配置配置配置配置 拦截器类(继承拦截器类(继承拦截器类(继承拦截器类(继承AbstractInterceptorAbstractInterceptor,重写,重写,重写,重写interceptintercept方法方法)国际化:国际化:国际化:国际化:struts.propertiesstruts.properties 相应语言的相应语言的相应语言的相应语言的propertiesproperties文件文件文件文件(*_zh_CN.properties(*_zh_CN.properties或或或或*_e

3、n_US.properties)*_en_US.properties)位置位置位置位置+命名命名命名命名2回顾:Hibernate应用Hibernate开发步骤:(1 1)创建)创建)创建)创建HibernateHibernate的配置文件。的配置文件。的配置文件。的配置文件。(2 2)创建持久化类。)创建持久化类。)创建持久化类。)创建持久化类。(3 3)创建对象)创建对象)创建对象)创建对象-关系映射文件。关系映射文件。关系映射文件。关系映射文件。(4 4)通过)通过)通过)通过HibernateAPIHibernateAPI编写访问数据库的代码。编写访问数据库的代码。编写访问数据库的代码

4、。编写访问数据库的代码。3第5章Spring应用4第5章Spring应用5.1Spring5.1Spring概述概述概述概述5.2Spring5.2Spring核心机制核心机制核心机制核心机制依赖注入依赖注入依赖注入依赖注入5.3Spring5.3Spring核心接口及基本配置核心接口及基本配置核心接口及基本配置核心接口及基本配置5.4SpringAOP5.4SpringAOP5.5Spring5.5Spring事务支持事务支持事务支持事务支持5.6Spring5.6Spring与与与与Struts2Struts2整合应用整合应用整合应用整合应用5.7Spring5.7Spring与与与与Hi

5、bernateHibernate整合应用整合应用整合应用整合应用55.1Spring概述Spring框架的主要优势之一是其框架的主要优势之一是其分层架构分层架构,分层架构允许选,分层架构允许选择使用任一个组件,同时为择使用任一个组件,同时为JavaEE应用程序开发提供集成应用程序开发提供集成的框架。的框架。Spring框架的分层架构,由框架的分层架构,由7个定义良好的模块组个定义良好的模块组成。成。Spring模块构建在核心容器之上,核心容器定义了创建、模块构建在核心容器之上,核心容器定义了创建、配置和管理配置和管理Bean的方式,如图的方式,如图5.1所示。所示。图5.1Spring框架的组

6、件结构图65.1Spring概述组成组成组成组成SpringSpring框架的每个模块(或组件)都可以单独存在,框架的每个模块(或组件)都可以单独存在,框架的每个模块(或组件)都可以单独存在,框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。各模块的功能如或者与其他一个或多个模块联合实现。各模块的功能如或者与其他一个或多个模块联合实现。各模块的功能如或者与其他一个或多个模块联合实现。各模块的功能如下:下:下:下:核心容器。提供核心容器。提供核心容器。提供核心容器。提供SpringSpring框架的基本功能,其主要组件是框架的基本功能,其主要组件是框架的基本功能,其主要组

7、件是框架的基本功能,其主要组件是BeanFactoryBeanFactory,是工厂模式的实现。,是工厂模式的实现。,是工厂模式的实现。,是工厂模式的实现。SpringSpring上下文。向上下文。向上下文。向上下文。向SpringSpring框架提供上下文信息,包括框架提供上下文信息,包括框架提供上下文信息,包括框架提供上下文信息,包括企业服务,如企业服务,如企业服务,如企业服务,如JNDIJNDI、EJBEJB、电子邮件、国际化、校验和调、电子邮件、国际化、校验和调、电子邮件、国际化、校验和调、电子邮件、国际化、校验和调度等。度等。度等。度等。SpringAOPSpringAOP。通过配置

8、管理特性,可以很容易地使。通过配置管理特性,可以很容易地使。通过配置管理特性,可以很容易地使。通过配置管理特性,可以很容易地使 SpringSpring框架管理的任何对象支持框架管理的任何对象支持框架管理的任何对象支持框架管理的任何对象支持AOPAOP。SpringAOPSpringAOP模模模模块直接将面向方面编程的功能集成到块直接将面向方面编程的功能集成到块直接将面向方面编程的功能集成到块直接将面向方面编程的功能集成到SpringSpring框架中。它为框架中。它为框架中。它为框架中。它为基于基于基于基于SpringSpring应用程序的对象提供了事务管理服务。应用程序的对象提供了事务管理

9、服务。应用程序的对象提供了事务管理服务。应用程序的对象提供了事务管理服务。SpringDAOSpringDAO。JDBCDAOJDBCDAO抽象层提供了有用的异常层抽象层提供了有用的异常层抽象层提供了有用的异常层抽象层提供了有用的异常层次结构,用来管理异常处理和不同数据库供应商抛出的错次结构,用来管理异常处理和不同数据库供应商抛出的错次结构,用来管理异常处理和不同数据库供应商抛出的错次结构,用来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低误消息。异常层次结构简化了错误处理,并且极大地降低误消息。异常层次结构简化了错误处理,并且极大地降低误消息。异常层

10、次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(如打开和关闭连接)。了需要编写的异常代码数量(如打开和关闭连接)。了需要编写的异常代码数量(如打开和关闭连接)。了需要编写的异常代码数量(如打开和关闭连接)。75.1Spring概述 SpringORMSpringORM。SpringSpring框架插入了若干框架插入了若干框架插入了若干框架插入了若干ORMORM框架,提框架,提框架,提框架,提供供供供ORMORM的对象关系工具,其中包括的对象关系工具,其中包括的对象关系工具,其中包括的对象关系工具,其中包括JDOJDO、HibernateHibernate和和和和iBatisSQL

11、MapiBatisSQLMap,并且都遵从,并且都遵从,并且都遵从,并且都遵从SpringSpring的通用事务和的通用事务和的通用事务和的通用事务和DAODAO异常层次结构。异常层次结构。异常层次结构。异常层次结构。SpringWebSpringWeb模块。为基于模块。为基于模块。为基于模块。为基于WebWeb的应用程序提供上下的应用程序提供上下的应用程序提供上下的应用程序提供上下文。它建立在应用程序上下文模块之上,简化了处理多份文。它建立在应用程序上下文模块之上,简化了处理多份文。它建立在应用程序上下文模块之上,简化了处理多份文。它建立在应用程序上下文模块之上,简化了处理多份请求及将请求参

12、数绑定到域对象的工作。请求及将请求参数绑定到域对象的工作。请求及将请求参数绑定到域对象的工作。请求及将请求参数绑定到域对象的工作。SpringSpring框架支持框架支持框架支持框架支持与与与与JakartaStrutsJakartaStruts的集成。的集成。的集成。的集成。SpringMVCSpringMVC框架,是一个全功能构建框架,是一个全功能构建框架,是一个全功能构建框架,是一个全功能构建WebWeb应用程序的应用程序的应用程序的应用程序的 MVCMVC实现。通过策略接口实现高度可配置,实现。通过策略接口实现高度可配置,实现。通过策略接口实现高度可配置,实现。通过策略接口实现高度可配

13、置,MVCMVC容纳了容纳了容纳了容纳了大量视图技术,其中包括大量视图技术,其中包括大量视图技术,其中包括大量视图技术,其中包括JSPJSP、VelocityVelocity、TilesTiles、iTextiText和和和和POIPOI。8第5章Spring应用5.1Spring5.1Spring概述概述概述概述5.2Spring5.2Spring核心机制核心机制核心机制核心机制依赖注入依赖注入依赖注入依赖注入5.3Spring5.3Spring核心接口及基本配置核心接口及基本配置核心接口及基本配置核心接口及基本配置5.4SpringAOP5.4SpringAOP5.5Spring5.5Sp

14、ring事务支持事务支持事务支持事务支持5.6Spring5.6Spring与与与与Struts2Struts2整合应用整合应用整合应用整合应用5.7Spring5.7Spring与与与与HibernateHibernate整合应用整合应用整合应用整合应用95.2Spring核心机制依赖注入5.2.15.2.1工厂模式工厂模式工厂模式工厂模式下面举例说明工厂模式的应用。下面举例说明工厂模式的应用。创建一个创建一个JavaProjectJavaProject,命名为,命名为“FactoryExample”“FactoryExample”。在。在srcsrc文件夹下建立包文件夹下建立包facefa

15、ce,在该包下建立接口,在该包下建立接口HumanHuman,代码如下:,代码如下:在在srcsrc文件夹下建立包文件夹下建立包ifaceiface,在该包下建立,在该包下建立ChineseChinese类和类和AmericanAmerican类,分别实现类,分别实现HumanHuman接口。接口。packageface;publicinterfaceHumanvoideat();voidwalk();105.2.1工厂模式American.java、Chinese.java代码如下:packageiface;importface.Human;publicclassAmericanimplem

16、entsHumanpublicvoideat()System.out.println(美国人吃西餐!美国人吃西餐!);publicvoidwalk()System.out.println(美国人经常坐车!美国人经常坐车!);packageiface;importface.Human;publicclassChineseimplementsHumanpublicvoideat()System.out.println(中国人很会吃!中国人很会吃!);publicvoidwalk()System.out.println(中国人健步如飞!中国人健步如飞!);115.2.1工厂模式在src文件夹下建包f

17、actory,在该包内建立工厂类Factory,代码如下:packagefactory;importiface.American;importiface.Chinese;importface.Human;publicclassFactorypublicHumangetHuman(Stringname)if(name.equals(Chinese)returnnewChinese();elseif(name.equals(American)returnnewAmerican();elsethrownewIllegalArgumentException(参数不正确参数不正确);125.2.1工厂模

18、式在src文件夹下建包test,在该包内建立测试类Test,代码如下:packagetest;importface.Human;importfactory.Factory;publicclassTestpublicstaticvoidmain(Stringargs)Humanhuman=null;human=newFactory().getHuman(Chinese);human.eat();human.walk();human=newFactory().getHuman(American);human.eat();human.walk();135.2.1工厂模式该程序为Java应用程序,直接

19、运行可看出结果,如图5.2所示。图5.2工厂模式运行结果145.2.2依赖注入应用1.1.为项目添加为项目添加为项目添加为项目添加SpringSpring开发能力开发能力开发能力开发能力右击项目名,选择【右击项目名,选择【MyEclipseMyEclipse】【AddSpringAddSpringCapabilitiesCapabilities】菜单项,将出现如图】菜单项,将出现如图5.35.3所示的对话框,选中所示的对话框,选中要应用的要应用的SpringSpring的版本及所需的类库文件。的版本及所需的类库文件。图5.3选择Spring版本及类库对话框155.2.2依赖注入应用选择结束后,

20、单击【Next】按钮,出现如图5.4所示的界面。用于创建Spring的配置文件。单击【Finish】按钮完成。项目的src文件夹下会出现名为applicationContext.xml的文件,这就是Spring的核心配置文件。图5.4创建Spring的配置文件165.2.2依赖注入应用2、修改applicationContext.xml175.2.2依赖注入应用3.修改测试类修改测试类配置完成后,就可以修改Test类。publicclassTestpublicstaticvoidmain(Stringargs)/*Humanhuman=null;human=newFactory().getHu

21、man(Chinese);human.eat();human.walk();human=newFactory().getHuman(American);human.eat();human.walk();*/ApplicationContextctx=newFileSystemXmlApplicationContext(src/applicationContext.xml);Humanhuman=null;human=(Human)ctx.getBean(chinese);human.eat();human.walk();human=(Human)ctx.getBean(american);hu

22、man.eat();human.walk();185.2.2依赖注入应用4.运行运行运行该测试类,结果如图5.5所示。图5.5运行结果195.2.2依赖注入应用对象ctx就相当于原来的Factory工厂,原来的Factory可以删除掉了。再回头看原来的applicationContext.xml文件配置:id是ctx.getBean的参数值,一个字符串。class是一个类(包名+类名)。然后在Test类里获得Chinese对象及American对象:human=(Human)ctx.getBean(american);human=(Human)ctx.getBean(american);205

23、.2.3注入的两种方式1.1.设置注入设置注入设置注入设置注入设置注入是通过设置注入是通过settersetter方法注入被调用者的实例。这种方方法注入被调用者的实例。这种方法简单、直观,很容易理解,因而法简单、直观,很容易理解,因而SpringSpring的依赖注入被的依赖注入被大量使用,下面举例说明。大量使用,下面举例说明。创建一个创建一个JavaProjectJavaProject,命名为,命名为“FactoryExample1”“FactoryExample1”。在项目的在项目的srcsrc文件夹下建立下面的源文件。文件夹下建立下面的源文件。HumanHuman的接口,的接口,Huma

24、n.javaHuman.java,代码如下:,代码如下:LanguageLanguage接口,接口,Language.javaLanguage.java,代码如下:,代码如下:publicinterfaceLanguagepublicStringkind();publicinterfaceHumanvoidspeak();215.2.3注入的两种方式下面是Human实现类Chinese.java代码:下面是Language实现类English.java代码:publicclassEnglishimplementsLanguage publicStringkind()return中国人也会说英语

25、!中国人也会说英语!;publicclassChineseimplementsHuman privateLanguagelan;publicvoidspeak()System.out.println(lan.kind();publicvoidsetLan(Languagelan)this.lan=lan;225.2.3注入的两种方式下面通过Spring的配置文件来完成其对象的注入。代码如下:235.2.3注入的两种方式测试代码如下:程序执行结果如图5.6所示。importorg.springframework.context.ApplicationContext;importorg.sprin

26、gframework.context.support.FileSystemXmlApplicationContext;publicclassTestpublicstaticvoidmain(Stringargs)ApplicationContextctx=newFileSystemXmlApplicationContext(src/applicationContext.xml);Humanhuman=null;human=(Human)ctx.getBean(chinese);human.speak();图5.6程序运行结果245.2.3注入的两种方式2.构造注入构造注入例如,只要对前面的Ch

27、inese类进行简单的修改:publicclassChineseimplementsHumanprivateLanguagelan;publicChinese();/构造注入所需要的带参数的构造函数构造注入所需要的带参数的构造函数publicChinese(Languagelan)this.lan=lan;publicvoidspeak()System.out.println(lan.kind();255.2.3注入的两种方式配置文件也需要做简单的修改:26第5章Spring应用5.1Spring5.1Spring概述概述概述概述5.2Spring5.2Spring核心机制核心机制核心机制核心

28、机制依赖注入依赖注入依赖注入依赖注入5.3Spring5.3Spring核心接口及基本配置核心接口及基本配置核心接口及基本配置核心接口及基本配置5.4SpringAOP5.4SpringAOP5.5Spring5.5Spring事务支持事务支持事务支持事务支持5.6Spring5.6Spring与与与与Struts2Struts2整合应用整合应用整合应用整合应用5.7Spring5.7Spring与与与与HibernateHibernate整合应用整合应用整合应用整合应用275.3Spring核心接口及基本配置5.3.1Spring核心接口核心接口1BeanFactory在Spring中有几种

29、BeanFactory的实现,其中最常使用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根据XML文件中的定义装载Bean。要创建XmlBeanFactory,需要传递一个java.io.InputStream对象给构造函数。InputStream对象提供XML文件给工厂。例如,下面的代码片段使用一个java.io.FileInputStream对象把BeanXML定义文件给XmlBeanFactory:这行简单的代码告诉BeanFactory从XML文件中读取Bean的定义信息,但是现在BeanFactory没有实例化Bean,

30、Bean被延迟载入到BeanFactory中,就是说BeanFactory会立即把Bean定义信息载入进来,但是Bean只有在需要的时候才被实例化。为了从BeanFactory得到Bean,只要简单地调用getBean()方法,把需要的Bean的名字当做参数传递进去就行了。由于得到的是Object类型,所以要进行强制类型转化。BeanFactoryfactory=newXmlBeanFactory(newFileInputStream(applicationContext.xml);MyBeanmyBean=(MyBean)factory.getBean(“myBean”);285.3.1Sp

31、ring核心接口2.ApplicationContext2.ApplicationContext两者都是载入两者都是载入BeanBean定义信息,装配定义信息,装配BeanBean,根据需要分,根据需要分发发BeanBean。但是。但是ApplicationContextApplicationContext提供了更多功能:提供了更多功能:应用上下文提供了文本信息解析工具,包括对国际化的支持。应用上下文提供了文本信息解析工具,包括对国际化的支持。应用上下文提供了载入文本资源的通用方法,如载入图片。应用上下文提供了载入文本资源的通用方法,如载入图片。应用上下文可以向注册为监听器的应用上下文可以向注

32、册为监听器的BeanBean发送事件。发送事件。由于它提供的附加功能,几乎所有的应用系统都选择由于它提供的附加功能,几乎所有的应用系统都选择ApplicationContextApplicationContext,而不是,而不是BeanFactoryBeanFactory。在在ApplicationContextApplicationContext的诸多实现中,有三个常用的实现:的诸多实现中,有三个常用的实现:ClassPathXmlApplicationContextClassPathXmlApplicationContext:从类路径中的:从类路径中的XMLXML文件载文件载入上下文定义信

33、息,把上下文定义文件当成类路径资源。入上下文定义信息,把上下文定义文件当成类路径资源。FileSystemXmlApplicationContextFileSystemXmlApplicationContext:从文件系统中的:从文件系统中的XMLXML文件文件载入上下文定义信息。载入上下文定义信息。XmlWebApplicationContextXmlWebApplicationContext:从:从WebWeb系统中的系统中的XMLXML文件载入上文件载入上下文定义信息。下文定义信息。295.3.1Spring核心接口例如:FileSystemXmlApplicationContext和C

34、lassPathXmlApplicationContext的区别是:FileSystemXmlApplicationContext只能在指定的路径中寻找foo.xml文件,而ClassPathXmlApplicationContext可以在整个类路径中寻找foo.xml。ApplicationContextcontext=newFileSystemXmlApplicationContext(c:/foo.xml);ApplicationContextcontext=newClassPathApplicationContext(foo.xml);ApplicationContextcontext

35、=WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext();305.3.2Spring基本配置1使用使用XML装配装配理论上,Bean装配可以从任何配置资源获得。但实际上,XML是最常见的Spring应用系统配置源。如下的XML文件展示了一个简单的Spring上下文定义文件:在XML文件定义Bean,上下文定义文件的根元素。有多个子元素。每个元素定义了一个Bean(任何一个Java对象)如何被装配到Spring容器中。/根元素根元素/Bean实例实例/Bean实例实例

36、315.3.2Spring基本配置2 2添加一个添加一个BeanBean向向SpringSpring容器中添加一个容器中添加一个BeanBean只需要向只需要向XMLXML文件中添加一个文件中添加一个元元素。如下面的语句:素。如下面的语句:当通过当通过SpringSpring容器创建一个容器创建一个BeanBean实例时,不仅可以完成实例时,不仅可以完成BeanBean实例的实实例的实例化,还可以为例化,还可以为BeanBean指定特定的作用域。指定特定的作用域。原型模式与单实例模式:原型模式与单实例模式:SpringSpring中的中的BeanBean默认情况下是单实例模式。默认情况下是单实

37、例模式。在容器分配在容器分配BeanBean的时候,它总是返回同一个实例。的时候,它总是返回同一个实例。的的singletonsingleton属性告诉属性告诉ApplicationContextApplicationContext这个这个BeanBean是不是单实例是不是单实例BeanBean,默认是,默认是truetrue,但是把它设置为,但是把它设置为falsefalse的话,就把这个的话,就把这个BeanBean定义成了原型定义成了原型BeanBean。/原型模式原型模式BeanBean requestrequest或或sessionsession:对于每次:对于每次HTTPHTTP请

38、求或请求或HttpSessionHttpSession,使用,使用requestrequest或或sessionsession定义的定义的BeanBean都将产生一个新实例,即每次都将产生一个新实例,即每次HTTPHTTP请求或请求或HttpSessionHttpSession将会产生不同的将会产生不同的BeanBean实例。实例。globalsessionglobalsession:每个全局的:每个全局的HttpSessionHttpSession对应一个对应一个BeanBean实例。典型情实例。典型情况下,仅在使用况下,仅在使用portletcontextportletcontext的时候

39、有效。的时候有效。当一个当一个BeanBean实例化的时候,有时需要做一些初始化的工作,然后才能使用。实例化的时候,有时需要做一些初始化的工作,然后才能使用。因此,因此,SpringSpring可以在创建和拆卸可以在创建和拆卸BeanBean的时候调用的时候调用BeanBean的两个生命周期方法。的两个生命周期方法。325.3.2Spring基本配置在Bean的定义中设置自己的init-method,这个方法在Bean被实例化时马上被调用。同样,也可以设置自己的destroy-method,这个方法在Bean从容器中删除之前调用。一个典型的例子是连接池Bean。Bean的定义如下:/当当Bea

40、n从容器中删除时调用从容器中删除时调用close方法方法publicclassMyConnectionPoolpublicvoidinitalize()/initializeconnectionpoolpublicvoidclose()/releaseconnection33JavaEE应用技术基础应用技术基础济南大学信息学院济南大学信息学院济南大学信息学院济南大学信息学院 刘鹍刘鹍刘鹍刘鹍34回顾依赖注入依赖注入依赖注入依赖注入 工厂模式工厂模式工厂模式工厂模式 依赖注入的两种方式依赖注入的两种方式依赖注入的两种方式依赖注入的两种方式SpringSpring主要接口主要接口主要接口主要接口

41、BeanFactoryBeanFactory、ApplicationContextApplicationContextSpringSpring配置文件配置文件配置文件配置文件 XMLXML配置文件配置文件配置文件配置文件35第5章Spring应用5.1Spring5.1Spring概述概述概述概述5.2Spring5.2Spring核心机制核心机制核心机制核心机制依赖注入依赖注入依赖注入依赖注入5.3Spring5.3Spring核心接口及基本配置核心接口及基本配置核心接口及基本配置核心接口及基本配置5.4SpringAOP5.4SpringAOP5.5Spring5.5Spring事务支持事

42、务支持事务支持事务支持5.6Spring5.6Spring与与与与Struts2Struts2整合应用整合应用整合应用整合应用5.7Spring5.7Spring与与与与HibernateHibernate整合应用整合应用整合应用整合应用365.4SpringAOP5.4.1从代理机制初探从代理机制初探AOP来看一个简单的例子,当需要在执行某些方法时留下日志信息,可能会这样写:在HelloSpeaker类中,当执行hello()方法时,程序员希望该方法执行开始与执行完毕时都留下日志。最简单的做法是用上面的程序设计,在方法执行的前后加上日志动作。importjava.util.logging.*

43、;publicclassHelloSpeakerpirvateLoggerlogger=Logger.getLogger(this.getClass().getName();publicvoidhello(Stringname)logger.log(Level.INFO,hellomethodstarts);/方法开始执行时留下日志方法开始执行时留下日志Sytem.out.println(hello,+name);/程序的主要功能程序的主要功能 Logger.log(Level.INFO,hellomethodends);/方法执行完毕时留下日志方法执行完毕时留下日志375.4.1从代理机制初

44、探AOP可以使用代理(Proxy)机制来解决这个问题,有两种代理方式:静态代理(staticproxy)和动态代理(dynamicproxy)。在静态代理的实现中,代理类与被代理的类必须实现同一个接口。在代理类中可以实现记录等相关服务,并在需要的时候再呼叫被代理类。这样被代理类就可以仅仅保留业务相关的职责了。举个简单的例子,首先定义一个IHello接口,IHello.java代码如下:然后让实现业务逻辑的HelloSpeaker类实现IHello接口,HelloSpeaker.java代码如下:publicclassHelloSpeakerimplementsIHellopublicvoidh

45、ello(Stringname)System.out.println(hello,+name);publicinterfaceIHellopublicvoidhello(Stringname);385.4.1从代理机制初探AOP可以看到,在HelloSpeaker类中没有任何日志的代码插入其中,日志服务的实现将被放到代理类中,代理类同样要实现IHello接口。HelloProxy.java代码如下:publicclassHelloProxyimplementsIHelloprivateLoggerlogger=Logger.getLogger(this.getClass().getName()

46、;privateIHellohelloObject;publicHelloProxy(IHellohelloObject)this.helloObject=helloObject;publicvoidhello(Stringname)log(hellomethodstarts);/日志服务日志服务helloObject.hello(name);/执行业务逻辑执行业务逻辑log(hellomethodends);/日志服务日志服务privatevoidlog(Stringms)logger.log(Level.INFO,msg);395.4.1从代理机制初探AOP在HelloProxy类的hel

47、lo()方法中,真正实现业务逻辑前后安排记录服务,可以实际撰写一个测试程序来看看如何使用代理类。程序运行结果:hello,JustinpublicclassProxyDemopublicstaticvoidmain(Stringargs)IHelloproxy=newHelloProxy(newHelloSpeaker();proxy.hello(Justin);405.4.2动态代理要实现动态代理,同样需要定义所要代理的接口。IHello.java代码如下:然后让实现业务逻辑的HelloSpeaker类实现IHello接口。HelloSpeaker.java代码如下:publicclassH

48、elloSpeakerimplementsIHellopublicvoidhello(Stringname)System.out.println(Hello,+name);publicinterfaceIHellopublicvoidhello(Stringname);415.4.2动态代理与上例不同的是,这里要实现不同的代理类:importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;publicclassLogHandlerimplementsInvocationHandlerprivateObject

49、sub;publicLogHandler()publicLogHandler(Objectobj)sub=obj;publicObjectinvoke(Objectproxy,Methodmethod,Objectargs)throwsThrowableSystem.out.println(beforeyoudothing);method.invoke(sub,args);System.out.println(afteryoudothing);returnnull;425.4.2动态代理写一个测试程序,使用LogHandler来绑定被代理类。ProxyDemo.java代码如下:程序运行结果:

50、beforeyoudothingHello,Justinafteryoudothingimportjava.lang.reflect.Proxy;publicclassProxyDemopublicstaticvoidmain(Stringargs)HelloSpeakerhelloSpeaker=newHelloSpeaker();LogHandlerlogHandler=newLogHandler(helloSpeaker);Classcls=helloSpeaker.getClass();IHelloiHello=(IHello)Proxy.newProxyInstance(cls.ge

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁