JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP

上传人:sat****105 文档编号:325451886 上传时间:2022-07-18 格式:PPTX 页数:63 大小:635.54KB
返回 下载 相关 举报
JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP_第1页
第1页 / 共63页
JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP_第2页
第2页 / 共63页
JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP_第3页
第3页 / 共63页
JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP_第4页
第4页 / 共63页
JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP》由会员分享,可在线阅读,更多相关《JavaEE企业级应用开发教程教学课件(共15章)第8章-Spring-AOP(63页珍藏版)》请在金锄头文库上搜索。

1、第8章 Spring AOPJava EE企业级应用开发教程(Spring+Spring MVC+MyBatis)(第2版)学习目标/Target 了解Spring AOP的概念及其术语 熟悉Spring AOP的JDK动态代理 熟悉Spring AOP的CGLib动态代理 掌握基于XML的AOP实现 掌握基于注解的AOP实现 章节概述/Summary Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等,本章将对Spring AOP的相关知识进行详细讲解。目录/Contents010203Spring AOP介绍

2、Spring AOP的实现机制基于XML的AOP实现04基于注解的AOP实现Spring AOP介绍8.18.1.1 Spring AOP概述先定一个小目标!先定一个小目标!了解Spring AOP概述,能够说出什么是Spring AOPAOP概述8.1.1 Spring AOP概述 AOP的全称是Aspect Oriented Programming,即面向切面编程。和OOP不同,AOP主张将程序中相同的业务逻辑进行横向隔离,并将重复的业务逻辑抽取到一个独立的模块中,以达到提高程序可重用性和开发效率的目的。在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组

3、合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。未使用AOP的面向切面编程案例8.1.1 Spring AOP概述 例如,订单系统中有添加订单信息、更新订单信息和删除订单信息3个方法,这3个方法中都包含事务管理业务代码,订单系统的逻辑如图所示。AOP面向切面编程的优势8.1.1 Spring AOP概述 由订单系统可知,添加订单信息、修改订单信息、删除订单信息的方法体中都包含事务管理的业务逻辑,这就带来了一定数量的重复代码并使程序的维护成本增加。基于AOP的面向切面编程,可以为此类问题提供解决方案,AOP可以将事务管理的业务逻辑从这三个方

4、法体中抽取到一个可重用的模块,进而降低横向业务逻辑之间的耦合,减少重复代码。AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多地关注其他业务逻辑的实现,不但提高了开发效率,而且增强了代码的可维护性。8.1.2 Spring AOP术语先定一个小目标!先定一个小目标!了解Spring AOP术语,能够说出Spring AOP的常用术语及术语的意思AOP术语8.1.2 Spring AOP术语 AOP并不是一个新的概念,AOP中涉及很多术语,如切面、连接点、切入点、通知/增强处理、目标对象、织入、代理和引介等,下面针对AOP的常用术语进行简单介绍。切面(Aspect)8.1.2

5、 Spring AOP术语 切面是指关注点形成的类(关注点是指类中重复的代码),通常是指封装的、用于横向插入系统的功能类(如事务管理、日志记录等)。在实际开发中,该类被Spring容器识别为切面,需要在配置文件中通过元素指定。连接点(Joinpoint)8.1.2 Spring AOP术语 连接点是程序执行过程中某个特定的节点,例如,某方法调用时或处理异常时。在Spring AOP中,一个连接点通常是一个方法的执行。切入点(Pointcut)8.1.2 Spring AOP术语 当某个连接点满足预先指定的条件时,AOP就能够定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点。通知/

6、增强处理(Advice)8.1.2 Spring AOP术语 通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。目标对象(Target)8.1.2 Spring AOP术语 目标对象是指被插入切面的方法,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。织入(Weaving)8.1.2 Spring AOP术语 将切面代码插入到目标对象上,从而生成代理对象的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。代理(Proxy)8.1.2 Spring AOP术语 将通知应用到

7、目标对象之后,程序动态创建的通知对象,就称为代理。代理类既可能是和原类具有相同接口的类,也可能是原类的子类,可以采用调用原类相同的方式调用代理类。引介(Introduction)8.1.2 Spring AOP术语 引介是一种特殊的通知,它可为目标对象添加一些属性和方法。这样,即使一个业务类原本没有实现某一个接口,通过AOP的引介功能,也可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。Spring AOP的实现机制8.28.2.1 JDK动态代理先定一个小目标!先定一个小目标!熟悉JDK动态代理,能够灵活应用JDK动态代理的机制Spring AOP的默认代理方式8.2.1

