Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版) 教案 教学设计 第8-14章 Spring AOP-百货中心供应链管理系统_第1页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版) 教案 教学设计 第8-14章 Spring AOP-百货中心供应链管理系统_第2页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版) 教案 教学设计 第8-14章 Spring AOP-百货中心供应链管理系统_第3页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版) 教案 教学设计 第8-14章 Spring AOP-百货中心供应链管理系统_第4页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版) 教案 教学设计 第8-14章 Spring AOP-百货中心供应链管理系统_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaEE轻量级框架应用实战

——SSM框架

(SpringMVC+Spring+MyBatis)

(第2版)

1

口第8章SpringAOP

学习单元第8章SpringAOP课时6课时

©了解AOP的概念和作用

。理解AOP术语

学习目标@熟悉Spring中两种动态代理方式的区别

@掌握基于代理类的AOP实现

。掌握基于XML的声明式AspectJ和基于注解的声明式AspectJ

知识点了解熟悉掌握重点难点

SpringAOP概述

SpringAOP术语7

学习内容JDK动态代理qq

CGLib动态代理7

基于XML的AOP实现qq

基于注解的AOP实现4q

2

第19次课

课题SpringAOP(1)

课时2课时(90min)

知识目标:

(1)了解SpringAOP的概念和常用术语

(2)SpringAOP的实现机制

(3)掌握SpringAOP基『XML和注解的实现方法

教学目标

能力目标:

能使用基于XML和注解的方法实现SpringAOP

素质目标:

通过学习SpringAOP切面的抽取,培养提取有效信息的能力,提高总结归纳的能力

教学重点:SpringAOP的概念,SpringAOP的相关术语,SpringAOP的实现机制,基于

教学重难点XML的AOP实现,基于注解的AOP实现

教学难点:SpringAOP的实现方法

教学方法问答法、讨论法、讲授法

教学用具电脑、投影仪、多媒体课件、教材

教学过程主要教学内容及步骤

【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过超星学习通APP或

其他学习软件,完成课前任务

课前任务

请同学们上网查找AOP、OOP的具体含义及二者的区别。

【学生】完成课前任务

【教师】使用超星学习通APP进行签到

考勤

【学生】班干部报请假人员及原因

【教师】提出以下问题:

问题导入同学们都知道Java是面向对象编程,AOP为面向切面编程,那么什么是切面?

【学生】思考、举手回答

【教师】讲解SpringAOP概念、AOP相关术语,SpringAOP的实现方法

一、SpringAOP概述

十【教师】讲解SpringAOP概念,AOP相关术语:切面、连接点、切入点、通知、目标

对象、代理对象和织人

(一)SpringAOP的概念

在应用程序的业务处理中,通常会进行日志记录、权限验证、事务控制等操作。虽然使用

OOP可以将程序模块化,但要实现某些功能,重复的代码仍然会分散到各个方法中。如果

想要修改某个功能,就必须修改所有的相关方法。这样不仅增加了开发人员的工作量,而

传授新知且会增加代码的出错率。

AOP为此问题提供了解决方案,它采取横向抽取机制,将分散在各个方法中的重复代码抽

取出来,然后将抽取的代码在需要的地方执行,如果将抽取的重复代码看作一个切面,那

么AOP就是使月切面将原有的执行程序在中间切开,加入切面的操作。AOP切面模拟如

图所示。

在图中,将方法中重复的代码横向抽取生成一个或多个切面,然后将切面的功能动态添加

到业务逻辑中,从而实现业务逻辑和系统服务之间的分离。

【课堂问答】

中【教师】随机邀请学生回答以下问题

3

请同学们总结归纳,SpringAOP如何通过切面实现业务逻辑和系统服务之间的分离。

十【学生】聆听、思考、回答

+【教师】总结学生的回答

(二)SpringAOP的术语

1.切面(Aspect)

切面是指类中重复的代码形成的类,通常是指封装的、用于横向切入的功能类,如日志记

录、事务管理等。

2.连接点(Joinpoint)

述接点是指程序执行过程中某个具体的执行点,如调用某个方法或处理异常时。在Spring

AOP中,一个连接点通常是一个方法的执行。

3.切入点(Pointcut)

切入点是指切面与程序流程的交叉点,即需要处理的连接点。当某个连接点满足预先指定

的条件时,AOP就能够定位到这个连接点,然后在连接点处插入切面,该连接点就变成了

