4.3 Spring AOP 面向切面编程_第1页
4.3 Spring AOP 面向切面编程_第2页
4.3 Spring AOP 面向切面编程_第3页
4.3 Spring AOP 面向切面编程_第4页
4.3 Spring AOP 面向切面编程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

4.3SpringAOP01教师出镜面向切面编程(AOP)01教师出镜用户查询功能日志记录权限检查事务管理√√√附加功能核心业务AOP完美分离一、AOP概念导入传统开发的痛点假设我们有10个Service类,每个类的增删改查方法都需要记录日志。传统做法就是在每个方法里写(...)——10个类×4个方法=40处重复代码!以后要改日志格式,得改40个地方,简直是灾难!一、AOP概念导入AOP的解决方案AOP把这些横切关注点(比如日志、事务)从业务逻辑中"剥离"出来,做成独立的"切面",然后"织入"到目标方法中。(文字不用在视频中呈现,配相对应的素材)就像给蛋糕裱花——蛋糕(核心业务)做好后,用裱花袋(切面)把奶油(横切功能)挤上去,既美观又不影响蛋糕本身的味道!二、AOP核心概念核心术语切面(Aspect):封装横切关注点的模块(如日志切面)概念关系图切面(Aspect)通知(Advice)切点(Pointcut)连接点(JoinPoint)织入(Weaving)——就是那个"裱花袋"(配图,文字不用在视频中呈现)二、AOP核心概念核心术语连接点(JoinPoint):程序执行的特定点(如方法调用)概念关系图切面(Aspect)通知(Advice)切点(Pointcut)连接点(JoinPoint)织入(Weaving)——可以裱花的位置(配图,文字不用在视频中呈现)二、AOP核心概念核心术语通知(Advice):切面在连接点执行的操作(前置/后置/环绕通知等)概念关系图切面(Aspect)通知(Advice)切点(Pointcut)连接点(JoinPoint)织入(Weaving)——就是"挤奶油"的动作(配图,文字不用在视频中呈现)二、AOP核心概念核心术语切点(Pointcut):匹配连接点的表达式概念关系图切面(Aspect)通知(Advice)切点(Pointcut)连接点(JoinPoint)织入(Weaving)——就是"在哪里裱花"(配图,文字不用在视频中呈现)二、AOP核心概念核心术语织入(Weaving):将切面应用到目标对象的过程概念关系图切面(Aspect)通知(Advice)切点(Pointcut)连接点(JoinPoint)织入(Weaving)——就是那个"裱花袋"(配图,文字不用在视频中呈现)重点:切点表达式是AOP的"导航系统",能精确命中你想要增强的方法!三、AOP与OOP对比

OOP(面向对象)

AOP(面向切面)关注业务实体的封装——处理"名词领域",比如User类、OrderService接口关注业务过程中的步骤——处理"动词领域",比如记录日志、检查权限三、AOP与OOP对比OOPUser类(数据)和UserService.getUser()方法(操作)AOP在getUser()执行前后自动记录日志不是竞争关系,而是"黄金搭档"搭骨架填血肉四、SpringAOP环境准备05核心依赖1核心依赖配置(pom.xml)核心依赖2核心依赖配置(pom.xml)重点:两个依赖缺一不可。提供IoC容器,管理Bean的创建和依赖AOP的"手术刀",负责把切面"切"进目标方法(专业叫"织入")记住:少了aspectjweaver,AOP注解(@Aspect、@Before等)会无效,控制台可能报"无法找到AspectJ类"的错误!//xml<!--Spring上下文依赖--><dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>6.1.0</version></dependency><!--AspectJ织入器依赖--><dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.9.7</version></dependency>06五、目标业务类设计

(实体与接口)User.java(实体类)://javapublicclassUser{

privateStringuserNo;//用户编号

privateStringuserName;//用户姓名

//构造方法、getter/setter、toString()}UserService接口://javapublicinterfaceUserService{

UsergetUser(StringuserId);//查询用户}06五、目标业务类设计这个业务类很干净,没有任何日志、事务相关的代码。代码与文稿对应不上,需核对AOP追求的"纯粹"UserServiceImpl实现类://javapublicclassUserServiceImplimplementsUserService{

@Override

publicUsergetUser(StringuserId){

returnnewUser(userId,"张三");//模拟查询数据库

}}六、切面类实现(LoggingAspect.java)07前置通知(BeforeAdvice)**日志切面类代码**:@Aspect//声明为切面类@Component//交由Spring容器管理publicclassLoggingAspect{@Before("execution(*UserService.getUser(..))")publicvoidbeforeAdvice(JoinPointjoinPoint){System.out.println("前置通知:开始执行"+joinPoint.getSignature().getName()+"⽅法");}}后置通知(AfterAdv**日志切面类代码**:@After("execution(*UspublicvoidafterAdvicSystem.out.println("}}重点切点表达式execution(*Use代码与文稿对应不上,需核对七、Spring配置文件(applicationContext.xml)08

(Bean定义)<beanid="userService"class="UserServiceImpl"/><beanid="loggingAspect"class="LoggingAspect"/>定义目标Bean和切面Bean。

(AOP配置)<aop:config><aop:aspectref="loggingAspect"><aop:pointcutid="userServicePointcut"expression="execution(*UserService.getUser(..))"/><aop:beforemethod="beforeAdvice"pointcut-ref="userServicePoint<aop:aftermethod="afterAdvice"pointcut-ref="userServicePointcu</aop:aspect></aop:config>重点:``的`expression`属性与切面类中的切点表达式一致。代码与文稿对应不上,需核对七、测试类实现与执行流程分析

(测试类代码)

(AOP执行时序图)读取配置文件,创建Bean定义创建代理对象基于切点表达式生成代理userService.getUser()执行前置通知@Before方法方法//javaimportorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassTest{

publicstaticvoidmain(String[]args){

//加载Spring容器(启动导演喊"Action")

ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");

//获取UserService代理对象(注意:不是原始的UserServiceImpl!)

UserServiceuserService=context.getBean(UserService.class);

//调用目标方法(演员开始表演)

Useruser=userService.getUser("1");

System.out.println("获取到的用户信息:"+user);

}}10执行结果与通知类型扩展控制台输出结果前置通知:开始执行getUser方法通过构造函数创建的用戶对象编号:1用戶名称:张三后置通知:结束执行getUser方法获取到的用戶信息:User{userNo='1',userName='张三'}SpringAOP通知类型前置通知@Before目标方法执行前后置通知@After目标方法执行后(无论是否异常)返回通知@AfterReturning目标方法正常返回后异常通知11切点表达式详解与AOP应用场景总结切点表达式示例execution(*com.example.service.*.*(..)):匹配service包下所有类的所有方法execution(*UserService.getUser(String))

温馨提示

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

评论

0/150

提交评论