02、中高级2018spring源码解析springmvc执行流程分析01springioc与aop spring核心技术_第1页
02、中高级2018spring源码解析springmvc执行流程分析01springioc与aop spring核心技术_第2页
02、中高级2018spring源码解析springmvc执行流程分析01springioc与aop spring核心技术_第3页
02、中高级2018spring源码解析springmvc执行流程分析01springioc与aop spring核心技术_第4页
02、中高级2018spring源码解析springmvc执行流程分析01springioc与aop spring核心技术_第5页
免费预览已结束,剩余20页可下载查看

付费下载

下载本文档

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

文档简介

1、Spring技术Spring 的概述Spring 框架,可以解决对象创建以及对象之间依赖关系的一种框架。且可以和其他框架一起使用;Spring 与 Struts,Spring 与 hibernate (起到整合(粘合)作用的一个框架)Spring 提供了一站式解决方案:1)2)spring 的功能: IOC 容器, 解决对象创建及依赖关系Spring CoreSpring WebSpring 对 web 模块的支持。- 可以与 struts 整合,让 struts 的 action 创建交给 spring- spring mvc 模式Spring 对 jdbc 操作的支持 【JdbcTempl

2、ate 模板工具类】spring 对 orm 的支持:3)4)SpringSpring ORM 既可以与 hibernate 整合,【ses】 也可以使用 spring 的对 hibernate 操作的封装P切面编程spring 对 javaEE 其他模块的支持5)Sprin 6)SpringEESpring 的环境搭建spring 环境需要 maven 坐标4.0.0com.itmayieduitmayiedu-spring0.0.1-SNAPSHOT.springframeworkspring-core3.0.6.RELEASE.springframework需要交给 Spring 管理注

3、入类public claserEntity private String name; privateeger age; public String getName() return name;public void setName(String name) = name;spring-context3.0.6.RELEASE.springframeworksprinp3.0.6.RELEASE.springframeworkspring-orm3.0.6.RELEASE.aspectjaspectjrt1.6.1aspectjaspectjweaver1.5.3cglibcglib2.1_2s

4、pring 配置文件测试类public class SpringTest public s ic void main(String args) ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( applicationContext.xml);UserEntity userEntity = (UserEntity) applicationContext.getBean(userEntity); System.out.pr ln(userEntity);publiceger

5、 getAge() return age;public void setAge( eger age) this.age = age;验证问题,spring bean id 重复会怎么办?Spring 加载过程spring 是单例还是多例?spring 作用域singleton 作用域Prototyperequestrequest 表示该针对每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTPrequest 内有效,配置实例:request、ses、global ses使用的时候首先要在初始化 web 的 web.xml 中做如下配置:prototype 作用域