切入点。

4.通知(Advice)

通知也称增强处理,是指在切入点要执行的增强处理程序,它是切面的具体实现,如图4-

1中的权限验证、前置日志和后置日志。通知根据执行位置的不同,可分为5种不同的类

型,切面中的方法具体属于哪类通知,需要在配置文件中指定。5种通知分别如下。

(1)前置通知:在切入点前执行的通知,通常应用于权限检查等。

(2)后置通知:在切入点后执行的通知,通常应用于关闭流、上传文件或删除临时文件

等。

(3)环绕通知:在切入点前后执行的通知,通常应用于日志、事务控制等。

(4)返回通知:在切入点正常返回后执行的通知,通常应用于资源释放等。

(5)异常通知:在切入点抛出异常后执行的通知,通常应用于异常处理日志等。

【课堂问答】

中【教师】随机邀请学生回答以下问题

请同学们结合SpringAOP5种不同的通知类型归纳总结,SpringAOP通知的执行顺序。

+【学生】聆听、思考、回答

十【教师】总结学生的回答

在Spring5中,执行通知的默认顺序如下。

(1)当程序执行正常时,执行顺序为,环绕通知前一前置通知一目标方法一返回通知一

后置通知一环绕通知后。

(2)当程序执行异常时,执行顺序为,环绕通知前一前置通知一目标方法一异常通知一

后置通知一异常日志。

5.目标对象(Target)

目标对象是指被一个或多个切面通知的对象,也称通知对象。

6.代理对象(Proxy)

代理对象是指将通知应用到目标对象后,程序动态创建的对象。

7.织入(Wea\“ng)

织入是指将切面代码插入目标对象中,从而生成代理对象的过程。

二、SpringAOP的实现方法

+【教师】介绍SpringAOP的实现机制

SpringAOP实现时会为目标对象生成一个动态代理对象,并在代理对象中实现对R标对象

的增强。根据代理对象的创建方式,SpringAOP的实现机制分为JDK动态代理和CGLib

4

动态代理。

1.JDK动态代理

SpringAOP默认使用JDK动态代埋,它通过java.Iang.reflecl.Proxy类实现,可以调用Proxy

类的newProxyI「stance()方法动态创建代理对象。JDK动态代理实现非侵入式的代码扩展,

可以在不修改源代码的情况下增强某些方法。

2.CGLib动态代理

JDK动态代理只能为接口创建代理对象,当需要为类创建代理对•象时,就需要使用CGLib

动态代理。它不要求目标对象有实现接口,而是通过继承的方式动态创建代理对象。

【课堂问答】

+【教师】随机邀请学生回答以下问题

请同学们思考,在实际开发中,SpringAOP根据什么来选择实现动态代理的方式?

4-【学生】聆听、思考、回答

十【教师】总结学生的回答

在实际开发中,如果使用接口实现目标对象,AOP会使用JDK实现动态代理;如果直接

使用类实现目标对象,则AOP会使用CGLib实现动态代理。

基于上述两种实现机制,SpringAOP的实现方式有两种,即动态代理方式和使用AspcclJ

框架的方式。AspectJ是一个基于Java的AOP框架,它提供了强大的AOP功能。Spring

2.0以后,SpringAOP引入了对AspcciJ的支持,并允许直接使用AspccU进行编程。本节

重点讲解使用AspectJ框架的方式实现SpringAOP的方法。

使用AspectJ实现SpringAOP的方法有两种:基于XML的AOP实现和基于注解的AOP

实现。

【教师】对学生进行分组,4〜6人一组,每组选出一名组长,然后组织学生以小组为单位

讨论以下问题

请同学们根据本次课讲解的基于XML的AOP实现和基于注解的AOP实现,对比分析两

课堂讨论

种方式的实现步骤。

【学生】聆听、思考、小组讨论,由小组代表上台发表讨论结果

【教师】总结学生的回答,并评价各组的表现

【教师】简要总结本节课的要点

本次课介绍了SpringAOP的概念,阐述了SpringAOP的相关术语,包括切面、连接点、

切入点、通知、目标对象、代理对象和织入等。讲解了SpringAOP的实现机制,分为JDK

课堂小结

动态代理和CGLib动态代理。最后讲解了基于XML的AOP实现,基于注解的AOP实

