




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块一基础技能训练模块《电商web云平台开发》思维导图搭建电商平台Spring业务层搭建电商平台的Web项目—SpringMVC展示层搭建电商平台数据处理MyBatis项目1目录CONTENTS23电商平台SSM三层框架整合4项目一
搭建电商平台Spring业务层项目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比较主流的JavaEE企业级框架,用于搭建各种大小型的企业级应用系统。Spring是一个控制反转(IoC)和面向切面(AOP)的容器框架,SpringMVC是一个基于MVC设计模式的轻量级web框架,MyBatis是一个基于java的持久层框架。SpringSpringMVCMyBatisSSM框架本章节主要针对Spirng框架的学习和应用做详细的讲解,故本章主要研究内容如下:研究内容认知Spring概念、作用、特性Spring的IOC和依赖注入Spring的AOP实现模式学习目标1.了解Spring结构体系;2.理解Spring与IoC的概念和思想;3.认识SpringAOP(面像切面编程)。知识目标1.能够熟练使用Spring配置文件进行配置;2.能够熟练使用BeanFactory等方法实现Bean的装备;3.能够熟练使用基于XML方式的DI、基于注解的DI;4.能够熟练使用自动代理、Spring-Aop的切面、Spring-AspectJ配置事务管理。技能目标1.培养学生的主动性、执行力;2.锻炼学生工作中胆大心细;3.锻炼学生逻辑思维能力;4.培养学生有探索创新精神。素养目标任务一认知Spring概念、作用、特性预备知识一、Spring框架介绍面向切面(AOP)依赖注入(DI)轻量级的控制反转(IoC)Spring框架Spring框架是为了解决企业应用开发的复杂性而诞生的,它简化了Java应用开发,提高了开发的可测试性和可重用性。简单来说,Spring是一个轻量级的控制反转(IoC)、依赖注入(DI)和面向切面(AOP)的容器框架。预备知识一、Spring框架介绍2314控制反转(IoC)控制反转是一种编程思想,也是一种软件设计思想。事务事务是一系列操作合起来的总称,是为了保证数据的完整性而出现的一种工具。依赖注入(DI)依赖注入使用“反射”等底层技术,根据类名生成相应的对象,注入依赖项和执行方法。面向切面编程(AOP)面向切面的编程思想是将这些辅助功能封装成切面,利用AOP容器的功能将切面织入到主要业务逻辑中。Spring框架特点预备知识一、Spring框架介绍原子性(atomicity)AB一致性(consistency)事务必须具有四大特征C隔离性(isolation)D持久性(durability)预备知识二、Spring概念为代码“解耦”降低代码间的耦合度提高灵活性Spring主要作用主业务逻辑代码系统级业务逻辑代码系统代码分类预备知识二、Spring概念IoC使得主业务在相互调用过程中,不需要再自己创建使用对象了,统一由Spring容器管理,以自动“注入”的方式完成“织入”,使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了。IoC
01AOP02降低耦合度的方式预备知识二、Spring概念数据访问/集成Web与远程调用面向切面编程应用服务器设备管理消息发送核心容器测试Spring框架是由20多个模块组成预备知识二、Spring概念核心体系中,从下往上,各部分依次是Test、CoreContainer、AOP、Aspects、DataAccess/Integartion五部分。是Spring对数据访问层的统一和封装DataAccess/Integartion是Spring对AspectJ框架的整合Aspects对应spring-aop.jarAOPSpring的核心组件CoreContainerSpring提供的测试工具Test32154实施准备要在Java项目中使用Spring框架,首先需要安装jdk,来搭建java的开发环境,本项目采用的jdk版本为1.8。然后需要前往Spring的官网下载Spring的核心包,最后创建JavaProject并导入下载到本地的Spring框架核心jar包。至此Spring学习的准备工作就好了。任务实施与分析步骤1:jdk的安装和环境变量的配置我的电脑A属性B高级C环境变量D系统变量E添加环境变量F注意:添加和修改的是下面的系统变量,并非上面的用户变量;“Path”是首字母大写,不能改成“PATH”,bin后面要有分号“;”;用户变量中不要有其他“JAVA_HOME”和“Path”,以避免被干扰。任务实施与分析步骤2:Spring相关的核心包步骤2.1:下载Spring相关的核心包进入Spring官网选择“4.3.14.RELEASE/”选择“spring-framework-4.3.14.RELEASE-dist.zip”下载解压并双击打开任务实施与分析步骤2:Spring相关的核心包步骤2.1:下载Spring相关的核心包双击打开压缩包之后,会看到有3个文件夹和3个TXT文件,它们分别是:
docs:文档文件夹
libs:jar包文件夹
schema:约束文件夹
license.txt:许可
notice.txt:注意
readme.txt:说明在我们的生活中,有很多的人都会使用盗版软件,使用盗版软件对正版公司的权力受到了侵害,那么使用盗版的软件侵害的是对方的著作权吗?思政小课堂从法律的角度来看,如果是使用盗版软件的话一般属于侵权,但是情节比较轻微。从目前的市场上的大众行为来看,常见的盗版行为主要有生产商仿制软件光盘、销售商在所售计算机中预装软件、互联网在线软件盗版、用户未经著作权人授权使用软件、将只读光盘中的软件进行复制并销售等。如果已经使用了盗版的软件,这个时候侵害的就是对方的著作权,也是知识产权,但是使用软件只是侵权行为非常轻微的情况,一般不需要承担比较严重的法律责任。拓展知识一、Spring中jar包的作用Spring中有很多包,使用Spring框架不必引入所有的jara包,要使用基本功能的话,只需要图中选中的最基本的四个jar包即可。拓展知识一、Spring中jar包的作用
spring-core.jar:spring其他组件都要使用到这个包里的类,是其他组件的基本核心
spring-beans.jar:所有应用都需要使用
spring-aop.jar:使用基于AOP的Spring特性,如声明型事务管理等
spring-context.jar:为Spring核心提供了大量扩展
spring-jdbc.jar:包含对Spring对JDBC数据访问进行封装的所有类
SpringAspects:提供的对AspectJ框架的整合
Springexpression:Spring表达式语言
SpringInstrument:Spring对服务器的代理接口拓展知识一、Spring中jar包的作用
spring-instrument-tomcat:Spring对tomcat连接池的集成
SpringJMS:为简化Jmsapi的使用做的简单封装
Springorm:封装第三方orm实现
Springoxm:Spring对于Object/XML映射的支持,可以让JAVA与XML之间来回切换
Springtest:对JUnit等测试框架的简单封装
Springtx:为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理
Springweb:包含Web应用开发时,用到Spring框架时所需的核心类
Springwebmvc:包含SpringMVC框架相关的所有类拓展知识二、Spring中都用到了哪些设计模式装饰器模式适配器模式观察者模式模板方法模式代理模式工厂设计模式单例设计模式思考与总结什么是Spring框架?其特点是什么?能力提升本章开始我们将建立一个电商网站项目,该项目基于SSM框架开发,通过各个章节的学习将逐步完善该电商网站项目,本章将引导同学们创建项目并引入Spring框架,请同学们完善电商网站项目的以下内容:
搭建java运行环境,保证jdk安装成功,查看jdk版本状态;
创建JavaProject项目;
从官网下载Spring相关的jar包;
将Spring相关的jar包导入项目,并添加至构建路径。任务训练1.在开发工具中创建自己的电商网站项目Javaproject;2.将下载好的Spring相关jar包导入到项目中。《电商web云平台开发》感谢观看!模块一基础技能训练模块《电商web云平台开发》思维导图搭建电商平台Spring业务层搭建电商平台的Web项目—SpringMVC展示层搭建电商平台数据处理MyBatis项目1目录CONTENTS23电商平台SSM三层框架整合4项目一
搭建电商平台Spring业务层项目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比较主流的JavaEE企业级框架,用于搭建各种大小型的企业级应用系统。Spring是一个控制反转(IoC)和面向切面(AOP)的容器框架,它最主要的使命就是为了简化java开发,通过其核心的的Beanfactory实现底层类的实例化和生命周期管理。SpringMVC是一个基于MVC设计模式的轻量级web框架,由于SpringMVC是Spring框架的一部分,所以可以与Spring框架无缝集成。MyBatis是一个基于java的持久层框架,因为它的内部封装了JDBC,所以MyBatis可以通过注解或XML的方式进行配置,最后执行SQL语句并将结果映射成Java对象返回。本章节主要针对Spirng框架的学习和应用做详细的讲解,故本章主要研究内容如下:研究内容认知Spring概念、作用、特性Spring的IOC和依赖注入Spring的AOP实现模式学习目标1.了解Spring结构体系;2.理解Spring与IOC的概念和思想;3.认识SpringAOP(面像切面编程)。知识目标1.能够熟练使用Spring配置文件进行配置;2.能够熟练使用BeanFactory等方法实现Bean的装备;3.能够熟练使用基于XML方式的DI;4.能够熟练使用基于注解的DI;5.能够熟练使用自动代理;6.能够熟练使用Spring-Aop的切面;7.能够熟练使用Spring-AspectJ配置事务管理。技能目标1.培养学生的主动性、执行力;2.锻炼学生工作中胆大心细;3.锻炼学生逻辑思维能力;4.培养学生有探索创新精神。素养目标任务二Spring的IoC和依赖注入预备知识一、控制反转和依赖注入的概念控制反转(IoC):控制权的转移就是所谓的反转,指依赖对象的控制权从应用程序本身转移到外部容器,其实现策略一般有依赖查找和依赖注入两种。依赖查找(DL):是JavaEE中传统的依赖管理方式,首先需要注册依赖或服务,然后再通过容器提供的API查找依赖对象和资源。依赖查找依赖注入控制反转预备知识一、控制反转和依赖注入的概念依赖注入:依赖对象通过注入的方式进行创建,由容器负责组建和注入,即程序在运行时,若需要调用另一个对象进行协助时,不用重新创建被调用者代码,直接依赖外部容器创建后传递给程序,这是更为流行的IoC实现策略。实施准备
认识了Spring容器在框架中的作用及配置,掌握了Spring的基础配置及Jar包目录结构相关的知识点,通过下载安装jdk,配置环境变量,为本任务的开展做好前期准备工作。接下来,将开启Spring的IoC和依赖注入的相关学习任务。任务实施与分析创建javaproject步骤1.1步骤1.3步骤1.2导入核心jar包导入日志相关的jar包步骤1:导入核心jar包任务实施与分析步骤3.1创建Spring配置文件。步骤2.1:步骤3.2在applicationContext.xml配置文件中注册Service。步骤2.2步骤2:定义接口与实体类新建com.freamwork.service包,在com.freamwork.service包下定义ISomeService接口。创建SomeServiceImpl实现类实现ISomeService接口。步骤3:创建Spring配置文件任务实施与分析步骤4定义测试类在src下建立com.framework.test包,并创建MyTest.java类编写测试内容后执行。步骤4.1步骤5.1查看ApplicationContext与BeanFactory接口容器并掌握他们的区别步骤4.2创建SomeServiceImpl实现类实现ISomeService接口。步骤5.2配置注册Service。步骤5.3创建ISomeService接口的doSome方法。步骤5掌握bean的默认装配方式步骤5.4编写测试类。任务实施与分析步骤9:bean后处理器步骤9.1:创建ISomeService接口。步骤9.2:创建SomeServiceImpl实现类实现ISomeService接口。步骤9.3:创建MyBeanPostProcessor类实现BeanPostProcessor。步骤9.4:实现执行目标方法。步骤9.5:配置注册Bean后处理器。步骤9.6:编写测试类测试。步骤6:动态工厂Bean步骤6.1:将动态工厂Bean作为普通Bean使用。步骤6.2:使用Spring的动态工厂Bean。步骤7:静态工厂Bean步骤8:容器中bean的作用域步骤8.1:注册Service单例模式。步骤8.2:编写测试类并运行。任务实施与分析步骤10:了解并定制bean的生命始末步骤11:bean的生命周期步骤11.1:注册Service,为adao和bdao注入指aaa,bbb步骤11.2:SomeServiceImpl的实现步骤12:注入分类步骤12.1:设值注入步骤12.2:构造注入步骤13:对于域属性自动注入步骤14:使用SpEL注入步骤15:使用同类抽象Bean注入步骤16:使用异类抽象Bean注入步骤17:为应用指定多个Spring配置文件步骤18:定义Bean@Component注解步骤18.1:导入AOP的Jar包步骤18.2:更换配置文件头步骤18.3:在Spring配置文件中配置组件扫描器步骤18.4:在类上使用注解@Component任务实施与分析步骤21:按类型注入域属性@Autowired步骤19:Bean的作用域@Scope步骤20:基本类型属性注入@Value步骤22:按名称注入域属性@Autowired与@Qualifier步骤23:域属性注解@Resource拓展知识一、实例化Bean的三种方式实例化Bean的方式默认无参构造函数(推荐)静态工厂模式动态工厂模式<beanid="StudentBeanFactory"class="com.framework.di07.StudentBeanFactory"></bean><beanid="myStudent3"factory-bean=”StudentBeanFactory”factory-method=”constructorStudentBean”></bean><beanid="myStudent2"class="com.framework.di07.StudentBeanFactory"factory-method=”staticStudentBean”></bean><beanid="myStudent"class="com.framework.di07.Student"></bean>拓展知识二、IoC和DI常用的几个注解(一)IoC注解■@Component:属性有value,指定bean的id,如果不指定value属性,默认bean的id是当前类的类名,首字母小写。■@Controller:一般用于表现层;■@Service:用于业务层;■@Repository:用于持久层。(二)DI注解■@Autowired(默认按类型装配)相当于<propertyname=""ref="">。■@Resource(默认按名称装配)相当于<propertyname=""value="">。拓展知识三、Spring扩展接口BeanPostProcessor接口BeanFactoryPostProcessor接口InitializingBean接口FactoryBean接口思考与总结同学们通过以上操作,完成了对Spring的IoC和DI的学习,请同学们在此基础上,体会学习过程,进行思考并回答以下问题:Spring的作用是什么?Bean工厂创建Bean的三种方式都有哪些?请回答IoC最大的好处是什么?能力提升在上一节中,我们已经对电商网站项目引入了Spring框架开发的相关jar包,本节将对电商网站项目的商品类别业务进行实现,请同学们结合本节所学内容,继续完成电商网站项目的以下内容:能力提升1.创建商品类别的业务接口CategoryService,定义商品类别查询方法;2.创建商品类别的接口实现类CategoryServiceImpl,实现商品类别的查询方法,输出任意字符串;3.创建Spring的配置文件并进行Service注册;4.定义测试类,执行商品类别查询方法。1234任务训练1.练习在Spring配置文件中对Service类进行注册。2.创建商品查询的业务接口与业务实现类。3.验证商品业务表的查询结果,在控制台中输出查询结果。任务训练扫码进入课程网站,获取对应任务单,阅读任务目标,根据任务步骤,完成拓展任务并提交。《电商web云平台开发》感谢观看!模块一基础技能训练模块《电商web云平台开发》思维导图目录CONTENTS搭建电商平台Spring业务层搭建电商平台的Web项目—SpringMVC展示层搭建电商平台数据处理MyBatis项目123电商平台SSM三层框架整合4项目一
搭建电商平台Spring业务层项目背景SSM框架是Spring+SpringMVC+MyBatis三大框架的整合,是目前比较主流的JavaEE企业级框架,用于搭建各种大小型的企业级应用系统。Spring是一个控制反转(IoC)和面向切面(AOP)的容器框架,SpringMVC是一个基于MVC设计模式的轻量级web框架,MyBatis是一个基于java的持久层框架。SpringSpringMVCMyBatisSSM框架本章节主要针对Spirng框架的学习和应用做详细的讲解,故本章主要研究内容如下:研究内容认知Spring概念、作用、特性Spring的IOC和依赖注入Spring的AOP实现模式学习目标1.了解Spring结构体系;2.理解Spring与IoC的概念和思想;3.认识SpringAOP(面像切面编程)。知识目标1.能够熟练使用Spring配置文件进行配置;2.能够熟练使用BeanFactory等方法实现Bean的装备;3.能够熟练使用基于XML方式的DI、基于注解的DI;4.能够熟练使用自动代理、Spring-Aop的切面、Spring-AspectJ配置事务管理。技能目标1.培养学生的主动性、执行力;2.锻炼学生工作中胆大心细;3.锻炼学生逻辑思维能力;4.培养学生有探索创新精神。素养目标任务三Spring的AOP实现模式预备知识一、AOP简介ABC日志记录安全控制参数校验GFED事务处理统一异常处理缓存:实现缓存存取和清除统一发信、听通知预备知识二、AOP编程术语切面(Aspect)泛指交叉业务逻辑。实际就是对主业务逻辑的一种增强。织入(Weaving)是指将切面代码插入到目标对象的过程。连接点(JoinPoint)指可以被切面织入的方法。通常业务接口中的方法均为连接点。切入点(Pointcut)被标记为final的方法是不能作为连接点与切入点的。目标对象(Target)指将要被增强的对象,即包含主业务逻辑的类的对象。通知(Advice)是切面的一种实现,可以完成简单织入功能。顾问(Advisor)是切面的另一种实现是将通知包装为更复杂切面的装配器。预备知识三、了解AspectJCBA编译后利用ajc编译器向.class文件和.jar文件中织入增强代码编译时使用ajc编译器替代javac编译器,在源文件编译成.class文件时织入增强代码加载时利用aspectjweaver.jar,使用动态dialing的方式在类加载期间织入切面AspectJ不同阶段的实现方式:(一)AspectJ的简介预备知识三、了解AspectJ(二)AspectJ的切入点表达式04010302
[declaring-type-pattern]全限定性类名name-pattern(param-pattern)方法名(参数名)
execution[modifiers-pattern]访问权限类型
ret-type-pattern返回值类型注意:表达式中加[]的部分表示可省略部分,各部分间用空格分开。预备知识三、了解AspectJ(二)AspectJ的切入点表达式符号意义*0至多个任意字符..用在方法参数中,标识任意多个参数,用在包名后,表示当前包及其子包路径+用在类名后,标识当前类及其子类,用在接口后,标识当前接口及其实现类表达式中还可以使用以下符号举例execution(*set*(..))指定切入点为:任何一个以“set”开始的方法。预备知识四、了解Spring事务管理的接口(一)事务管理器接口是PlatformTransactionManager接口对象,其主要功能是实现完成事务的提交、回滚及获取事务的状态信息。预备知识四、了解Spring事务管理的接口(一)事务管理器接口DataSourceTransactionManager使用JDBC或iBatis进行持久化数据时使用HibernateTransactionManager使用Hibernate进行持久化数据时使用1.PlatformTransactionManager接口的两个实现类LOREM预备知识四、了解Spring事务管理的接口(一)事务管理器接口2.Spring的回滚方式Throwable类是Java语言中所有错误或异常的超类。Error是程序在运行过程中出现的无法处理的错误。预备知识四、了解Spring事务管理的接口(一)事务管理器接口在代码编写时要求必须捕获或抛出的异常,若不处理则无法通过编译。受查异常是RuntimeException类或其子类在运行时才出现的异常。运行时异常3.异常预备知识四、了解Spring事务管理的接口(二)事务定义接口231事务隔离级别事务定义接口TransactionDefinition中定义了事务描述相关的三类常量。事务传播行为事务默认超时时限预备知识四、了解Spring事务管理的接口(二)事务定义接口1.事务隔离级别DEFAULT采用DB默认的事务隔离级别READ_UNCOMMITTED读未提交。未解决任何并发问题READ_COMMITTED读已提交。解决脏读,存在不可重复读与幻读REPEATABLE_READ可重复读。解决脏读、不可重复读,存在幻读SERIALIZABLE串行化。不存在并发问题预备知识四、了解Spring事务管理的接口(二)事务定义接口2.事务传播行为REQUIRED:指定的方法必须在事务内执行。NOT_SUPPORTED:指定的方法不能在事务环境中执行。REQUIRES_NEW:总是新建一个事务。SUPPORTS:指定的方法支持当前事务。MANDATORY:指定的方法必须在当前事务内执行。NEVER:指定的方法不能在事务环境下执行。NESTED:指定的方法必须在事务内执行。预备知识四、了解Spring事务管理的接口(二)事务定义接口3.事务默认超时时限常量TIMEOUT_DEFAULT定义了事务底层默认的超时时限和不支持事务超时时限设置的none值。它定义了默认事务的超时时限。需要注意:由于影响事务超时时限发挥作用的条件比较多、超时的时间计算比较复杂,该值一般就使用默认值即可。实施准备我们认识了Spring的IoC和依赖注入相关的知识与开发技术之后,需进一步理解并掌握AOP切面的基础知识,包括AOP应用场景、AOP编程术语、AspectJ的切入点表达式、Spring事务管理的接口等,为搭建AOP开发环境和开发AOP实现模式提前做好准备。任务实施与分析步骤1.AOP开发环境搭建在原有Spring基本jar包的基础上再导入AOP联盟的规范(接口)包及Spring对其的实现包。步骤1.1:导入jar包步骤1.2:使用原Beans的约束<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/spring-beans.xsd">任务实施与分析步骤2:掌握通知adivce//主业务接口publicinterfaceISomeService{
//目标方法 voiddoFirst();
//目标方法 voiddoSecond();}//目标类publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){
System.out.println("执行doFirst()方法"); } @Override publicvoiddoSecond(){
System.out.println("执行doSecond()方法"); }}在目标方法执行之前先执行010302不改变目标方法执行的结果不改变目标方法的执行流程,前置通知代码不能阻止目标方法执行步骤2.1:学习前置通知MethodBeforeAdvice任务实施与分析步骤2:掌握通知adivce步骤2.1:学习前置通知MethodBeforeAdvice//前置通知publicclassMyMethodBeforeAdviceimplementsMethodBeforeAdvice{
//当前方法在目标方法执行之前执行
//method:目标方法 //args:目标方法的参数列表
//target:目标对象 @Override publicvoidbefore(Methodmethod,Object[]args,Objecttarget) throwsThrowable{
//对于目标方法的增强代码就应该写在这里
System.out.println("执行前置通知方法"); }}(1)定义前置通知任务实施与分析步骤2:掌握通知adivce步骤2.1:学习前置通知MethodBeforeAdvice<!--注册目标对象--><beanid="someService"class="com.framework.aop01.SomeServiceImpl"/><!--注册切面:通知--><beanid="myAdvice"class="com.framework.aop01.MyMethodBeforeAdvice"/><!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <!--<propertyname="targetName"value="someService"/>--> <!--指定目标对象--> <propertyname="target"ref="someService"/> <!--指定切面--> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)配置文件配置任务实施与分析步骤2:掌握通知adivce步骤2.1:学习前置通知MethodBeforeAdvice@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aop01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond();}(3)编写测试类进行测试任务实施与分析步骤2:掌握通知adivce步骤2.2:学习后置通知AfterReturningAdvice0301
02在目标方法执行之后执行不改变目标方法执行的结果不改变目标方法的执行流程,后置通知代码不能阻止目标方法执行IBAOTU.COMIBAOTU.COMIBAOTU.COM任务实施与分析步骤2:掌握通知adivce步骤2.2:学习后置通知AfterReturningAdvice@OverridepublicStringdoSecond(){
System.out.println("执行doSecond()方法"); return"abcde";}(1)修改业务接口与实现类任务实施与分析步骤2:掌握通知adivce步骤2.2:学习后置通知AfterReturningAdvice//后置通知:可以获取到目标方法的返回结果,但无法改变目标方法的结果publicclassMyAfterReturningAdviceimplementsAfterReturningAdvice{ //在目标方法执行之后执行 //returnValue:目标方法的返回值 @Override publicvoidafterReturning(ObjectreturnValue,Methodmethod, Object[]args,Objecttarget)throwsThrowable{ System.out.println("执行后置通知方法returnValue="+returnValue); if(returnValue!=null){ returnValue=((String)returnValue).toUpperCase(); System.out.println("修改过的结果returnValue="+returnValue); } }}(2)定义切面:通知任务实施与分析步骤2:掌握通知adivce步骤2.2:学习后置通知AfterReturningAdvice!--注册目标对象--><beanid="someService"class="com.framework.aop02.SomeServiceImpl"/><!--注册切面:通知--><beanid="myAdvice"class="com.framework.aop02.MyAfterReturningAdvice"/><!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件配置任务实施与分析步骤2:掌握通知adivce步骤2.3:环绕通知MethodInterceptor//环绕通知:可以修改目标方法的返回结果publicclassMyMethodInterceptorimplementsMethodInterceptor{ @Override publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
System.out.println("执行环绕通知:目标方法执行之前");
//执行目标方法
Objectresult=invocation.proceed();
System.out.println("执行环绕通知:目标方法执行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult; }}(1)定义环绕通知,即方法拦截器。需要注意的是,环绕通知需要添加MethodInterceptor包。任务实施与分析步骤2:掌握通知adivce步骤2.3:环绕通知MethodInterceptor<!--注册目标对象--><beanid="someService"class="com.framework.aop03.SomeServiceImpl"/><!--注册切面:通知--><beanid="myAdvice"class="com.framework.aop03.MyMethodInterceptor"/><!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)修改配置文件配置为环绕通知配置。任务实施与分析步骤2:掌握通知adivce步骤2.3:环绕通知MethodInterceptor@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aop03/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); Stringresult=service.doSecond(); System.out.println(result);}(3)执行测试类,返回结果被修改。任务实施与分析步骤2:掌握通知adivce步骤2.4:异常通知ThrowsAdviceafterThrowing()方法重载的四种形式常用的形式是:publicvoidafterThrowing(自定义的异常类e)。这里的参数“e”为与具体业务相关的用户自定义的异常类对象。容器会根据异常类型的不同,自动选择不同的该方法执行。任务实施与分析步骤2:掌握通知adivce步骤2.4:异常通知ThrowsAdvice@OverridepublicvoiddoFirst(){
System.out.println("执行doFirst()方法"+3/0);}//异常通知publicclassMyThrowsAdviceimplementsThrowsAdvice{ //当目标方法抛出与指定类型的异常具有is-a关系的异常时,执行当前方法 publicvoidafterThrowing(Exceptionex){ System.out.println("执行异常通知方法"); }}(1)创建异常方法(2)实现异常通知任务实施与分析步骤2:掌握通知adivce步骤2.4:异常通知ThrowsAdvice<!--注册目标对象--><beanid="someService"class="com.framework.aop04.SomeServiceImpl"/><!--注册切面:通知--><beanid="myAdvice"class="com.framework.aop04.MyThrowsAdvice"/><!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(3)修改配置文件为配置异常任务实施与分析步骤2:掌握通知adivce步骤2.4:异常通知ThrowsAdvice//创建容器对象,加载Spring配置文件Stringresource="com/framework/aop04/applicationContext.xml";ApplicationContextac=newClassPathXmlApplicationContext(resource);ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy");service.doFirst();(4)创建测试类执行异常方法。任务实施与分析步骤2:掌握通知adivce步骤2.5:学习无接口的CGLIB代理生成(1)配置代理,并去掉实现的接口类<!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/></bean>(2)在测试类加断点,查看使用的代理任务实施与分析步骤2:掌握通知adivce步骤2.6:学习有接口的CGLIB代理生成<!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvice"/> <!--<propertyname="optimize"value="true"/>--> <propertyname="proxyTargetClass"value="true"/></bean>在配置文件中增加一个proxyTargetClass属性设置,指定是否对类进行代理。任务实施与分析步骤3:掌握顾问AdvisorNameMatchMethodPointcutAdvisor名称匹配方法切入点顾问ARegexpMethodPointcutAdvisor正则表达式匹配方法切入点顾问BPointcutAdvisor是顾问的一种,可以指定具体的切入点。PointcutAdvisor接口有两个较为常用的实现类:任务实施与分析步骤3:掌握顾问Advisor步骤3.1:学习名称匹配方法切入点顾问<!--注册切面:顾问--><beanid="myAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/>
<!--指定切入点:这里匹配的对象是简单方法名--> <!--<propertyname="mappedName"value="doFirst"/>--> <!--<propertyname="mappedNames"value="doFirst,doSecond"/>--> <propertyname="mappedNames"value="*ir*"/></bean>
<!--生成代理对象--><beanid="serviceProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置文件,mappedName配置简单方法名,mappedNames配置多个数组方法名。任务实施与分析步骤3:掌握顾问Advisor步骤3.1:学习名称匹配方法切入点顾问@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aop07/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}(2)运行测试类,输出结果调用doFirst,doThird方法任务实施与分析步骤3:掌握顾问Advisor步骤3.2:学习正则表达式方法切入点顾问(1)修改配置文件,用正则表达式配置切入点。<!--注册切面:顾问--><beanid="myAdvisor"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <!--这里的正则表达式匹配的对象是全限定性方法名--> <!--<propertyname="pattern"value=".*doFirst"/>--> <!--<propertyname="patterns"value=".*doFirst,.*doSecond"/>--> <!--<propertyname="pattern"value=".*doFirst|.*doSecond"/>--> <propertyname="pattern"value=".*S.*"/></bean><!--生成代理对象--><beanid="serviceProxy"class="org.springframework.aop.framework.ProxyFactoryBean"> <propertyname="target"ref="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>任务实施与分析步骤3:掌握顾问Advisor步骤3.2:学习正则表达式方法切入点顾问(2)运行测试类测试。@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aop08/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("serviceProxy"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird();}任务实施与分析步骤4:掌握自动代理生成器,默认advisor、Bean名称默认advisor自动代理生成器Bean名称自动代理生成器
需要注意的是:自动代理生成器的Bean也没有id属性,客户类直接使用目标对象Bean的id。任务实施与分析步骤4:掌握自动代理生成器,默认advisor、Bean名称步骤4.1配置自动代理生成器<!--注册切面:顾问--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>
<!--注册自动代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>任务实施与分析步骤4:掌握自动代理生成器,默认advisor、Bean名称步骤4.2:Bean名称自动代理生成器注意:只需要修改配置文件中的代理生成配置,及测试类中的通过getBean()获取的Bean的id为目标类beanId即可。<!--注册切面:顾问--><beanid="myAdvisor"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doFirst"/></bean><beanid="myAdvisor2"class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <propertyname="advice"ref="myAdvice"/> <propertyname="mappedNames"value="doSecond"/></bean>
<!--注册自动代理生成器--><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <propertyname="beanNames"value="someService"/> <propertyname="interceptorNames"value="myAdvisor"/></bean>(1)修改配置自动代理,只调用MyAdvisor。任务实施与分析步骤4:掌握自动代理生成器,默认advisor、Bean名称步骤4.2:Bean名称自动代理生成器@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aop10/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("=================="); service.doSecond(); System.out.println("=================="); service.doThird(); System.out.println("-----------------------------"); ISomeServiceservice2=(ISomeService)ac.getBean("someService2"); service2.doFirst(); System.out.println("=================="); service2.doSecond(); System.out.println("=================="); service2.doThird();}(2)执行测试类测试,了解DefaultAdvisorAutoProxyCreator存在的三个问题。任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.1:搭建AspectJ的开发环境
AOP相关约束
Spring支持库解压目录中的子目录org.aspectj下的两个子包任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.2:AspectJ基于注解的AOP的实现//主业务接口publicinterfaceISomeService{
//目标方法 voiddoFirst();
//目标方法
StringdoSecond();
//目标方法 voiddoThird();}//目标类publicclassSomeServiceImplimplementsISomeService{ @Override publicvoiddoFirst(){
System.out.println("执行doFirst()方法"); } @Override publicStringdoSecond(){
System.out.println("执行doSecond()方法"); return"abcde"; } @Override publicvoiddoThird(){
System.out.println("执行doThird()方法"+3/0);
System.out.println("执行doThird()方法"); }}(1)定义业务接口与实现类。任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.2:AspectJ基于注解的AOP的实现@Aspect//表示当前类为切面publicclassMyAspect{ @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("执行前置通知方法");}(2)定义切面Pojo类,在定义的Pojo类上添加@Aspect注解任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.2:AspectJ基于注解的AOP的实现@Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(){ System.out.println("执行前置通知方法"); } @Before("execution(**..ISomeService.doFirst(..))") publicvoidmyBefore(JoinPointjp){ System.out.println("执行前置通知方法jp="+jp); } @AfterReturning("execution(**..ISomeService.doSecond(..))") publicvoidmyAfterReturning(){ System.out.println("执行后置通知方法");}(3)在Pojo类的普通方法上上添加通知注解任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.2:AspectJ基于注解的AOP的实现<!--注册切面--> <beanid="myAspect"class="com.framework.aspectj01.MyAspect"/> <!--注册目标对象--> <beanid="someService"class="com.framework.aspectj01.SomeServiceImpl"/> <!--注册AspectJ的自动代理--><aop:aspectj-autoproxy/>}(4)编写配置文件,注册目标对象与Pojo切面类,注册AspectJ的自动代理。其工作原理是:<aop:aspectj-autoproxy/>通过扫描找到@Aspect定义的切面类,再由切面类根据切入点找到目标类的目标方法,再由通知类型找到切入的时间点。任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.2:AspectJ基于注解的AOP的实现@Testpublicvoidtest01(){ //创建容器对象,加载Spring配置文件 Stringresource="com/framework/aspectj01/applicationContext.xml"; ApplicationContextac=newClassPathXmlApplicationContext(resource); ISomeServiceservice=(ISomeService)ac.getBean("someService"); service.doFirst(); System.out.println("----------------------------"); service.doSecond(); System.out.println("----------------------------"); service.doThird();}(5)编写测试类进行测试。任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.3:测试类中使用的目标对象及注解知识点。(1)@Before前置通知-增强方法有JoinPoint参数@AfterReturning后置通知-注解有returning属性@Before("execution(**..ISomeService.doFirst(..))")publicvoidmyBefore(){
System.out.println("执行前置通知方法");}
@AfterReturning(value="execution(**..ISomeService.doSecond(..))",returning="result") publicvoidmyAfterReturning(Objectresult){ System.out.println("执行后置通知方法result="+result);}(2)任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.3:测试类中使用的目标对象及注解知识点。@Around("execution(**..ISomeService.doSecond(..))")publicObjectmyAround(ProceedingJoinPointpjp)throwsThrowable{
System.out.println("执行环绕通知方法,目标方法执行之前");
//执行目标方法
Objectresult=pjp.proceed();
System.out.println("执行环绕通知方法,目标方法执行之后"); if(result!=null){ result=((String)result).toUpperCase(); } returnresult;}(3)@Around环绕通知-增强方法有ProceedingJoinPoint参数任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.3:测试类中使用的目标对象及注解知识点。(4)@AfterThrowing异常通知-注解中有throwing属性@AfterThrowing("execution(**..ISomeService.doThird(..))")publicvoidmyAfterThrowing(){ System.out.println("执行异常通知方法");}(5)@After最终通知@After("doThirdPointcut()")publicvoidmyAfter(){ System.out.println("执行最终通知方法");}任务实施与分析步骤5:掌握AspectJ对AOP的实现步骤5.3:测试类中使用的目标对象及注解知识点。//定义了一个切入点,叫doThirdPointcut()@Pointcut("execution(**..ISomeService.doThird(..))")publicvoiddoThirdPointcu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 胃肠镜科普知识
- 2025年成人高等学校招生考试《语文》高频考点速记题库:作文素材积累与提升试题
- 2025年医保知识考试题库及答案:医保政策调整对医疗纠纷预防的影响试题
- 2025年ACCA国际注册会计师考试真题卷:国际财务报告准则解读与应用高频考点解析
- 2025年成人高考《语文》语言表达与运用题库:作文审题与素材选择技巧试题
- 2025年美容师初级技能水平测试卷:美容师美容院市场调研与竞争分析试题
- 育婴大赛模拟题(附答案)
- 工业分析与检验模拟练习题+答案
- 卫生学模拟考试题(附参考答案)
- 手机拍摄培训课程
- 执业医师注册、变更申请表
- panasonic样本搜索光盘
- 项目申报表双语教学示范课程建设项目
- 工作交接表excel模板
- 朗读技巧与方法指导
- 《中小学美术教学论》第一章 美术教学论及其研究的对象
- PFMEA模板完整版文档
- 《茯苓功效研究(论文)》
- GB/T 27476.2-2014检测实验室安全第2部分:电气因素
- GA 1010-2012看守所床具
- 清洗消毒灭菌技术操作规范 课件
评论
0/150
提交评论