6、部署的 bean,每一次请求(将其注入到另一个 bean 中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实例,相当与一个 new 的操作,对于 prototype 作用域的 bean,有一点非常重要,那就是 Spring 不能对一个 prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个 prototype 实例后,将它交给客户端,随后就对该 prototype 实例 了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对 prototype 而言,任何配置好的析构生命周期回调方法都将不会被调用。 清除 p

7、rototype 作用域的对象并 任何 prototype bean 所持有的昂贵资源,都是客户端代码的职责。(让 Spring 容器 被 singleton 作用域 bean 占用资源的一种可行方式是,通过使用 bean 的后置处理器,该处理器持有要被清除的 bean 的引用。)当一个bean 的作用域设置为singleton, 那么Spring IOC 容器中只会存在一个共享的 bean实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean 的同一实例。换言之,当把 一个 bean 定义设置为 singleton 作用域时,Spring IOC 容

8、器只会创建该 bean 定义的唯一实例。这个单一实例会被到单例缓存(singleton cache)中,并且所有针对该 bean 的后续请求和都 将返回被缓存的对象实例,这里要注意的是 singleton 作用域和 GOF 设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader 中 只有一个 class 存在,而这里的 singleton 则表示一个容器对应一个 bean,也就是说当一个bean 被标识为singleton 时 候,spring 的IOC 容器中只会存在一个该bean。sesses作用域表示该针对每一次 HTTP 请求都会产生一个新的 bean,同时该 bea

9、n 仅在当前HTTP ses内有效SpringIOC 容器容器创建对象:依赖注入:Spring 中,如何给对象的属性赋值? 【DI, 依赖注入】创建对象, 有几种方式:调用无参数构造器带参数构造器工厂创建对象工厂类,静态方法创建对象 工厂类,非静态方法创建对象SpringIOC 容器,是 spring内容。作用: 创建对象 & 处理对象的依赖关系通过构造函数通过 set 方法给属性注入值p 名称空间注解#(常用)Set 方法注入值思考下,为什么需要生成 set 方法才能赋值?# p 名称空间注入属性值 (优化)!-给对象属性注入值:# p 名称空间给对象的属性注入值# 注解版本使用注解方式可以

10、简化 spring 的 IOC 容器的配置!使用注解步骤:先引入 context 名称空间xmlns:context=开启注解扫描通过注解的方式,把对象加入 ioc 容器。创建对象以及处理对象依赖关系,相关的注解:Component指定把一个对象加入 IOC 容器itory作用同Component; 在持久层使用Re作用同Component; 在业务逻辑层使用ServiceController作用同Component; 在控制层使用属性注入Resource(spring3.0以上版本才支持)-!- 传统的注入:-总结:使用注解,可以简化配置,且可以把对象加入 IOC 容器,及处理依赖关系(DI

11、)注解可以和 XML 配置一起使用。Resource 与Autowired 区别1、Autowired 与Resource 都可以用来装配bean. 都可以写在字段上,或写在setter 方法上。 2、Autowired 默认按类型装配(这个注解是属业 spring 的),默认情况下必须要求依赖对象必须存在, 如果要允许 null 值, 可以设置它的 required 属性为 false ,如: Autowired(required=false) ,如果如下:想使用名称装配可以结合Qualifier 注解进行使用,Java 代码模式概述(Proxy)是一种设计模式, 提供了对目标对象另外的方式

12、;即通过目标对象。 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。)-经纪人用户举例:(目标()我喜欢用 Resource 注解在字段上,且这个注解是属于 J2EE 的,减少了与 spring 的耦合。最重要的这样代码看起就比较优雅。3、Resource(这个注解属于 J2EE 的),默认名称进行装配,名称可以通过 name属性进行指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在 setter 方法上默认取属性名进行装配。当找不到与名称匹配的 bean 时才按照类型进行装配。但是需要注意的是,如果 name

13、 属性一旦指定,就只会按照名称进行装配。Java 代码Resource(name=base)private Basebase;Autowired() Qualifier(base)private Basebase;模式的关键点:对象与目标对象。静态静态1)2),对象,要实现与目标对象一样的接口;举例:保存用户(模拟),直接保存Proxy, 给保存方法添加事务处理总结静态:可以做到在不修改目标对象的功能前提下,对目标对象功能扩展。缺点:- 因为对象,需要与目标对象实现一样的接口。所以会有很多类,类太多。-一旦接口增加方法,目标对象与对象都要。解决:工厂?可以使用动态。动态动态,1)2)对象,不需

14、要实现接口;对象的生成,是利用 JDKAPI, 动态的在内存中构建对象(需要指定创建对象/目标对象 实现的接口的类型;);3)动态, JDK, 接口;JDK 中生成|- Proxy对象的 API:sic Object newProxyInstance(ClassLoader loader,指定当前目标对象使用类加载器目标对象实现的接口的类型事件处理器Classerfa,InvocationHandler h)动态总结:对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态!(class$Proxy0implements Iuser)思考:有一个目标对象,想要功能扩展,但目标对象没有实现

15、接口,怎样功能扩展?ClassUser/ 子类的方式ClasbclassextendsUser以子类的方式实现(cglib)Cglib,也叫做子类。在内存中构建一个子类对象从而实现对目标对象功能的扩展。CglibJDK 的动态如果想有一个限制,就是使用动态的对象必须实现一个或多个接口。没有实现接口的类,就可以使用 CGLIB 实现。CGLIB 是一个强大的高性能的代码生成包,它可以在运行期扩展Java 类与实现Java接口。它广泛的被许多 AOP 的框架使用,例如 Spring AOP 和 dynaop,为他们提供方法的erception()。CGLIB 包的底层是通过使用一个小而快的字节码处

16、理框架 ASM,来转换字节码并生成新的类。不鼓励直接使用 ASM,因为它要求你必须对 JVM件的格式和指令集都很熟悉。结构包括 class 文Cglib 子类:1) 需要引入cglib jar 文件, 但是 spring 的引入 spring-core-3.2.5.jar 即可。包中已经包括了 cglib 功能,所以直接引入功能包后,就可以在内存中动态构建子类的类不能为 final, 否则报错。目标对象的方法如果为 final/sic, 那么就不会被的业务方法。,即不会执行目标对象额外在 Spring 的 AOP 编程中,如果加入容器的目标对象有实现接口,用 JDK;如果目标对象没有实现接口,