现,并通过实际的例程介绍了详细的实现步骤,包括各部分具体的代码实现,及代码功能。

【学生】总结回顾知识点

【教师】布置课后作业

作业布置请根据本课内容,完成课后习题中的相关习题。

【学生】完成课后任务

教学反思

5

第20次课

课题SpringAOP(2)

课时2课时(90min)

知识目标:

(1)了解SpringAOP的概念和常用术语

(2)SpringAOP的实现机制

(3)掌握SpringAOP基『XML和注解的实现方法

教学目标

能力目标:

能使用基于XML和注解的方法实现SpringAOP

素质目标:

通过学习SpringAOP切面的抽取,培养提取有效信息的能力,提高总结归纳的能力

教学重点:SpringAOP的概念,SpringAOP的相关术语,SpringAOP的实现机制,基于

教学重难点XML的AOP实现,基于注解的AOP实现

教学难点:SpringAOP的实现方法

教学方法问答法、讨论法、讲授法

教学用具电脑、投影仪、多媒体课件、教材

教学过程主要教学内容及步骤

【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过超星学习通APP或

其他学习软件,完成课前任务

课前任务

请同学们上网查找AOP、OOP的具体含义及二者的区别。

【学生】完成课前任务

【教师】使用超星学习通APP进行签到

考勤

【学生】班干部报请假人员及原因

【教师】提出以下问题:

问题导入同学们都知道Java是面向对象编程,AOP为面向切面编程,那么什么是切面?

【学生】思考、举手回答

【教师】讲解SpringAOP的实现方法

♦【教师】介绍SpringAOP的实现机制,基于XML和注解的AOP实现

一、SpringAOP的实现机制

SpringAOP实现时会为目标对象生成一个动态代理对象,并在代理对象中实现对目标对象

的增强。根据代理对象的创建方式,SpringAOP的实现机制分为JDK动态代理和CGLib

动态代理。

1.JDK动态代理

SpringAOP默认使用JDK动态代理,它通过jaYa.Iang.reflecl.Proxy类实现,可以调用Proxy

传授新知类的newProxyI「stance()方法动态创建代理对象。JDK动态代理实现非侵入式的代码扩展,

可以在不修改源代码的情况下增强某些方法。

2.CGLib动态代理

JDK动态代理只能为接口创建代理对•象,当需要为类创建代理对象时,就需要使用CGLib

动态代理。它不要求目标对象有实现接口,而是通过继承的方式动态创建代理对象。

【课堂问答】

+【教师】随机邀请学生回答以下问题

请同学们思考,在实际开发中,SpringAOP根据什么来选择实现动态代理的方式?

中【学生】聆听、甩考、回答

6

*【教师】总结学生的回答

在实际开发中,如果使用接口实现目标对象,AOP会使用JDK实现动态代理;如果直接

使用类实现目标对象,则AOP会使用CGLib实现动态代理。

基于上述两种实现机制,SpringAOP的实现方式有两种,即动态代理方式和使用AspectJ

框架的方式。AspeciJ是一个基于Java的AOP框架,它提供了强大的AOP功能。Spring

2.0以后,SpringAOP引入了对Aspect!的支持,并允许直接使用Aspect1进行编程。本节

重点讲解使用Aspect1框架的方式实现SpringAOP的方法。

使用AspectJ实现SpringAOP的方法有两种:基于XML的AOP实现和基于注解的AOP

实现。

二、基于XML的AOP实现

♦【教师】多媒体观看视频“基于XML的AOP实现”,让学生了解在XML文件中配置

AOP的元素,以及基于XML实现的AOP案例

基于XML文件实现AOP时,主要是在Spring的XML配置文件中使用<aop:config>元素

及其子元素对所有切面、切入点和通知等进行配置。<aop:config>元素的子元素如表4-1所

/Ko

卜.面对表中的子元素进行详细讲解O

1.配置切面

在Spring的配置文件中,切面通常是通过<aop:aspeci>元素米配置的,该元素会将一个己

定义好的SpringBean设置为切面Bean。因此,在使用<aop:aspeci>元素前,首先要定义一

个普通的Bean,然后通过<aop:aspect>的ref属性引用该Bean。<aop:aspect>元素还可以通

过id属性指定该切面的唯一标识。

2.配置切入点

在Spring的配置文件中,切入点是通过<aop:pointcut>元素来配置的。当<aop:pointcut>元