8、 JDK动态代理 默认情况下,Spring AOP使用JDK动态代理,JDK动态代理是通过java.lang.reflect.Proxy 类实现的,可以调用Proxy类的newProxyInstance()方法创建代理对象。JDK动态代理可以实现无侵入式的代码扩展,并且可以在不修改源代码的情况下,增强某些方法。STEP 01在IDEA中创建一个名为chapter08的Maven项目,然后在项目的pom.xml文件中加载需使用到的Spring基础包和Spring的依赖包。8.2.1 JDK动态代理接下来,通过一个案例演示Spring中JDK动态代理的实现过程,案例具体实现步骤如下。STEP 02

9、创建接口UserDao,在UserDao接口中编写添加和删除的方法。package com.itheima.demo01;public interface UserDao public void addUser();public void deleteUser();8.2.1 JDK动态代理STEP 03创建UserDao接口的实现类UserDaoImpl,分别实现接口中的方法。package com.itheima.demo01;public class UserDaoImpl implements UserDao public void addUser()System.out.printl

10、n(添加用户);public void deleteUser()System.out.println(删除用户);8.2.1 JDK动态代理STEP 04创建切面类MyAspect,在该类中定义一个模拟权限检查的方法和一个模拟日志记录的方法,这两个方法就是切面中的通知。package com.itheima.demo01;/切面类:存在多个通知Advice(增强的方法)public class MyAspect public void check_Permissions()System.out.println(模拟检查权限.);public void log()System.out.print

11、ln(模拟记录日志.);8.2.1 JDK动态代理STEP 05创建代理类MyProxy,该类需要实现InvocationHandler接口设置代理类的调用处理程序。在代理类中,通过newProxyInstance()生成代理方法。public class MyProxy implements InvocationHandler private UserDao userDao;public Object createProxy(UserDao userDao)this.userDao=userDao;ClassLoader classLoader=MyProxy.class.getClassL

12、oader();/1.类加载器 Class classes=userDao.getClass().getInterfaces();/2.被代理对象实现的所有接口 return Proxy.newProxyInstance(classLoader,classes,this);/3.返回代理对象 /所有动态代理类的方法调用,都会交由invoke()方法去处理。篇幅问题这里省略invoke()方法8.2.1 JDK动态代理newProxyInstance()方法的3个参数 8.2.1 JDK动态代理 第1个参数是classLoader,表示当前类的类加载器。第2个参数是classes,表示被代理对象

13、实现的所有接口。第3个参数是this,表示代理类JdkProxy本身。STEP 06创建测试类JDKTest。在该类中的main()方法中创建代理对象jdkProxy和目标对象userDao,然后从代理对象jdkProxy中获得对目标对象userDao增强后的对象userDao1,最后调用userDao1对象中的添加和删除方法。public class JDKTest public static void main(String args)MyProxy jdkProxy=new MyProxy();/创建代理对象 UserDao userDao=new UserDaoImpl();/创建目标

14、对象 /从代理对象中获取增强后的目标对象 UserDao userDao1=(UserDao)jdkProxy.createProxy(userDao);/执行方法 userDao1.addUser();userDao1.deleteUser();8.2.1 JDK动态代理STEP 07在IDEA中启动JDKTest类,控制台会输出结果。8.2.1 JDK动态代理8.2.2 CGLib代理先定一个小目标!先定一个小目标!熟悉CGLib动态代理,能够灵活应用CGLib动态代理的机制JDK与CGLib动态代理的比较8.2.2 CGLib动态代理 JDK动态代理存在缺陷,它只能为接口创建代理对象,当

15、需要为类创建代理对象时,就需要使用CGLib(Code Generation Library)动态代理,CGLib动态代理不要求目标类实现接口,它采用底层的字节码技术,通过继承的方式动态创建代理对象。Spring的核心包已经集成了CGLib所需要的包,所以开发中不需要另外导入JAR包。STEP 01创建目标类UserDao,在该类中编写添加用户和删除用户的方法。package com.itheima.demo02;public class UserDao public void addUser()System.out.println(添加用户);public void deleteUser()

16、System.out.println(删除用户);8.2.2 CGLib动态代理接下来通过一个案例演示CGLib动态代理的实现过程,具体步骤如下。STEP 02创建代理类CglibProxy,该代理类需要实现MethodInterceptor接口用于设置代理类的调用处理程序,并实现接口中的intercept()方法。public class CglibProxy implements MethodInterceptor public Object createProxy(Object target)/代理方法 Enhancer enhancer=new Enhancer();/创建一个动态类对象 enhancer.setSuperclass(target.getClass();/确定需要增强的类,设置其父类 enhancer.setCallback(this);/添加回调函数 return enhancer.create();/返回创建的代理类 /intercept()方法省略8.2.2 CGLib动态代理STEP 03创建测试类CglibTest,在main()方法中首先创建代理对象

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号