17、用 Cglib;手动实现 AOP 编程AOP 面向切面的编程,AOP 可以实现“业务代码”与“关注点代码”分离/ 保存一个用户public void add(User user) Sesses= null; Tran ion trans = null; try ses= HibernateSesFactoryUtils.getSes();/ 【关注点代码】trans = ses.begranion();/ 【关注点代码】ses.save(user);/业务代码mit();/【关注点代码】 catch (Exception e) e.prStackTrace(); if(trans != nul

18、l)trans.rollback();/.【关注点代码】 finallyHibernateSesFactoryUtils.closeSes(ses);/.【关注点代码】分析总结:关注点代码,就是指重复执行的代码。业务代码与关注点代码分离,好处?- 关注点代码写一次即可;-开发者只需要关注业务;-运行时期,执行业务代码时候动态植入关注点代码;【】如何分离?过程式/对象式/模式分离AOP 编程概述:AOP: Aspect Oriented Programming 面向切面编程。面向切面编程(也叫面向方面):Aspect Oriented ProgramminP),是目前开发中的一个热点。利用 AO

19、P 可以对业务逻辑的各个部分进行,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP 是 OOP 的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。主要的功能是:日志,性能统计,安全控制,事务处理,异常处理等等。主要的意图是:将日志,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,希望可以将它们独立到非指导业务逻辑的方法中,进而改 变这些行为的时候不影响业务逻辑的代码。可以通过预编译方式和运行期动态实现在不修改源代码的情况下给程序动态添加功能的一种技术。AOP

20、 实际是 GoF 设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。假设把应用程序想成一个结构的话,OOP 的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),而 AOP 的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志个有效补充。等等)。由此可见,AOP 是 OOP 的一注意:AOP 不是一种技术,实际上是编程AOP 的实现。凡是符合 AOP的技术,都可以看成是Aop, aspect object programming面向切面编程功能: 让关注点代码与业务代码分离!关注点,重复代码就