素作为vaop:config>元素的子元素时,表示该切入点是全局切入点,可被多个切面共享;当

它作为<aop:aspcct>元素的子元素时,表示该切入点只对当前切面有效。

vaop:pointcu1>元素通常会指定id和expression属性。其中,id属性用于指定切入点的唯一

标识:expression属性用十指定切入点表达式,表不在匹配该表达式的连接点时织人通知,

其基本格式如下

execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattem(param-

pattern)throws-pattern?)

(1)modifiers-pattem:目标方法的访问修饰符,如public、private等。

(2)rct-typc-pactcrn:目标方法的返回值类型,如void、String等。

(3)declaring-type-pattern:目标方法的声明类,如“com.spring.aop.jdk.User”等。

(4)name-pattern:Fl标方法的名称,如updaie。。

(5)param-pattern:目标方法的参数类型,如String、Double等。

(6)throws-pattem:目标方法抛出的异常类型。

其中,带“?”的参数表示可配置项,其他部分则是必须配置项。此外,在切入点表达式

中,可使用表示所有,如所有类、所有参数等,还可使用表示任何类型。下面

列举几种表达式及其说明,如表所示。

+提示

切入点表达式可以与II、&&或!运算符组合,^Q!exccution(*com.spring.aop.jdk..addUscr(..))

表示执行com.spring.aop.jdk包中所有类的任何类型的除addUser。方法之外的所有方法。

3.配置通知

在Spring的配置文件中,通知是通过<aop:config>元素的5个子元素来配置的,5种通知

7

的配置顺序决定通知的执行顺序。配置通知子元素的常用属性如表所示。

【例题】

+【教师】出示【示例】,组织学生答题

基于XML实现SpringAOP。

十【学生】聆听、思考、答题

十【教师】解析例题

【分析】首先创建Product接口,并创建Productlmpl类(目标对象)实现接口;然后创建

ProductAspect切面类,在类中定义前置通知、后置通知、环绕通知、异常通知和返回通知;

接着创建aopXnil.xml配置文件,在文件中定义Producthnpl类和ProductAspcct类的Bean♦

并配置切面、切入点和通知;最后创建AopXmlTest类,在类中获取Productlmpl类的Bean,

并通过Bean调用目标方法。

此外,使用AspectJ实现AOP需要引入AspectJ包aspectj-xxx.jar和AspectJWeaver包

aspectjweaver-xxx.jaro

【实施】(1)通过https://www.IntelliJIDEA.org/aspectj/downloads.php下载aspectj-l.9.6.jar,

通过https://mvniepository.coin/artifact/org.aspectj/aspectjweaverZl.9.9.1下载aspectjweaver-

.jar,然后将这两个包更制到spring项目的lib文件夹中,并添加至构建路径。

(2)在spring项目下创建com.spring.aop.xml包,在包中创建Product接口,并在接口中

定义insert。和delete。目标方法。

……实现代码详见教材

(3)在com.spring.aop.xml包中创建Productlmpl类实现Product接口,在类中重写insert()

和delete。方法。其中,insert。方法实现输出添加信息提示;delete。方法实现输出删除信息

提示,并使用throw语句抛出异常。

……实现代码详见教材

(4)在com.spring.aop.xml包中创建ProcuctAspect类,并在类中定义前置通知

adviseBeforc。、后置通知adviseAftcr。、环绕通知adviscAround。、异常通知adviscThrow。

和返回通知adviseReturnO,分别实现输出相应的提示。通知使用JoinPoint接口及其

ProceedingJoinPoint「接口作为参数获取目标对象的类名、方法名和参数等。

其中,环绕通知必须接收一个ProceedingJoinPoint类型的参数,返回值类型为Object,且

必须抛出异常;异常通知可使用Throwable类型的参数来获取异常信息。

……实现代码详见教材

(5)在spring项目的resources源文件夹中创建aopXnil.xml配置文件。在文件中引入aop

的命名空间,然后定义Productlmpl类和ProductAspcct类的Bean实例product和

productAspect,并使用相应的元素配置AOP、切面、切入点和通知。

……实现代码详见教材

(6)在com.spring.aop.xml包中创建AopXmlTest类。在类的main。方法中加载aopXrnl.xml

配置文件,然后获取Bean实例product,最后通过product调用目标方法。

……实现代码详见教材

(7)执行AopXmlTest类,程序运行结果如图所示。

