《Spring入门教学课件汇总完整版电子教案全书整套课件幻灯片(最新).pptx》由会员分享,可在线阅读,更多相关《Spring入门教学课件汇总完整版电子教案全书整套课件幻灯片(最新).pptx(241页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Spring入门企业级开发、课程目标了解框架的概念了解SSM框架概念了解Spring框架的用途理解Spring的IoC理解Spring的DI课程任务讲解框架的含义讲解Spring框架的用途配置Spring框架讲解Spring的IoC讲解Spring的DI目录CONTENTSIoC1Web概述2框架概述3Spring的配置45DI01Web概述Web概述Web是互联网的总称,全称为WorldWideWeb,缩写WWW,即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。简单地说,Web是一种体系结构,通过它可以访问遍布于因特网主机上的链接
2、文档。简单来说,Web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。Web资源分类静态Web资源指Web页面中供人们浏览的数据始终是不变。如Html、CSS、javaScript动态Web资源指Web页面中供人们浏览的数据是由程序产生的,不同时间点访问Web页面看到的内容各不相同。如JSP/Servlet、ASP、PHPServlet容器Java中的动态资源开发技术为Servlet/JSP,sun公司定义了Servlet/JSP的技术规范,遵循这样规范就可以写出对应的Servlet、JSP程序,但是Servlet、JSP本身不能直接运行,需要运行他们的环境,于是有不同的厂
3、商分别按照Servlet/JSP规范的要求开发了对应的运行环境,这样的能够运行Servlet/JSP的环境就叫做Servlet容器。Web容器Web资源按照一定的规则整合起来组成能够被Web访问的应用程序就叫做Web应用,Web应用运行也需要一定的环境。能够运行Web应用的环境叫做Web容器。Web容器的概念通常要大于Servlet容器,Servlet容器通常都是Web容器,但是Web容器不一定是Servlet容器,因为运行ASP、PHP的服务器是Web容器,但是不能运行Servlet所以不能叫Servlet容器。Web服务器Web容器/Servlet容器具体来说就是Web服务器,学习Web开
4、发,需要先安装一台Web服务器,然后再在Web服务器中开发相应的Web资源,供用户使用浏览器访问。注意:这里所说的服务器不是指服务器硬件资源,而是指服务器软件。常见的Web服务器WebLogicWebLogic是BEA公司的产品,是目前应用最广泛的Web服务器,支持J2EE规范。WebSphereWebSphere是IBM公司的产品,支持J2EE规范。Tomcat在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Tomcat,该服务器支持全部JSP以及Servlet规范虽然是免费开源的服务器,并且不能完全支持J2EE规范,但是它免费、轻量等特性让它仍然十分受到欢迎。Ser
5、vlet概述Servlet(ServletApplet),全称JavaServlet,是用Java编写的服务器端程序。而这些Servlet都要实现Servlet接口。其主要功能在于交互式的浏览和修改数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。JavaWeb分层概述在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。这也是JavaWeb中重要的三层架构中的三个层次。区分层次的目的即为了“高内聚低耦合”的思想。所谓三层体系结构,是在客户端与数据库之间加入了一
6、个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即把这三个层放置到一台机器上。JavaWeb经典三层架构Web:表示层,主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。Service层:业务逻辑层,相对具体的业务逻辑服务层。DAO层:数据访问层,与底层MySQL、Oracle、Hbase等进行数据交互。02框架概述框架概述框架(Framework)是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分
7、割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节。简单来说,所谓的框架其实就是程序的架子,在这个程序的架子中,搭建起程序的基本的骨架,针对程序的通用问题给出了便捷的解决方案,可以使开发人员基于框架快速开发具体的应用程序。Java常用框架概述SSHStructs2:Struts2是一个基于MVC设计模式的Web应用框架Spring:Spring是一个Service层的框架Hibernate:Hibernate是DAO层的框架SSMSpring:Spring是一个Service层的框架SpringMVC:Spri
8、ngMVC是一个基于MVC设计模式的Web应用框架MyBatis:MyBatis是DAO层的框架Spring框架概述Spring框架是一个开放源代码的J2EE应用程序框架,由RodJohnson发起,是针对bean的生命周期进行管理的轻量级容器。Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IoC、AOP及WebMVC等功能。Spring框架主要由七部分组成,分别是SpringCore、SpringAOP、SpringORM、SpringDAO、SpringContext、SpringWeb和SpringWebMVC。IoC:控制反转DI:依赖注入AOP:面向切面
9、编程03Spring的配置导入Spring的IoC相关jar包导入Spring的IoC相关jar包创建Spring的配置文件Spring采用xml文件作为配置文件,xml文件名字任意,但通常都取名为applicationContext.xml,通常将该文件放置在类加载的目录里下(src目录),方便后续使用。配置Spring的约束Spring本身是基于xml配置来工作的,在使用Spring的过程中不可避免的要编写大量xml配置。Spring官方提供了这些xml文件的编写规范,这是通过提供xml的约束文件来实现的。所谓的xml的约束其实是一种限定xml文件写法的技术,主要分为两种:DTD,通常文件
10、的后缀.dtdSchema,通常文件的后缀为.xsdSpring提供了Schema格式的约束,来限定Spring配置文件的写法。将Spring的约束文件交给MyEclipse管理将Spring的压缩包解压一份放置到到一个固定目录中,要注意的是路径中不可以有中文或空格。打开MyEclipse的/window/preferences,配置其中的XMLCatalog点击Add按钮,在新弹出的选项卡中选择刚解压的Spring目录下schema目录中想要导入的.xsd文件,并且设定好名称空间,通常就是在自动识别的名称空间之后加上/文件名,点击确定就可以使MyEclipse管理该约束文件了通过xml约束文
11、件生成符合约束格式的xml新建xml文件,选择BasicTemplates方式为当前xml起名称:applicationContext.xml选择通过schema文件创建一个xml选择之前导入的schema文件指定根标签,及标签前缀,通常可以将前缀置为空,方便后续使用快速生成xml模板在MyEclipse的window/preferences中配置新模版设定模版使用模板04IoCIoC概述IoC称之为控制反转,简单来说就是将对象的创建及对象的生命周期管理的过程交由Spring框架来处理,从此在开发过程中不再需要关注这些细节,而是在需要时由Spring框架提供处理,这样的机制称之为控制反转。案例
12、名称:IoC入门案例需求描述:通过Spring容器获取对象并使用使用技能:Spring的IoC演示案例:演示案例:IoCIoC入门案例入门案例现场编程课程案例IoC的实现原理在初始化一个Spring容器时,Spring会去解析指定的xml文件,当解析到其中的标签时,会根据该标签中的class属性指定的类的全路径名,通过反射创建该类的对象,并将该对象存入内置的Map中管理。其中键就是该标签的id值,值就是该对象。当通过getBean方法来从容器中获取对象时,其实就是根据传入的条件在内置的Map中寻找是否有匹配的键值,如果有则将该键值对中保存的对象返回,如果没有匹配到则抛出异常。IoC注意事项默认
13、情况下,多次获取同一个id的bean,得到的将是同一个对象。即使是同一个类,如果配置过多个标签具有不同的id,每个id都会在内置Map中有一个键值对,其中的值是这个类创建的不同的对象同一个标签下不允许配置多个同id的标签,如果配置则启动抛异常IoC获取对象的方式通过context.getBeans()方法获取bean时,可以通过如下两种方式获取:传入id值传入class类型通过class方式获取bean时,如果同一个类配置过多个bean,则在获取时因为无法确定到底要获取哪个bean会抛出异常。而id是唯一的,不存在这样的问题,所以建议大家尽量使用id获取bean。别名标签在Spring中提供了
14、别名标签可以为配置的起一个别名,要注意的是这仅仅是对指定的起的一个额外的名字,并不会额外的创建对象存入map。Spring创建对象的方式通过类的无参构造方法创建对象通过静态工厂创建对象实例工厂创建对象Spring工厂创建对象通过类的无参构造方法创建对象在入门案例中使用的就是这种方式。当用最普通方式配置一个时,默认就是采用类的无参构造创建对象。在Spring容器初始化时,通过上配置的class属性反射得到字节码对象,通过newInstance()创建对象。这种方式下Spring创建对象,要求类必须有无参的构造,否则无法通过反射创建对象,会抛出异常。通过静态工厂创建对象很多的时候,我们面对的类是无
15、法通过无参构造去创建的,例如该类没有无参构造、是一抽象类等等情况,此时无法要求Spring通过无参构造创建对象,此时可以使用静态工厂方式创建对象。通过实例工厂创建对象实例工厂也可以解决类无法通过无参构造创建的问题,解决的思路和静态工厂类似,只不过实例工厂提供的方法不是静态的。Spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。通过Spring工厂创建对象Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。Spring单例模式Spring容器管理的bean在默认情况下是单例的
16、,也即,一个bean只会创建一个对象,存在内置map中,之后无论获取多少次该bean,都返回同一个对象。Spring默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。但是在实际开发中是存在多例的需求的,Spring也提供了选项可以将bean设置为多例模式。Spring懒加载机制Spring懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义。配置初始化和销毁方法在Spring中如果某个bean在初始化之后或销毁之前要做一些额外操作可以为该bean
17、配置初始化和销毁的方法,在这些方法中完成功能。方法执行顺序:在Spring创建bean对象时,先创建对象(通过无参构造或工厂),之后立即调用init方法来执行初始化操作,之后此bean就可以哪来调用其它普通方法,而在对象销毁之前,spring容器调用其destory方法来执行销毁操作。05DIDI概述创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过程称之为依赖注入,也即DI。set方法注入通常的javabean属性都会私有化,而对外暴露setXxx()getXxx()方法,此时Spring可以通过setXxx()方法将属性的值注入对象。注意事项:如果没有提供set方法,那么
18、就会报错如果添加了新的类属性,那么需要再提供set、get方法和toString方法自动装配在Spring的set方式实现的注入过程中,支持自动装配机制,所谓自动装配机制,会根据要设置的javabean属性的名字或类型到spring中自动寻找对应id或类型的进行设置,从而省去依次配置的过程,简化了配置。构造方法注入对象属性设置的另一种方式是在对象创建的过程中通过构造方法传入并设置对象的属性。Spring也可以通过这样的构造方法实现属性的注入。课程总结通过Spring第一天的学习,了解了框架的作用和常用的框架,配置了Spring框架,并且通过xml配置,使用了Spring中的IoC和DI技术。对
19、于IoC和DI,我们后面还会通过注解的方式学习。使用IoC和DI可以实现更好的将软件分层。使用合适的框架也可以大大提高开发效率。课程作业课下作业配置Spring框架,并使用IoC和DI创建对象复习反射机制预习作业Java中注解的使用方式Spring中注解实现IoC和DI成 为 一 流 的 双 创 实 践 性 教 学 资 源 服 务 提 供 商!以 双 创 实 践 性 人 才 培 养 为 己 任,助 力 国 家 产 业 转 型 升 级!注解方式使用Spring企业级开发课程回顾及作业点评回顾Web基本概念回顾Java经典三层架构含义回顾Spring框架的配置方式回顾Spring框架的IoC和DI
20、预习检查Java中注解的使用方式Spring中注解实现IoC和DI课程目标理解注解的使用场景熟练的定义和使用注解熟练使用注解方式实现Spring的IoC和DI理解利用Spring中的IoC和DI实现软件分层课程任务讲解Java中的注解使用方式练习注解相关案例讲解Spring中的IoC和DI使用注解的实现方式完成软件分层练习目录CONTENTS12注解注解实现IoC和DI01注解注解概述注解:jdk5.0的特性给程序的提示信息,程序可以根据有无注解及注解上属性的不同配置执行不同的逻辑。java中的注解的格式:AnnoName(key=value,.)注解在开发中,可以作为轻量化配置来使用,比起使
21、用xml作为配置文件,更加的轻便易用,在java开发中大量的使用。jdk内置注解举例Override声明重写父类方法的注解,要求编译器帮我们检查是否成功的覆盖,如果没有成功覆盖父类方法,编译器将会进行报错提示。Deprecated声明方法被过时,不再建议使用,要求编译器在编译的过程中对于这样的方法的调用提出警告,提示方法过时。SuppressWarnings压制警告,提示编译器,在编译的过程中对指定类型的警告不再提示自定义注解注解定义格式:interface注解添加属性注解中的所有的属性必须是public的,可以显式声明,也可以不声明,不声明默认就是public的注解中的属性只能是八种基本数据
22、类型:String类型、Class类型、枚举类型、其他注解类型及以上类型的一维数组注解中声明的属性需要在使用注解时为其赋值。赋值的方式是使用注解时,在注解后跟一对小括号。在其中通过”属性名=属性值“的方式指定属性的值在声明注解时,在注解的属性后通过default关键字声明属性的默认值如果属性是一维数组类型,而在传入的数组中只有一个值,则包括数组的大括号可以省略如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时“value=”可以省略元注解所谓的元注解是用来修饰注解声明的注解,可以控制被修饰的注解的特性Target用来声明被修饰的注解可以用在什么位置Retention用
23、来声明被修饰的注解会被保留的阶段Documented用来声明被修饰注解是否要被文档提取工具提取到文档中Inherited用来声明被修饰的注解是否具有继承性反射注解RetentionPolicy.RUNTIME级别的注解会保留到运行期间,可以通过反射技术获取,从而可以根据是否有注解或注解属性值的不同控制程序按照不同方式运行类Class、类Method、类Field、类Constructor、类Package都提供了以下方法boolean isAnnotationPresentisAnnotationPresent(ClassannotationClass)如果指定类型的注解存在于此元素上,则返回
24、 true,否则返回 false。AgetAnnotationgetAnnotation(ClassannotationClass)如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。Annotation getAnnotationsgetAnnotations()返回此元素上存在的所有注解。课堂案例案例名称:使用反射注解控制程序流程需求描述:定义一个代表警察级别的注解,声明一个警察类,然后根据注解属性的级别,输出不同的内容。使用技能:注解的定义和使用、反射注解现场编程演示案例:使用反射注解控制程序流程演示案例:使用反射注解控制程序流程02注解实现IoC和DI概述Spring除
25、了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用。Spring引入context名称空间在IDE中导入spring-context-3.2.xsd约束文件。在applicationContext.xml文件中,引入该schema文件Spring注解方式实现IoC开启包扫描只有在指定的扫描包下的类上的IoC注解才会生效使用注解注册bean在配置的包中的类上使用Component注解,则这个类会自动被注册为bean,使用当前类的class为的class,通常情况下使用类名首字母小写为id如果类名的第二个字母为大写则首字母
26、保留原样可以通过在Component中配置value属性,明确的指定bean的idSpring注解方式实现DI在配置文件中开启注解实现DI注解方式注入Spring内置支持的类型数据-非集合类型Spring中可以通过Value注解来实现Spring内置支持的类型的属性的注入可以将值配置到一个properties配置文件中,再在Spring中进行引入注解方式注入Spring内置支持的类型数据-集合类型将spring-util-3.2.xsd交给IDE管理,在当前Spring容器的配置文件中导入util名称空间,再通过适当的util标签注册数据,再在类的属性中使用Value注入赋值注解注入自定义类型
27、数据在bean中的属性上通过Autowired实现自定义bean类型的属性注入注意:当Spring容器解析到Component注解时,创建当前类的bean在Spring容器中进行管理,在创建bean的过程中发现了Autowired注解,会根据当前bean属性名称,寻找在Spring中是否存在id等于该名称的bean,如果存在就自动注入。如果不存在,再检查是否存在和当前bean属性类型相同的bean,如果存在就注入进来,如果都不存在则抛出异常也可以使用Qualifier(value=“id)注解,明确的指定,要注入哪个id的bean也可以使用Resource(name=“id)指定注入给定id的
28、bean其它常用注解Scope(value=prototype)/Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)配置修饰的类的bean是单例还是多例,如果不配置默认为单例Lazy配置修饰的类的bean采用懒加载机制PostConstruct修饰方法,将该方法声明为初始化方法,对象创建之后立即执行PreDestroy修饰方法,将该方法声明为销毁的方法,对象销毁之前调用的方法注意:多例时销毁方法不会被调用类的实例注入到Spring容器ControllerServiceRepositoryComponent这四个注解的功能是完全相同的,都是用来修饰类,将
29、类的实例注入到Spring容器Component一般认为是通用的注解Controller用在软件分层中的表示层Service用在软件分层中的业务逻辑层Repository用在软件分层中的数据访问层课堂案例案例名称:Java经典三层架构练习需求描述:使用软件分层思想编写一个具有三层架构的程序,完成注册用户的功能(如果已经有对应用户名的用户,那么注册失败),DAO层的方法体用控制台输出打印表示即可。使用技能:Java分层思想、面向对象思想现场编程演示案例:演示案例:JavaJava经典三层架构练习经典三层架构练习课程练习使用Spring中IoC和DI对上述案例实现软件分层解耦时间:时间:6060分
30、钟分钟现场练习课程总结通过Spring第二天的学习,学生更进一步的理解Spring框架中IoC和DI的作用以及用法。讲解了注解的使用方式,在今后的学习中注解会大量的使用。对于程序的“低耦合”要求有了更深的理解,并且通过代码的编写,提高了学生的动手能力。课程作业课下作业见附件预习作业代理设计模式Spring中的AOP成 为 一 流 的 双 创 实 践 性 教 学 资 源 服 务 提 供 商!以 双 创 实 践 性 人 才 培 养 为 己 任,助 力 国 家 产 业 转 型 升 级!代理设计模式企业级开发课程回顾及作业点评回顾注解的使用方式回顾Spring中IoC和DI使用注解的实现方式回顾IoC
31、和DI如何优化分层结构预习检查检查代理设计模式课程目标理解静态代理模式理解动态代理模式能够使用代理模式修改案例课程任务讲解静态代理模式讲解动态代理模式使用代理模式修改案例目录CONTENTS12静态代理模式动态代理模式01静态代理模式代理设计模式概述代理设计模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理设计模式分为静态代理和动态代理。代理设计模式优点职责清晰真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰
32、。代理对象可以在客户端和目标对象之间起到中介的作用,这样可以保护目标对象。高扩展性案例分析在昨天的“Java经典三层架构练习”案例中,如果要检查权限、记录日志和开启事务,常规手段会造成代码大量的重复,而且逻辑混乱。我们希望在service层中只有业务逻辑相关代码,但是还要有检查权限、记录日志和开启事务等功能。所以我们的需求是在原有类的基础上增强类的功能。可以尝试使用继承和装饰设计模式。装饰设计模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。静态代理模式构成静态代理模式由三个部分构成:一个公共的接口一个代理角色一个被
33、代理角色课堂案例案例名称:静态代理模式案例1需求描述:定义一个动物接口,包含吃、叫两个方法,狗实现动物接口,再定义一个代理狗实现动物接口,增强吃、叫两个方法使用技能:接口的定义和使用、静态代理模式现场编程演示案例:静态代理模式案例演示案例:静态代理模式案例11课堂案例案例名称:静态代理模式案例2需求描述:定义一个才艺接口,包含唱歌、跳舞两个方法,明星实现才艺接口,再定义一个经纪人实现才艺接口,增强唱歌、跳舞两个方法使用技能:接口的定义和使用、静态代理模式现场编程演示案例:静态代理模式案例演示案例:静态代理模式案例22课程练习使用静态代理模式对昨日的“Java经典三层架构练习”案例进行优化时间:
34、时间:4545分钟分钟现场练习案例分析在上述案例中,可以看到service层确实简化了,但是代理中还是有大量重复代码。如果再又添加删除用户等功能,那么代理中依然要写很多重复代码。静态代理模式的特点优点:结构清晰易于理解缺点:如果被代理者有多个方法,则代理者也需要开发多个方法,其中往往存在大量重复代码,仍然存在代码重复。静态代理设计模式解决了软件分层过程中额外的功能代码侵入模块的问题,将额外的功能代码提取到了代理者中进行,但是静态代理实现的代理者中存在大量重复的代码,并没有解决代码重复问题。02动态代理模式动态代理-jdk内置的动态代理在jdk中提供了动态代理实现的工具类,直接使用该工具类就可以
35、创建出代理者,并且可以通过内置的回调函数指定代理在工作时的执行逻辑,从而实现基于jdk原生API的动态代理机制。Proxy常用方法:staticObjectnewProxyInstance(ClassLoaderloader,Classinterfaces,InvocationHandlerh):返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。课堂案例案例名称:动态代理模式案例1需求描述:定义一个动物接口,包含吃、叫两个方法,狗实现动物接口,再通过jdk内置动态代理生成代理者,通过代理者调用方法,进行方法的增强使用技能:接口的定义和使用、动态代理模式现场编程演示案例
36、:动态代理模式案例演示案例:动态代理模式案例11课堂案例案例名称:动态代理模式案例2需求描述:定义一个才艺接口,包含唱歌、跳舞两个方法,明星实现才艺接口,再通过jdk内置动态代理生成代理者,通过代理者调用方法,进行方法的增强使用技能:接口的定义和使用、动态代理模式现场编程演示案例:动态代理模式案例演示案例:动态代理模式案例22课程练习使用jdk内置的动态代理模式对昨日的“Java经典三层架构练习”案例进行优化时间:时间:4545分钟分钟现场练习jdk内置的动态代理的特点优点:不需要像静态代理一样被代理方法都要实现一遍,而只需要在回调函数中进行处理就可以了,重复代码只需编写一次。缺点:java的
37、动态代理是通过代理者实现和被代理者相同的接口来保证两者具有相同的方法的,如果被代理者想要被代理的方法不属于任何接口,则生成的代理者自然无法具有这个方法,也就无法实现对该方法的代理。所以java的动态代理机制是基于接口进行的,受制于要代理的方法是否有接口的支持。动态代理-cglib实现的动态代理静态代理中代码需要自己实现,并且会有重复代码jdk内置的动态代理是基于接口实现的,如果方法不属于接口,则不能使用内置的动态代理cglib提供的动态代理通过继承父类来实现动态代理cglib是第三方提供的动态代理的实现工具,不管有没有接口都可以实现动态代理cglib实现动态代理的原理是生成的动态代理是被代理者
38、的子类,所以代理者具有和父类即被代理者相同的方法,从而实现代理课堂案例案例名称:cglib的动态代理案例1需求描述:定义一个动物接口,包含吃、叫两个方法,狗实现动物接口,再通过cglib的动态代理生成代理者,通过代理者调用方法,进行方法的增强使用技能:接口的定义和使用、动态代理模式现场编程演示案例:动态代理模式案例演示案例:动态代理模式案例11课堂案例案例名称:cglib的动态代理案例2需求描述:定义一个才艺接口,包含唱歌、跳舞两个方法,明星实现才艺接口,再通过cglib的动态代理生成代理者,通过代理者调用方法,进行方法的增强使用技能:接口的定义和使用、cglib动态代理模式现场编程演示案例:
39、动态代理模式案例演示案例:动态代理模式案例22课程练习使用cglib动态代理模式对昨日的“Java经典三层架构练习”案例进行优化时间:时间:4545分钟分钟现场练习cglib动态代理的特点优点:无论是否有接口都可以实现动态代理,使用场景基本不受限缺点:第三方提供的动态代理机制,不是原生的,需要导入第三方开发包才可以使用。课程总结通过Spring第三天的学习,学生学习了代理设计模式。代理设计模式分为静态代理和动态代理。静态代理的代码需要自己实现,并且会有重复代码。动态代理又分为jdk内置的动态代理和cglib的动态代理。jdk内置的动态代理是基于接口实现的,如果方法不属于接口,则不能使用内置的动
40、态代理。CGLIB是第三方提供的动态代理的实现工具,不管有没有接口都可以实现动态代理。课程作业课下作业见附件预习作业Spring中的AOP成 为 一 流 的 双 创 实 践 性 教 学 资 源 服 务 提 供 商!以 双 创 实 践 性 人 才 培 养 为 己 任,助 力 国 家 产 业 转 型 升 级!面向切面企业级开发课程回顾及作业点评回顾代理设计模式回顾静态代理模式回顾动态代理模式预习检查检查Spring中的AOP课程目标理解面向切面编程的含义理解Spring中AOP的基本概念理解AOP中的5种通知类型熟练使用面向切面编程课程任务讲解面向切面编程讲解Spring中AOP的基本概念讲解AO
41、P中的通知讲解AOP相关案例目录CONTENTS1AOP01AOPAOP概述在昨天的案例中,我们需要不停的写代理,而且代理的格式固定,那么当类多时依然会有大量的重复劳动。AOP即面向切面编程,可以在层与层之间增加一个可编程的切面,用来将功能型代码提取到切面中统一处理,有助于实现高内聚的特性。Spring AOP中的基本概念连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在SpringAOP中,一个连接点总是表示一个方法的执行。切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。切面(As
42、pect):一个关注点的模块化,这个关注点可能会横切多个对象。通知(Advice):在切面的某个特定的连接点上执行的动作。目标对象(TargetObject):被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。课堂案例案例名称:Spring的AOP入门案例需求描述:定义切面、通知、连接点、切入点实现方法的拦截。使用技能:SpringAOP基本概念应用、Spring中的IoC和DI现场编程演示案例:演示案例:SpringSpring的的AOPAOP入门案例入门案例切入点表达式within表达式通过类名进行匹配,粗粒度的切入点表达式格式:within(包名.类名)对应的类中的所
43、有连接点都会被表达式识别,成为切入点在within表达式中可以使用*号匹配符,匹配指定包下所有的类注意,只匹配当前包,不包括当前包的子孙包在within表达式中也可以用.*号匹配符,匹配指定包下及其子孙包下的所有的类切入点表达式execution表达式细粒度的切入点表达式,可以以方法为单位定义切入点规则格式:execution(返回值类型包名.类名.方法名(参数类型,参数类型)五大通知类型之前置通知前置通知在目标方法执行之前执行的通知前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象和目标方法相关的信息
44、。注意,如果接收JoinPoint,必须保证其为方法的第一个参数,否则报错。五大通知类型之环绕通知环绕通知在目标方法执行之前和之后都可以执行额外代码的通知。在环绕通知中必须显式的调用目标方法,否则目标方法不会执行。这个显式调用时通过ProceedingJoinPoint来实现的,可以在环绕通知中接收一个此类型的形参,Spring容器会自动将该对象传入,这个参数必须处在环绕通知的第一个形参位置。环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。环绕通知有控制目标方法是否执行、目标方法执行之前或之后执行额外代码、有控制是否返回值、甚至改变返回值的能力。环绕通知虽然有这样的
45、能力,但一定要慎用,要小心不要破坏了软件分层的“高内聚低耦合”的目标。五大通知类型之后置通知后置通知在目标方法执行之后执行的通知。在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一个。在后置通知中,还可以通过配置获取返回值。注意:一定要保证JoinPoint处在参数列表的第一位,否则抛异常。五大通知类型之异常通知异常通知在目标方法抛出异常时执行的通知。可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位。可以配置参数,让异常通知可以接收到目标方法抛出的异常对象。五大通知类型之最终通知最终通知是在目标方
46、法执行之后执行的通知。和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返回(例如抛出异常),则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。另外,后置通知可以通过配置得到返回值,而最终通知无法得到。最终通知也可以额外接收一个JoinPoint参数,来获取目标对象和目标方法相关信息,但一定要保证必须是第一个参数。五大通知执行顺序如果只有一个切面,那么执行顺序取决于配置顺序以及是否抛出异常如果存在多个切面,采用了责任链设计模式SpringAOP的原理Spring会在用户获取对象时,生成目标对象的代理对象,之后根据切入点
47、规则,匹配用户连接点,得到切入点,当切入点被调用时,不会直接去找目标对象,而是通过代理对象拦截之后交由切面类中的指定的通知执行来进行增强。Spring自动为目标对象生成代理对象,默认情况下,如果目标对象实现过接口,则采用java的动态代理机制,如果目标对象没有实现过接口,则采用cglib动态代理。开发者可以可以在Spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。注解方式使用AOPSpring也支持注解方式实现AOP,相对于配置文件方式,注解配置更加的轻量级,配置、修改更加方便,是目前最流行的方式。Aspect:将指定的类标志为一个切面Before:前置通知A
48、round:环绕通知AfterReturning:后置通知AfterThrowing:异常通知After:最终通知现场编程演示案例:注解方式使用演示案例:注解方式使用AOPAOP课程练习异常信息收集:在业务方法执行时,如果有异常抛出,则根据异常信息记录日志。时间:时间:3030分钟分钟现场练习课程练习统计所有业务方法执行时的时间时间:时间:3030分钟分钟现场练习课程练习通过AOP来实现权限控制,通过自定义注解声明业务方法是否需要权限控制,通过权限注解上的属性声明需要什么样的权限。举例:定义权限为游客、用户和管理员,规定游客只可以注册用户,用户可以查询和修改用户和注册,管理员额外可以删除用户。
49、时间:时间:8080分钟分钟现场练习ThreadLocal类ThreadLocal可以从程序上游向下游传递数据可以解决并发安全问题现场编程演示案例:演示案例:ThreadLocalThreadLocal类类课程总结通过Spring第四天的学习,学生学习了Spring中如何应用AOP技术。可以使用XML配置方式使用AOP,也可以选择注解方式使用。面向切面编程是非常重要的思想,一定要深刻理解它的好处。AOP的实现基于代理设计模式,通过课堂的练习增强对于昨日代理模式以及AOP应用的动手能力。课程作业课下作业见附件预习作业Spring中整合JDBC成 为 一 流 的 双 创 实 践 性 教 学 资 源
50、 服 务 提 供 商!以 双 创 实 践 性 人 才 培 养 为 己 任,助 力 国 家 产 业 转 型 升 级!Spring整合JDBC企业级开发课程回顾及作业点评回顾Spring中AOP的含义回顾AOP相关案例预习检查检查Spring中整合JDBC的方式课程目标巩固面向切面编程熟练使用Spring整合JDBC方式课程任务练习AOP相关案例讲解JDBC使用方式讲解Spring整合JDBC的方式目录CONTENTS12AOP案例Spring整合JDBC01AOP案例课程练习通过AOP来实现事务控制,通过自定义注解声明业务方法是否需要事务控制。时间:时间:8080分钟分钟现场练习02Spring