21、叫做关注点;切面,关注点形成的类,就叫切面(类)!面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码”。切入点,执行目标对象方法,动态植入切面代码。可以通过切入点表达式,指定切面类代码。哪些类的哪些方法; 给指定的类在运行的时候植入注解方式实现 AOP 编程开启事物注解权限4) 使用注解Aspect指定一个类为切面类Pocut(execution(* com.itmayiedu.service.UserService.add(.)指定切入点表达式前置通知: 目标方法之前执行后置通知:目标方法之后执行(始终执行)返回后通知: 执行方法结束前执行(

22、异常不执行)异常通知:出现异常时候执行环绕通知: 环绕目标方法执行Before(po Cut_()After(po Cut_()AfterReturning(po Cut_() AfterThrowing(po Cut_() Around(po Cut_()Component Aspectpublic class Aop Before(execution(* com.itmayiedu.service.UserService.add(.) public void begin() System.out.prln(前置通知);After(execution(* com.itmayiedu.serv

23、ice.UserService.add(.) public void commit() System.out.prln(后置通知);AfterReturning(execution(* com.itmayiedu.service.UserService.add(.) public void afterReturning() System.out.prln(运行通知);XML 方式实现 AOP 编程Xml 实现 aop 编程:引入 jar 文件 【aop 相关 jar, 4 个】引入 aop 名称空间aop 配置配置切面类 (重复执行代码形成的类)aop 配置哪些方法 /到方法后应用通知代码Af

24、terThrowing(execution(* com.itmayiedu.service.UserService.add(.) public void afterThrowing() System.out.prln(异常通知);Around(execution(* com.itmayiedu.service.UserService.add(.)public void around(ProceedingJoinPoproceedingJoinPo) throws Throwable System.out.prln(我是环绕通知-前);proceedingJoinPceed(); Sy

25、stem.out.prln(我是环绕通知-后);事物的概述 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户 A 和用户 B 两者的钱加起来一共是 5000,那么不管 A和B 之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。性(Isolation)性是

26、当多个用户并发数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互。即要达到这么一种效果:对于任意两个并发的事务 T1 和 T2,在事务 T1 看来,T2 要么在 T1 开始之前就已经结束,要么在 T1 结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。关于事务的性数据库提供了多种级别,稍后会介绍到。 持久性(Durability)持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。性在使用 JDBC 操作数据库时,在提交事务方法后,提示用户事务操作程

27、序执行完成直到看到提示后,就可以认定事务以及正确提交,即使例如完成,当这时候数据库出现了问题,也必须要将的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的错误。程序中事务控制环境准备用户C- Service-一个业务的成功: 调用的 service 是执行成功的,意味着 service 中调用的所有的是执行成功的。事务应该在 Service 层控制。没有应用事务的代码:模拟:在 service 中调用 2 次, 希望其中一个执行失败,整个操作要回滚。开发步骤:环境准备数据库、表/entity/1./service的实现用 JdbcTemplate对象创

28、建都有 Spring 容器完成程序中事务控制事务控制概述编程式事务控制自己手动控制事务,就叫做编程式事务控制。Jdbc 代码:mite(false);/ 设置手动控制事务Hibernate 代码:/ 开启一个事务Ses.begranion();【细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制】(比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)式事务控制Spring 提供了对事务的管理, 这个就明式事务管理。Spring 提供了对事务控制的实现。用户如果想用 Spring 的式事务管理,只需要在配置文件中配置即可; 不想使用时直接移除配置。这个实现了对事务控制的

29、最大程度的解耦。Spring式事务管理,实现就是基于 Aop。【粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务。】(因为 aop的是方法。)Spring式事务管理器类:Jdbc 技术:DataSourceTranHibernate 技术:HibernateTranionManagerionManager编程事物管理手动管理事物1. User.javaReitorypublic claserAutowiredprivate JdbcTemplate jdbcTemplate;public void add(String name,eger age) String sql

30、 = INSERTO users(NAME, age) VALUES(?,?); update = jdbcTemplate.update(sql, name, age);System.out.prln(updateResult: + update);2. UserServiceServicepublic claserService Autowiredprivate Useruser; public void add() user.add(lisi, 18); i=1/0;/可能会发生异常user.add(yushengjun, 19);3. App 测试类public claserTest

31、public sic void main(String args) ClassPathXmlApplicationContext applicationContext = newClassPathXmlApplicationContext(bean.xml);UserService userService = (UserService) applicationContext.getBean(userService); userService.add();4.手动事物管理类Componentpublic class TranionUtils / 事物管理器Autowiredprivate Dat

32、aSourceTranionManager dataSourceTranionManager;public TranionSus begin() TranionSus tranion = dataSourceTranionManager.getTranion(new DefaultTranionDefinition();return tranion;public void commit(TranionSus tranion) dataSourceTranmit(tranion);public void rollback(TranionSus tranion) dataSourceTranion

33、Manager.rollback(tranion);5. bean.xml (Spring 务管理配置)式事务管理XML 方式实现1. User.javaReitorypublic claser Autowiredprivate JdbcTemplate jdbcTemplate;public void add(String name,eger age) String sql = INSERTO users(NAME, age) VALUES(?,?); update = jdbcTemplate.update(sql, name, age);System.out.prln(updateRes

34、ult: + update);2. UserServiceServicepublic claserService Autowiredprivate Useruser; public void add() user.add(lisi, 18); i=1/0;/可能会发生异常user.add(yushengjun, 19);3. App 测试类public claserTest public sic void main(String args) ClassPathXmlApplicationContext applicationContext = newClassPathXmlApplicatio

35、nContext(bean.xml);UserService userService = (UserService) applicationContext.getBean(userService); userService.add();4.手动事物管理类Componentpublic class TranionUtils / 事物管理器Autowiredprivate DataSourceTranionManager dataSourceTranionManager;public TranionSus begin() TranionSus tranion = dataSourceTranion

36、Manager.getTranion(new DefaultTranionDefinition();return tranion;public void commit(TranionSus tranion) dataSourceTranmit(tranion);public void rollback(TranionSus tranion) dataSourceTranionManager.rollback(tranion);5. bean.xml (Spring 务管理配置)使用事物注意事项事物是程序运行如果没有错误,会自动提交事物,如果程序运行发生异常,则会自动回滚。如果使用了 try 捕获异常时.一定要在 catch 里面手动回滚。事物手动回滚代码TranionAspectSupport.currentTranionSus().setRollbackOnly();注解方式实现使用注解实现 Spring 的步骤:式事务管理,更加简单!必须引入 Aop 相关的 jar 文件bean.xml 中指定注解方式实现式事务管理以及应用的事务管理器类3)在需要添加事务控制的地方,写上: TranionalTranional 注解:应用事务的注解定义到方法上:定义到类上:定义到父类

温馨提示

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

评论

0/150

提交评论