【程序说明】从图可以看出,通知的执行顺序与Spring5默认的执行顺序不同,而与配置

文件中通知的配置顺序相同。

+提示

JoinPoint接口及其ProceedingJoinPoint子接口可以通过其方法获取目标对象的信息,常用

的方法如下。

8

(1)getTargetO:获取H标对象,通过其getClass().getNarne()方法获取目标对象所属类名。

(2)getSignature():获取封装了署名信息的对象,通过其getName。方法获取目标方法名

称。

(3)getArgs():获取目标方法的实参列表,通过其get(inti)方法获取第i个参数的值。

三、基于注解的AOP实现

十【教师】多媒体观看视频“基于注解的AOP实现”,让学生了解Spring实现AOP的注

解,以及基于注解实现的AOP案例

为简化AOP的配置,可以使用注解实现AOP,此时通知按照默认的顺序执行。Spring提

供了一系列注解,如表所示。

【课堂问答】

♦【教师】随机邀请学生回答以下问题

请同学们罗列,通过注解实现AOP,Spring有哪些注解供用户使用?

十【学生】聆听、思考、回答

中【教师】总结学生的回答

【例题】

+【教师】出示【示例】,组织学生答题

使用注解实现示例。

4【学生】聆听、思考、答题

十【教师】解析例题

【分析】使用@Componeni注解标注Productlmpl类,使用@Component和@Aspect注解标

注ProductAspecl类。在ProductAspect类中,定义一个方法命名切入点,并使用@Pointcut

注解将其标注为切入点,同时指定切入点表达式;然后定义4个方法,并使用@Before、

@Afler、@Around>@AfterThrowing和@人成出€111011照注解将其标注为相应的通知,同

时指定切入点。

【解】(1)在spring项目下创建com.spring.aop.annotation包,并在包中创建Product接口。

……实现代码详见教材

(2)在com.spring.aop.annotation包中创建Productlmpl类实现Product接口,在类定义前

使用©Component将类标注为Beano

……实现代码详见教材

(3)在com.spring.aop.annotation包中创建ProductAspect类,在类定义前使用@Aspecl注

解将其标注为切面类,使用@0)1】甲01]°!11注解将其标注为Bcana

在类中,定义返回值为void、方法体为空的pointculO方法命名切入点,并使用@Pointcul

注解将其标注为切入点,同时指定切入点表达式:使用@Before、@After@Around>

@AfterThrowing和@AfterReturning注解分别标注adviseBefore。、adviseAfter()>

adviseAround()、adviseThrow()和adviseReturn。方法,注解的value属性值都为pointcut().»

其中,@AfterThrowing注解还须设置throwing属性。

……实现代码详见教材

(4)在spring项目的resources源文件夹中创建aopAnnotation.xml配置文件,在文件中还

使用<aop:aspecij-autoproxy>元素开启AOP自匆配置功能。

……实现代码详见教材

(5)在com.spring.aop.annotation包中创建AopAnnotationTest类。

……实现代码详见教材

(6)执行AopAnnotationTest类,程序运行结果如图所示。

9

【程序说明】从图可以看出,通知的执行顺序与Spring5默认的执行顺序相同。

【学生】聆听、思考、理解、记录

【教师】对学生进行分组,4〜6人一组,每组选出一名组长,然后组织学生以小组为单位

讨论以下问题

请同学们根据本次课讲解的基于XML的AOP实现和基于注解的AOP实现,对•比分析两

课堂讨论

种方式的实现步骤。

【学生】聆听、思考、小组讨论,由小组代表上台发表讨论结果

【教师】总结学生的回答,并评价各组的表现

【教师】简要总结本节课的要点

本次课介绍了SpringAOP的概念,阐述了SpringAOP的相关术语,包括切面、连接点、

切入点、通知、目标对象、代理对象和织入等。讲解了SpringAOP的实现机制,分为JDK

课堂小结

动态代理和CGLib动态代理。最后讲解了基于XML的AOP实现,基于注解的AOP实

现,并通过实际的例程介绍了详细的实现步骤,包括各部分具体的代码实现,及代码功能。

【学生】总结回顾知识点

【教师】布置课后作业

作业布置请根据本课内容,完成课后习题中的相关习题。

【学生】完成课后任务

教学反思

10

第21次课

课题SpringAOP(3)

课时2课时(90min)

知识目标:

(I)掌握基于注解的AOP实现

(2)掌握用户管理接口及其实现类、学生信息管理接口及其实现类、切面类、配置文件、

执行类等的创建和配置方法

教学目标能力目标:

能通过SpringAOP来实现学生管理系统

素质目标:

养成坚持不懈、刻苦钻研的学习作风,树立追求卓越、勇于拼搏的奋斗精神,培育执着专

注、踏实认真的职业素质

教学重点:基于注解的AOP实现,相关接口及其实现类的编写,创建配置文件

教学重难点

教学难点:基于注解的AOP实现

教学方法问答法、讨论法、讲授法、演示法、任务驱动法

教学用具电脑、投影仪、多媒体课件、教材

教学过程主要教学内容及步骤

【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过超星学习通APP或

其他学习软件,完成课前任务

课前任务

请同学们根据本校或者查找市场上已有的学生管理系统,看其具有哪些功能,

【学生】完成课前任务

【教师】使用超星学习通APP进行签到

考勤

【学生】班干部报请假人员及原因

【教师】提出以下问题:

问题导入本章同学们学习了SpringAOP,那么如何通过SpringAOP来实现学生管理系统?

【学生】思考、举手回答

【教师】讲解综合案例一一学生管理系统的AOP,包括:案例内容、案例分析、案例实

一、案例内容

+【教师】讲解学生管理系统的概念,功能设计

【课堂问答】

十【教师】随机邀请学生回答以下问题

请同学们思考,如果让大家设计一套学生管理系统,需要具备哪些基本功能?

传授新知十【学生】聆听、思考、回答

十【教师】总结学生的回答

学生管理系统一般包括用户模块、学生信息模块和学生成绩模块。其中,用户模块则实现

学生、教师登录和退出功能:学生信息和学生成绩模块实现添加、更新、查询信息和成绩

功能。由于学生只能查询本人的信息和成绩,所以每次执行操作前需要进行权限验证。而

且每次操作都需要记录,以便系统后续的管理和维护。本案例将通过SpringAOP来实现

学生管理系统。

二、案例分析

十【教师】介绍实现学生管理系统需要创建的各个接口及类

11

【课堂问答】

+【教师】随机邀请学生回答以下问题

请同学们思考,实现上述学生管理系统,在代码中需要创建哪些接口,创建哪些类?

十【学生】聆听、思考、回答

十【教师】总结学生的回答

(1)使用基于注解的AOP实现学生管理系统,

(2)创建用户管理接口及其实现类,在接口中定义登录和退出登录方法;在类中定义账

号、密码和身份静态属性,以及获取账号•和身份方法,然后重写登录和退出登录方法。

(3)创建学生信息管理接口及其实现类,并接口中定义方法,以及在类中重写方法,实

现添加、更新和查询学生信息功能。

(4)创建学生成绩成绩接口及其实现类,并接口中定义方法,以及在类中重写方法,实

现添加、更新和查询学生成绩功能。

(5)创建切面类,在类中定义方法获取当前时间、前置通知实现权限验证、环绕通知实

现记录操作、异常通知实现记录异常信息。其中,权限验证通过用户账号和身份判断学生

是否能执行当前操作,如果能则执行当前操作,否则抛出异常,中断程序。

(6)创建配置文件,在文件中指定扫描的包,并开启Bean的自动扫描功能和AOP自动

配置功能。

(7)创建执行类,在类中获取用户管理类、学生信息管理类和学生成绩管理类的Bean,

然后通过Bean调用相关方法,实现登录和退出系统、查询学生信息和成绩功能。

三、案例实施

十【教师】讲解各个接口和类的具体代码实现,并进行演示

(1)在spring项目下创建com.spring.student.system包,在包中创建用户管理接口

UserManage,并在在接口中定义login。和quil()方法。实现代码如下。

packagecom.spring.studcnt.system;

publicinterfaceUserManage{

publicvoidlogin(Stringnumber,Stringpassword.Stringidentity);

publicvoidquit();

)

(2)在com.spring.student.system包中创建UserManage接口的实现类UserManagelmph

并在类定义前使用@Componenl注解将其标注为Bean。在类中,定义账号(number)、密

码(password)和身份(identity)静态属性,然后定义gctXxx()方法获取账号和身份信息,

接着重写login。方法实现验证用户登录信息,如果正确则输出登录成功提示并赋值给属

性,否则抛出异常,以及重写quit。方法实现输出退出登录提示。实现代码如下。

packagecom.spring.student.system;

importorg.springframework.stereotype.Component:

@Componcnt("userManage")

publicclassUserManagelmplimplementsUserManage{

staticStringnumber;

staticStringpassword;

staticStringidentity;

publicStringgetNumber(){

returnUserManagelmpl.number;

12

publicStringgetldentityO{

returnUserManagehnpl.identity;

)

©Override

publicvoidlogin(S(ringnumber.Stringpassword.Stringidentity){

if("2022010200l".equals(number)&&"123456".equals(password)

&&"学生".equals(idenlity)){

System.out.println(number+”用户登录成功,,);

UscrManageltnpl.number=number;

UserManagelmpLpassword=password;

UserManagelmpLidentity=identity;

)

else

thrownewRuniimeException("账号或密码错误)

}

@Ovcrridc

publicvoidquit(){

Sysiem.oui.prinUn(“用户退出登录.”);

)

)

(3)在com.spring.student.system包中创建学生信息管理接口StudentManage,并在类中定

义addStudent()>updateStudent。和queryStudent。方法。实现代码如下。

packagecom.spring.student.system;

publicinterfaceStudentManage{

publicvoidaddStudcnt();

publicvoidupdateStudenl(Slringnumber);

publicvoidqueiyStudent(Stringnumber);

I

(4)在com.spring.student.system包中创建StudentManage接口的实现类

StudentManagelmpL并在类定义前使用©Component注解将其标注为Bean。在类中,重写

addStudent()xupdateStudent。和queryStudenl。方法,分别实现输出添加、根据账号更新或

查询学生信息提示。实现代码如下。

packagecom.spring.student.system;

importorg.springframework.stereotype.Component:

@Coinponent("studentManage")

publicclassStudentManagelmplimplementsStudentManage{

@Override

publicvoidaddStudent(){

System.out.println("添加学生信息");

)

©Override

publicvoidupda(eStudent(Stringnumber){

System.out.printin("更新该学生信息:"+number);

13

©Override

publicvoidqueryStudent(Stringnumber){

System.out.prinUn("查询该学生信息:"+number);

)

)

(5)在com.spring.student.system包中创建学生成绩管理接口ScoreManage,并在接口中

并定义addScore。、updateScore。和queryScore。方法。实现代码如下。

packagecom.spring.student.system;

publicinterfaceScorcManagc{

publicvoidaddScore();

publicvoidupdateScore(Stringnumber);

publicvoidqueryScore(Stringnumber);

)

(6)在coni.spnng.student.system包中创建ScoreManage接口的实现类ScoreManagelmpl,

并在类定义前使用©Component注解将其标注为Bean。在类中,重写addScore。、

updatcScore。和qucryScorc()方法,分别实现输巴添加、根据账号更新或查询学生成绩提示。

实现代码如下。

packagecom.spring.studcm.sysicnK

importorg.springframework.stereolype.Component;

©ComponentC'scoreManage")

publicclassScoreManagelmplimplementsScoreManage{

@Override

publicvoidaddScore(){

System.out.prinUn("添加学生成绩)

)

@Override

publicvoidupdateScore(Stringnumber){

System.out.println("更新该学生成绩:"+number);

)

@Override

publicvoidqueryScore(Stiingnumber){

System.out.println("查询该学生成绩:"+number);

I

}

(7)在com.spring.student.system包中创建切面类SystemAspect,并在类定义前使用

@Aspect注解将其标注为切面类,以及使用©Component注解将其标注为Bean。在类中,

执行以下操作。

【课堂问答】

+【教师】随机邀请学生回答以下问题

请同学们根据上节课SpringAOP通知的执行顺序,思考在代码中如何实现这些通知?

十【学生】聆听、思考、回答

+【教师】总结学生的回答

①创建UserManagelmpl类对象userManage。

②定义getTime()方法获取当前时间。

14

③定义pointcut。方法并使用@Pointcut注解将其标注为切入点,同时指定切入点表达式。

④定义adviseBeforel。和adviseBcfore2()方法,并使用@8。砧化注解将其标注为前置通知。

其中,adviseBeforel。方法实现验证用户身份,限制学生添加和更新信息和成绩;

adviseBefore2()方法实现验证用户账号和身份,限制学生查询其他学生的信息和成绩。

⑤定义adviseAround。方法,并使用@Around注解将其标注为环绕通知,实现用户执行操

作前后记录。

©定义adviseThrow。方法,并使用@AftefThn)wing注解将其标注为异常通知,实现执行

操作的异常信息记录。

实现代码如下。

@Aspect〃将SystemAspect类标注为切面类

©Component〃将SystemAspect类标注为Bean

publicclassSystemAspect{

〃创建UserManagehnpl类对象userManage

UserManagelmpIuserManage=newUserManageImpl();

publicStringgctTimc(){〃定义方法获取当前时间

Datedate=newDa(e();〃创建日期对象date

〃创建日期格式

DateFormatdf=newSimpleDateFormat("yyyy-MM-ddhh时mm分ss秒)

returncf.format(date);

I

@Pointcut("execution(*com.spring.student.system..*(..))u)

publicvoidpointcut(){}〃定义方法命名切入点

〃定义方法并标注为前置通知,验证用户身份,限制学生添加和更新信息和成绩

@Bcforc(valuc="exccution(*coni.spring.studcnt.systcm..add*(..))"

+'llexeculion(*com.spring.studen(.system..updale*(..))")

publicvoidadviseBefore1(JoinPointjionPoint){

StringineihodName=jionPoint.getSignature().getName();

List<Object>args=Anays.asList(jionPoint.getArgs());

if(userManage.getidentityO=="学生")!

thrownewRuntimeException(userManage.getNumber()

+“用户无权限对"+args.gct(O)+"进行"+mcthodNamc+"操作)

)

)

〃定义方法并标注为前置通知,验证用户账号和身份,限制学生查询其他学生的信息

和成绩

@Before(value="execution(*com.spring.student.system..query*(..))")

publicvoidadviseBefbre2(JoinPointjionPoint){

StringmcthodNamc=jionPoint.getSignature().getName();

List<Object>args=Arrays.asLisl(jionPoint.getArgs());

if(uscrManagc.gctNumbcr()!=args.gct(O)&&userManage.getidentityO=="学生"){

thrownewRuniimeException(userVfanage.getNumber()

+”用户无权限对"+args.get(O)+”进行"+methodName+”操作)

)

15

〃定义方法并标注为环绕通知

(aAroundCpointcutO")

publicObjectadviseAround(ProceedingJoinPointproceedingJoinPoint)throwsThrowable{

System.out.prinlln(gelTimeO);

System.out.println(userManage.getNumber()+"用户执行"

+proceedingJoinPoint.getSignature().getName()+”操作”);

Objectobject=proceedingJoinPoint.prcceed();

Systcm.out.println(uscrManagc.gctNumbcr()+"用户完成"

+proceedingJoinPoint.getSignature().getName()+"操作");

returnobject;

)

〃定义方法并标注为异常通知

@AfterThrowing(value="pointcut()”,throwing="e")

publicvoidadviseThrow(JoinPointjionPoint.RuntinieExceptione){

Systcm.out.printin("记录执行"+jionPoint.gctSignature().getNamc()+"异常信息");

)

}

(8)在spring项目的resources源文件夹中创建配置文件sludenl_system.xml,在文件中指

定扫描的包,并开启自动扫描功能,以及开启AOP自动配置功能。实现代佰如下。

<?xmlversion="1.0nencoding="UTF-8"?>

<beansxmlns="http:〃www.springframework.org/schema/beans”

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:conteKt="http://www.springframew/scheiTia/context"

xmlns:aop='http://www.springframcwork.org/schcma/aop"

xsi:schemaLocation="http://www.springfrainework.org/scheina/beans

http://www.springframework.org/schema/beaiis/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springfiamework.org/schema/context/spring-context.xsd

http://www.springframework.org/scheina/aop

h(tp://www.springframework.org/schema/aop/spring-aop.xsd">

<!--指定扫描的包,并开启自动扫描功能

<context:component-scanbase-package=',coin.spring.sludent.syslem"/>

<!--开启AOP自动配置功能

<aop:aspectj-autoproxy/>

</beans>

(9)在coni.spring.student.syslem包中仓ij建执行类SiudeniSystem。在类的n】ain()方法中,

加载student_system.xml配置文件,然后分别获取Bean实例userManage^studenlManage

和scorcManagc,最后使用try-catch-finally语句捕获异常信息。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论