版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章初识SSM框架第1章初识SSM框架.ppt第2章Spring入门.ppt第3章Spring基本用法.ppt第4章面向切面编程.ppt第5章事务管理.ppt第6章MyBatis入门.ppt第7章基于MyBatis的增删改查操作.ppt第8章MyBatis的动态SQL语句.ppt第9章使用MyBatis动态代理技术实现DAO接口.ppt第10章MyBatis与Spring的整合.ppt第11章SpringWebMVC入门.ppt第12章注解式控制器开发.ppt第13章数据校验.ppt第14章拦截器.ppt第15章SpringMVC对Ajax的支持.ppt第16章文件上传下载.ppt第17章SSM整合.ppt第18章医疗信息系统.ppt本章目标了解SSM框架及三个框架分工了解Spring框架概念及IoC、AOP概念了解Hibernate框架概念了解MyBatis框架概念了解Hibernate框架和MyBatis框架的区别了解SpringMVC框架概念2本章教学内容SSM框架及三个框架分工Spring框架概念及IoC、AOP概念Hibernate框架概念MyBatis框架概念Hibernate框架和MyBatis框架的区别SpringMVC框架概念3SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。是目前JAVA领域使用非常广泛也非常稳定的开源Web框架。SSM框架是标准的MVC(Model-View-Controller)模式,将整个系统划分为表现层,控制器Controller层,业务逻辑Service层,数据访问Dao层四层。SpringMVC、Spring、MyBatis三个框架各有分工。SpringMVC框架负责请求的转发和视图管理,Spring框架实现业务对象管理,MyBatis框架则作为数据对象的持久化引擎完成数据持久化。4SSM框架及三个框架分工Spring框架Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,Spring一个最大的目的就是使JavaEE(JavaPlatformEnterpriseEditionJava平台企业版)开发更加容易,它是为了解决企业应用开发的复杂性而创建的。Spring是一个轻量级的控制反转IoC(InversionofControl)和面向切面AOP(AspectOrientedProgramming)的容器框架。5MyBatis框架
将数据持久化到数据库中常用的框架有Hibernate、MyBatis。下面分别介绍一下。
1.Hibernate简介
Hibernate是当前最流行的ORM(ObjectRelationalMapping对象关系映射)框架之一,对JDBC(JavaDatabaseConnectivityJava数据库连接)提供了较为完整的封装。Hibernate的O/RMapping实现了POJO(PlainOrdinaryJavaObject普通的Java对象)和数据库表之间的映射,以及SQL(StructuredQueryLanguage结构化查询语言)的自动生成和执行。
6MyBatis框架2.MyBatis简介
MyBatis是一个基于Java的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(PlainOrdinaryJavaObjects,普通的Java对象)映射成数据库中的记录。7MyBatis框架3.Hibernate和MyBatis的区别(1)开发速度
Hibernate的真正掌握要比Mybatis困难,Hibernate比Mybatis更加重量级一些。Mybatis需要我们手动编写SQL语句,回归最原始的方式,所以可以按需求指定查询的字段,提高程序的查询效率。
Hibernate也可以自己写SQL语句来指定需要查询的字段,但这样破坏了Hibernate封装以及简洁性。8MyBatis框架3.Hibernate和MyBatis的区别(2)数据移植性Mybatis由于所有SQL语句都是依赖数据库书写的,所以扩展性,迁移性比较差。Hibernate与数据库具体的关联都在XML(ExtensibleMarkupLanguage可扩展标记语言)中,所以HQL(HibernateQueryLanguageHibernate查询语言)对具体是用什么数据库并不是很关心。9SpringMVC框架
SpringMVC属于SpringFrameWork的后续产品,是一个强大灵活的Web框架。SpringMVC也是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发。10本章总结了解SSM框架及三个框架分工了解Spring框架概念及IoC、AOP概念了解Hibernate框架概念了解MyBatis框架概念了解Hibernate框架和MyBatis框架的区别了解SpringMVC框架概念11谢谢!第二章Spring入门
本章内容一、Spring框架概述二、Spring体系结构三、Spring特征四、SpringIoC/DI概念五、SpringIoC容器的使用方法IOC容器的工作原理BeanFactory接口及常用实现类XmlBeanFactoryApplicationContext接口及常用实现类BeanFactory和ApplicationContext的区别六、Spring框架入门案例七、Spring5新特性14本章目标了解Spring框架了解Spring体系结构了解Spring特征了解SpringIoC/DI概念掌握SpringIoC容器的使用方法掌握Spring框架入门案例理解Spring5的新特性15一、Spring框架概述
二、Spring体系结构三、Spring特征四、SpringIoC/DI概念五、SpringIoC容器的使用方法六、Spring框架入门案例七、Spring5的新特性
16本章目录Spring框架概述Spring简介Spring是一个开源框架,它由RodJohnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。目的:解决企业应用开发的复杂性。功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能。范围:任何Java应用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。6Spring的发展历程Spring版本发展历史发布时间发布版本2003年Spring0.92004年Spring1.02006年Spring2.0FinalReleased2007年Spring2.52011年Spring3.1GArelease2013年Spring4.02014年Spring4.1.3released2015年Spring4.2、4.32016年Spring4.3GA2017年Spring5.x7Spring体系结构19Spring特征轻量级
从大小和系统开支上说Spring都是轻量级的,而且Spring是非侵入式的:基于Spring开发的系统一般不依赖于Spring的类。反向控制Spring提倡反向控制实现松耦合。使用IOC,对象是被动接受依赖类而不是自动查找,实例化类的时候主动把他要的对象给他。面向切面
Spring对面向切面编程提供了强大的支持,通过把业务逻辑从系统服务中分离了出来,系统对象只做他们该做的事情,而不关心其他。9Spring的特征Spring即是一个容器又是一个框架。容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。框架Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等,使用Spring框架,开发人员可以专注于业务逻辑开发,这个意义上讲它是一个框架。10Spring特征方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。方便集成各种优秀框架
Spring可以集成各种优秀的开源框架,如Struts,Hibernate、Hessian、Quartz等。对声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,这样我们可以专注于业务逻辑开发,提高开发效率和质量。11SpringIoC/DI概述IoC(InversionofControl,控制反转):IoC是Spring的核心概念,控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
当某个JAVA实例(调用者)需要另一个JAVA实例(被调用者)时,在传统的程序设计过程中,通常有由调用者来创建被调用者的实例,而控制反转则转移了控制权,既把调用者的创建转移到了外部容器(Spring容器)。12IOC和DI概念DependencyInjection(依赖注入):IoC也是一种设计模式,有DependencyInjection(依赖注入)和ServiceLocator(服务定位器)两种实现方式,Spring框架采用依赖注入实现IoC。依赖注入是在运行期,由外部容器动态地将依赖对象注入到组件中。即通过使用Spring框架,开发人员将不必在自己的代码中维护对象之间的依赖关系,只需在配置文件中进行设定,Spring会自动依据配置信息来维护对象之间的依赖关系。注:Spring框架结合简单的JavaBean实现了以前只有EJB才能完成的功能。13SpringIoC容器Spring的IoC容器概述Spring的IoC容器实现了控制反转,即在开发过程中,开发人员不需要关心容器是怎样的,也不需要调用容器的任何API。容器会自动进行被管理对象的初始化及对象之间依赖关系的维护。在Spring中,最重要的是两个包,提供了IoC容器的基本功能
org.springframework.beans包
org.springframework.context包14SpringIoC容器Ioc容器工作原理org.springframework.beans.factory.BeanFactory是Spring容器(也叫Spring
IoC容器)的实际代表者,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。这里的Bean是一种广泛意义上的JavaBean对象,包括了任何由Spring的IoC容器进行初始化、装配以及其他方面管理的Java对象。它既可是开发人员自己开发的应用对象,也可是Spring或其他组件所提供的Java对象。从上图可以看到,我们可以在SpringIoC容器中配置应用程序中所需要的信息,如
POJO业务类,这些业务类(Bean)之间相互依赖。Spring容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。整个IoC容器就是一个大的工厂,为应用程
序提供bean。26SpringIoC容器BeanFactory接口提供了多个实现类来供开发人员使用,最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory类,是通过XML格式的文件来配置Bean对象以维护对象之间的关系。使用XML格式的配置文件时,配置文件的最顶层是<beans>元素,其内部包含一个或多个<bean/>元素,其中每一个<bean/>元素定义了一个bean的实例化信息以及与其他bean之间的关系在初始化容器时,需要一个用于访问配置文件的org.springframework.core.io.Resource对象作为构建容器对象的参数。Resource对象本身是一个接口,目的是为提供一个使用不同方式访问资源文件的统一方法,支持的方式包括文件系统、二进制数组、二进制流、URL、类路径等
由于访问配置文件的方式不同,就决定可使用不同方式来初始化容器对象,直接通过文件系统访问配置文件的初始化代码如下:Resourcers=newFileSystemResource(“/hw/beans-config.xml”);
BeanFactoryfactory=newXmlBeanFactory(rs);
实际中更多是通过类路径的方式来访问配置文件,将配置文件放在CLASSPATH所指定的目录中,初始化代码如下:Resourcers=newClassPathResource(“beans-config.xml”);
BeanFactoryfactory=newXmlBeanFactory(rs);
注:在实际的Web应用开发中,不需开发人员自己进行容器的初始化,生成BeanFactory对象,只需在web.xml文件中进行简单配置既可。16SpringIoC容器BeanFactory接口包含的几个基本方法:BooleancontainsBean(String
name)
判断Spring容器是否包含id为name的Bean实例ClassgetType(String
name)
返回容器中指定Bean实例的类型ObjectgetBean(String
name)
返回以给定名字注册的bean实例。根据bean的配置情况,如果为singleton模式将返回一个共享的实例,否则将返回一个新建的实例。如果没有找到指定的bean,该方法可能会抛出BeansException异常(实际上将抛出NoSuchBeanDefinitionException异常),在对bean进行实例化和预处理时也可能抛出异常17SpringIoC容器ApplicationContext接口:大部分时候,我们都不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,该容器被称为Spring上下文。ApplicationContext是BeanFactory子接口,它增强了BeanFactory的功能。ApplicationContext实现类描述org.springframework.context.support.ClassPathXMLApplicationContext从类路径中的XML文件载入上下文定义信息org.springframework.context.support.FileSystemXmlApplicationContext从文件系统中的XML文件载入上下文定义信息表ApplicationContext实现类18SpringIoC容器ApplicationContext接口常用的实现类:ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径文件,例:
ApplicationContextcontext=newClassPathXmlApplicationContext(“beans- config.xml”);FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文信息,例:
ApplicationContextcontext=new FileSystemXmlApplicationContext(“d:/sp/beans-config.xml”);
区别:FileSystemXmlApplicationContext只能在指定的路径寻找文件beans-config.xml;ClassPathXmlApplicationContext可在整个类路径中寻找。XmlWebApplicationContext:从web系统中的XML文件载入载入上下文定义信息19SpringIoC容器BeanFactory与ApplicationContext的区别ApplicationContext与BeanFactory都是Spring容器,职责都有实例化、定位、配置应用程序中的对象及建立这些对象间的依赖,但ApplicationContext提供更多功能:ApplicationContext继承MessageResource接口,因此提供国际化支持。资源访问,比如URL和文件。事件机制,可向注册为监听器的Bean发送事件。载入多个配置文件。以声明式的方式启动、并创建Spring容器。关于单实例Bean如何被载入:Bean工厂延迟载入所有的Bean,直到getBean()方法被调用时Bean才被创建;spring上下文会在上下文启动后预载入所有的单实例Bean,确保使用时已准备好。20Spring框架入门案例准备工作:Spring的下载和安装(使用spring5.0.2版本)请从Spring官网中下载Spring开发包spring-framework-5.0.2.RELEASE-dist.zip,解压缩下载commons-logging.jar包dist文件夹下包含spring的jar包,由21个分模块的jar包组成,不同的jar包提供不同的功能,这样允许开发者根据不同需要选择不同的jar包。把spring-beans-5.0.2.RELEASE.jar、spring-context-5.0.2.RELEASE.jar、spring-core-5.0.2.RELEASE.jar、spring-expression-5.0.2.RELEASE.jar和spring的依赖jar包(commons-logging.jar)引入工程中。21使用spring框架案例演示模拟完成保存用户信息22Spring框架入门案例根据上述案例,体会spring容器的好处:通过这种依赖注入,javaEE应用中的各种组件不需要以硬编码方式耦合在一起吗,起到很好的解耦作用。降低了业务对象替换的复杂性。单例模式对象的生命周期有spring容器进行管理,信息可以共享。23Spring5新特性
Spring5.0是在2013年发布Spring4后的第一个大版本,5.0M1在2016年7月28日发布。随着慢慢的推广,使用它的人数肯定也会越来越多,那么Spring5有哪些新的特性呢?JDK版本升级
Spring5的代码基于Java8的语法规范,
因此要想使用Spring5,JDK的版本至少要在8.0以上。24Spring5新特性Core框架修订
基于Java8的反射增强,方法的参数在Spring5中可以高效的被访问核心的Spring接口,提供利用了Java8的默认接口实现,default方法,提供了一些可选的声明@Nullable和@NotNull注解,精确的标记了方法的参数和返回值,这样可以在编译的时候处理null值,而不至于在运行的时候抛出空指针异常,NullPointerExceptions。
在日志端,Spring5.0提供了CommonLogging的桥接模块,spring-jcl,代替了标准的CommonLogging,同时它还可以自动的检测Log4J2.x、SLF4J、JUL(java.util.logging),而不需要额外的依赖。25Spring5新特性Kotlin函数式编程Spring5.0引入了JetBrains的Kotlin语言支持,Kotlin是一种支持函数式编程的面向对象编程语言。Kotlin也运行在JVM之上,有了Kotlin的支持,开发者可以使用Spring的函数式编程处理Web的入口点和Bean的注册。26Spring5新特性响应式编程模型
激动人心的Spring5.0特性就是它的响应式Web编程ReactiveStreams(响应式流),是NetFlix、Pivotal、Typesafe、RedHat、Oracle、Twitter和Spray.io共同开发的一套规范。它提供了一些通用的API,实现的话可以自己控制,就像Hibernate之JPA,JPA是api,Hibernate是实现。
响应式流是Java9的正式模块,但是在Java8中,我们需要引入额外的依赖。Spring5.0的流式支持基于响应式流的API的ProjectReactor。Spring5.0有个新的模块叫做spring-webflux,可以支持响应式的Http和WebSocket客户端。27Spring5新特性测试改进Spring5.0完全支持Junit5,在TestContext框架中,可以并行的执行测试。对于响应式的编程,Spring-test提供了WebTestClient来测spring-webflux。WebTestClient,就像MockMvc不需要运行的服务器。当然Spring5.0还是支持Junit4的,在未来的一段时间里Junit4是都会存在的。28Spring5新特性额外库支持Spring5.0现在支持下面的库版本:• JackSon2.6+• EhCache2.10+/3.0GA• Hibernate5.0+• JDBC4.0+• XmlUnit2.x+• OkHttp3.x+• Netty4.1+29本章总结Spring框架概述Spring体系结构Spring特征SpringIoC/DI概念SpringIoC容器的使用方法IOC容器的工作原理BeanFactory接口及常用实现类XmlBeanFactoryApplicationContext接口及常用实现类BeanFactory和ApplicationContext的区别Spring框架入门案例Spring5新特性30谢谢!第三章Spring的基本用法
本章目标掌握依赖注入的类型掌握依赖配置的方式掌握Bean的自动装配方法掌握Bean的作用域范围掌握Bean的生命周期掌握Bean的基于Annotation的装配44本章教学内容依赖注入的类型构造方法注入设值注入依赖配置方式普通属性值合作者Bean嵌套Bean集合属性值Bean自动装配Bean作用域范围Bean的生命周期Bean的基于Annotation的装配45依赖注入的类型构造器注入通过类的构造方法来设置依赖关系的方式被称为构造注入设值方法注入通过类的setter方法为目标Bean注入依赖关系的方式被称为设值注入p名称空间注入46设值注入设值注入是指IOC容器使用属性的setter方法来注入被依赖的实例。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。Bean与Bean之间的依赖关系放在配置文件里组织(在引入spring之前,是通过写代码来组织),通过配置文件的指定,spring精确地为每个Bean注入属性。<property…/>标签元素Spring会自动接管每个<bean…/>定义里的<property…/>元素定义,spring会在调用无参数的构造方法创建默认的Bean实例后,调用对应的setter方法为程序注入属性。<property…/>定义的属性值将不再由该Bean来主动设置、管理,而是接受Spring的注入。
47设值注入案例演示:
人使用石斧砍柴换成人使用钢斧砍柴从上面示例程序中应该可以看出,依赖注入以配置文件管理Bean实例直接的耦合,让Bean实例之间的耦合从代码层次分离出来,依赖注入是一种优秀的解耦方式。
48构造注入构造注入是指IOC容器利用构造器来设置依赖关系。<constructor-arg…/>标签元素指定构造器的参数把设置注入的案例修改成构造注入,如何修改?两个案例执行效果完全一样,区别在于:创建Person实例中Axe属性的时机不同—设置注入是先通过无参数的构造器创建一个Bean实例,然后调用对应的setter方法注入依赖关系;而构造注入是直接调用有参数的构造器,当Bean实例创建完成后,已经完成了依赖关系的注入。
49p名称空间注入
我们可以使用p名称空间进行更简洁的XML配置。越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过元素属性的方式配置bean的属性,使用p命名空间后,基于XML的配置方式将进一步简化。
可以通过在头文件中加入xmlns:p="/schema/p"实现。
使用p的命名空间注入,它的本质还是使用set方法进行注入依赖,且需要导入命名空间p。使用p命名空间注入使得XML配置更简洁。50两种注入方式的对比这两种注入方式都是非常用用的,没有绝对的好坏,只是适应的场景有所不同。相比之下,设值注入具有如下优点:与传统的JavaBean的写法更相似,程序员更容易理解、接收对于复杂的依赖关系,如果采用构造注入,会导致构造器过去臃肿,难以阅读。
51两种注入方式的对比这两种注入方式都是非常用用的,没有绝对的好坏,只是适应的场景有所不同。相比之下,设值注入具有如下优点:与传统的JavaBean的写法更相似,程序员更容易理解、接收对于复杂的依赖关系,如果采用构造注入,会导致构造器过去臃肿,难以阅读。
52配置依赖根据前面的介绍,Java应用中各组件的相互调用的实质可以归纳为依赖关系,根据注入方式的不同,通常表现为如下两种形式:<property/><constructor-arg/>不管是属性,还是构造器参数,都视为Bean的依赖,接收spring容器管理,依赖关系的值要么是一个确定的值,要么是spring容器中其他bean的引用。所以spring允许通过如下元素为bean实例的属性指定值:Value、ref、bean、list、set、map及props53配置依赖—设值普通属性值<value/>元素用于指定字符串、基本类型的属性值,spring使用xml解析器来解析出这些数据,然后利用java.beans.PropertyEditor完成类型转换:从String类型转换为所需要的参数值类型。54配置依赖—配置合作者Bean如果需要为Bean设值的属性值是容器中的另一个Bean实例,则应该使用<ref/>元素。55配置依赖—注入嵌套Bean如果某个Bean所依赖的Bean不想被spring容器直接访问,可以使用嵌套Bean。<bean/>元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此定义嵌套Bean时无须指定id属性。56配置依赖—注入集合值如果Bean的属性是个集合,则可以使用集合元素,<list/><set/><map/>和<props/>元素分别用来设置类型为List、Set、Map和Properties的集合属性值。57Bean的作用域通过设定<bean/>标签的scope属性设定bean的作用域作用域描述singleton单实例作用域,这是Spring容器默认的作用域,使用singleton作用域生成的是单实例,在整个Bean容器中仅保留一个实例对象供所有调用者共享引用。单例模式对于那些无会话状态的Bean(如辅助工具类、DAO组件、业务逻辑组件等)是最理想的选择。prototype原型模式,这是多实例作用域,针对每次不同的请求,Bean容器均会生成一个全新的Bean实例以供调用者使用。prototype作用域非常适用于那些需要保持会话状态的Bean实例,有一点值得注意的就是,Spring不能对一个prototypeBean的整个生命周期负责,容器在初始化、装配好一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。因此,客户端要负责prototype实例的生命周期管理。58Bean的作用域通过设定<bean/>标签的scope属性设定bean的作用域作用域描述request针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTPrequest内有效,因此可以根据需要放心地更改所建实例的内部状态,而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于web的SpringApplicationContext情形下有效。session针对某个HTTPSession,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTPSession内有效。与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTPSession中根据Bean定义创建的实例,将不会看到这些特定于某个HTTPSession的状态变化。当HTTPSession最终被废弃的时候,在该HTTPSession作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的SpringApplicationContext情形下有效。59Bean的作用域通过设定<bean/>标签的scope属性设定bean的作用域作用域描述application将单个Bean定义的作用域限定为的-ServletContext。为每个ServletContext对象创建一个实例。该作用域仅在基于Web的SpringApplicationContext情形下有效。websocket将单个Bean定义的作用域限定为的WebSocket。为每个websocket对象创建一个实例。该作用域仅在基于Web的SpringApplicationContext情形下有效。60Bean的自动装配使用自动装配注入合作者BeanSpring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显式指定依赖Bean。由BeanFactory检查XML配置文件内容,根据某种规则,为主调Bean注入依赖关系。Spring的自动装配可通过<beans/>元素的default-autowire属性指定,也可通过<bean/>元素的autowire属性指定。自动装配可以减少配置文件的工作量,但降低了依赖关系的透明性和清晰性。61Bean的自动装配使用autowire属性配置自动装配,autowire属性可以接受如下值:模式说明no不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。byName根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为byname,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。62Bean的自动装配模式说明byType如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。constructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。63Bean的基于Annotation的装配
在Spring中,使用基于XML配置的形式完成Bean的装配,如果应用中有很多的Bean时,XML配置文件会比较臃肿,后期软件维护或升级会有一定的困难。为此Spring提供了第三种Bean的装配形式,基于注解(Annotation)的装配。这也是最常用的装配方式。Spring中定义的关于Bean装配的常用注解可以分为创建对象的注解和注入数据的注解两类。Bean的基于Annotation的装配
用于创建对象的注解
@Component:标注一个普通的SpringBean类,把普通Bean实例化到Spring容器中,相当于XML配置文件中的<beanid=""class=""/>。该注解包括属性value,用于指定bean的id。当不写时,默认值是当前类名首字母小写。
@Controller:是@Component的一个衍生注解,一般用于表现层,标注一个控制器组件类。
@Service:是@Component的一个衍生注解,一般用于业务逻辑层,标注一个业务逻辑组件类。
@Repository:是@Component的一个衍生注解,一般用于持久层,标注一个DAO组件类。65Bean的基于Annotation的装配用于创建对象的注解【注意】@Controller、@Service、@Repository三个衍生注解的作用及属性和@Component相同。它们只是Spring框架为我们提供了语义上的分层,所以注解之间可以互换,但实际应用中还是使用语义上分层的注解比较好。66Bean的基于Annotation的装配用于注入数据的注解
@AutoWired:用于注入数据的注解,数据类型为其他类型的bean。装配过程为自动按照类型进行匹配,如果Spring容器中有唯一类型匹配成功,则可以直接注入。如果有多个同类型的匹配时,然后再用变量名称作为bean的id从Spring容器中查找,如果找到也可以注入成功。如果没有匹配的则报错。
67Bean的基于Annotation的装配用于注入数据的注解
@Resource:把@Resouce注解放在@Autowired下面说,是因为它们作用非常相似。都是自动装配bean对象。@Resource的装配顺序:(1)@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配。
(2)指定了name或者type则根据指定的类型去匹配bean。(3)指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错。68Bean的基于Annotation的装配区分一下@Autowired和@Resource两个注解的区别
(1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配。(2)@Autowired是Spring的注解,@Resource是JavaEE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了。[注意]Spring属于第三方的,JavaEE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。69Bean的基于Annotation的装配用于指定Bean作用域的注解
@Scope:用于指定bean的作用域范围,范围取值和XML配置是一致的,默认值为singleton。使用属性value指定作用域范围。70Bean的基于Annotation的装配用于将外部的值动态注入到Bean
@Value:用于不通过XML配置文件注入属性的情况,通过@Value将外部的值动态注入到Bean中,使用的情况有:注入普通字符串注入操作系统属性注入表达式结果注入其他Bean属性注入文件资源注入URL资源71本章总结依赖注入的类型构造方法注入设值注入依赖配置方式普通属性值合作者Bean嵌套Bean集合属性值Bean自动装配Bean作用域范围Bean的生命周期Bean的基于Annotation的装配72谢谢!第4章面向切面编程本章目标理解AOP的概念
掌握AOP的相关术语掌握Spring支持AOP的实现方式掌握基于XML的配置方式实现AOP编程的方法掌握基于注解(Annotation)的方式实现AOP编程的方法75本章教学内容AOP的概念AOP的相关术语Spring支持AOP的实现方式基于注解(Annotation)的方式实现AOP编程的方法基于XML的配置方式实现AOP编程的方法76AOP的概述
AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”。使用AOP的目的为AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限认证等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。AOP的主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等。77AOP有关术语切面(Aspect)
一个关注点的模块化,这个关注点实现可能另外横切多个对象。切面一般定义为一个Java类,事务管理是企业Java应用程序中横切关注的一个很好的例子。连接点(Joinpoint)
在程序执行过程中的一点,例如方法的执行或异常的处理。在SpringAOP中,连接点始终代表方法的执行。通知(Advice)
在特定的连接点(Joinpoint),AOP框架执行的动作。通知有各种类型,有关通知类型将在后面具体讲解。78AOP有关术语切入点(Pointcut)
一个匹配连接点的正则表达式。当一个连接点匹配到切点时,一个关联到这个切点的特定的通知(Advice)会被执行。AOP代理(AOPProxy)
AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。织入(Weaving)
负责将切面和目标对象链接,以创建通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯JavaAOP框架一样,在运行时完成织入。目标对象(TargetObject)
包含连接点的对象。也被称作被通知或被代理对象。79AOP代理简要的说Spring使用两种机制实现AOP代理:一是使用Java的动态代理,即java.lang.reflect.Proxy类创建AOP代理。二是使用CGLIB库自动生成目标对象的子类,同时织入通知。SpringAOP默认将标准JDK动态代理用于AOP代理。这使得可以代理任何接口(或一组接口)。该动态代理要求目标对象必须要实现接口(只有这样才能创建代理),而CGLIB则没有这种限制。80AOP代理SpringAOP也可以使用CGLIB代理。这对于代理类接口不是必需的。如果业务对象未实现接口,则默认情况下使用CGLIB。因为对接口而不是类进行编程是一种好习惯;业务类通常将实现一个或多个业务接口。在那些需要建立在接口上未声明的方法或需要将代理对象作为具体类型传递给方法的情况下(在极少数情况下),可以强制使用CGLIB代理。Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。81AOP代理面向AOP编程只需要程序员参加以下3个部分:定义普通业务组件定义切入点定义通知,也叫增强处理进行AOP编程的关键就是定义切入点和通知。一旦定义了合适的切入点和增强处理,AOP框架将会自动生成AOP代理。82AOP实战
AspectJ简介
在讲解实现AOP编程之前,我们需要先了解一下AspectJ。AspectJ实际上是对AOP编程思想的一个实践,是一个基于Java语言的AOP框架,它提供了强大的AOP功能。Spring2.0以后,SpringAOP引入了对AspectJ的支持。在新版本的Spring框架中我们也建议直接使用AspectJ进行编程。
使用AspectJ实现AOP编程有两种方式:
一种是基于XML配置文件的方式,这种为使用spring配置文件来定义切入点和增强处理。
第二种是基于注解(Annotation)方式,该种为使用@Aspect、@Pointcut等Annotation来标注切入点和增强处理。83Spring通知的类型Advice类型:前置通知[Beforeadvice]:
在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。正常返回通知[Afterreturningadvice]
在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[Afterthrowingadvice]:在连接点抛出异常后执行。
最终通知[After(finally)advice]:
在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
84Spring通知的类型Advice类型:环绕通知[Aroundadvice]:
环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理Joinpoint(调用ProceedingJoinPoint的proceed方法)还是中断执行。85切入点(pointcut)的定义切入点的定义在SpringAOP中切入点表达式大量使用execution表达式,其中execution就是一个切入点指示符。execution:用于匹配执行方法的连接点,这是SpringAOP中最主要的切入点指示符。execution表达式的格式如下:execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-parrtern(param-pattern)throws-pattern?)86切入点(pointcut)的定义切入点的定义modifiers-pattern:指定方法的修饰符,支持通配符,该部分可省略。ret-type-pattern:指定方法返回值类型,支持通配符,可以使用“*”通配符来匹配所有返回值类型。declaring-type-pattern:指定方法所属的类,支持通配符,该部分可省略。name-parrtern:指定匹配方法名,支持通配符,可以使用“*”通配符来匹配所有方法。param-pattern:指定方法声明中的形参列表,支持两个通配符:“*”和“..”,其中“*”代表一个任意类型的参数,而“..”代表0个或多个任意类型的参数,例如,()匹配一个不接受任何参数的方法,而(..)匹配了一个接受任意数量参数的方法(0个或多个),(*)匹配一个接受一个任意类型参数的方法。(*,String)匹配了一个接受两个参数的方法,第一个可以使任意类型,第二个则必须是String类型。throws-pattern:指定方法声明抛出的异常,支持通配符,该部分可省略。87切入点(pointcut)的定义下面给出常见切入点表达式的一些示例:任意公共方法的执行:execution(public**(..))任何一个以“set”开始的方法的执行:execution(*set*(..))AccountService接口的任意方法的执行:execution(*com.xyz.service.AccountService.*(..))定义在service包里的任意方法的执行:execution(*com.xyz.service.*.*(..))定义在service包或者子包里的任意方法的执行:execution(*com.xyz.service..*.*(..))88基于XML配置的AOP编程使用XML配置方式是通过XML文件来提供这些信息,包括切面、切入点、增强处理,从而实现AOP编程。准备工作:添加支持AOP编程的jar包
需要在支持SpringIOC的核心jar包的基础上,添加aopalliance-1.0.jar、aspectjweaver.jar、spring-aop-5.0.2.RELEASE.jar、spring-aspects-5.0.2.RELEASE.jar,如下图所示。89基于XML配置的AOP编程准备工作:添加支持AOP编程的jar包
下面简要介绍这几个包。aopalliance-1.0.jar:是AOP联盟提供的API包,里面包含了针对面向切面的接口。aspectjweaver.jar:是spring的切入点表达式需要用的包。spring-aop-5.0.2.RELEASE.jar:包含了使用SpringAOP特性时所需要的类,利用这个jar文件我们可以使用基于AOP的Spring特性。如声明式的事物管理,日志系统引入等等。spring-aspects-5.0.2.RELEASE.jar:提供了对AspectJ的支持,以便方便的将面向切面的功能集成到IDE中。AspectJ是一个面向切面的框架,他扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器来生成Java字节规范的class文件。90基于XML配置的AOP编程编写切面LogAspect.java编写业务逻辑类CustomerServiceImpl.java配置切面
既然使用XML配置方式实现AOP编程,就是在XML文件中定义切面、切入点、通知。
91基于注解(Annotation)的AOP编程使用注解的方式已经逐渐成为了主流,所以我们利用上面的例子来说明如何用注解来开发SpringAOP。
下面通过表来列举一下Spring中的AspectJ注解92基于注解(Annotation)的AOP编程
表Spring中的AspectJ注解注解说明@Aspect配置切面@Before前置通知,在连接点方法前调用@Around环绕通知,它将覆盖原有方法,但是允许你手动定义通知执行顺序@After最终通知,在连接点方法后调用@AfterReturning正常返回通知,在连接点方法执行并正常返回后调用,要求连接点方法在执行过程中没有发生异常@AfterThrowing异常返回通知,当连接点方法异常时调用93本章总结AOP的简介AOP的相关术语AOP代理基于xml的配置方式实现AOP编程基于注解(Annotation)的方式实现AOP编程94谢谢!第五章事务管理
本章目标了解事务的概念了解JDBC事务管理掌握spring事务管理的实现方式编程式事务管理声明式事务管理了解Spring事务的隔离级别和传播方式97本章知识点事务的概述JDBC事务管理实现方式Spring事务管理的实现方式编程式事务管理声明式事务管理Spring事务的隔离级别和传播方式98事务概述事务定义:数据库系统为了保证数据操作的完整性和一致性,引入了事务这个重要的概念,所谓事务,就是将一系列的数据库操作作为一个整体来执行。如对数据库存取,就是一组SQL指令,这一组SQL指令必须全部执行成功;如果因为某个原因(例如其中一行SQL有错误),则先前所执行过的SQL指令撤销。99JDBC事务管理JDBC技术的事务管理:在JDBC中,可以用Connection的setAutoCommit()方法,给定它false参数。在一连串的SQL语句后面,调用Connection的commit()来送出变更。如果中间发生错误,则调用rollback()来撤销所有的执行,例如:try{connection.setAutoCommit(false);…//一连串SQL操作
mit();//执行成功,提交所有变更}catch(SQLExceptione){connection.rollback();//发生错误,撤销所有变更}100JDBC事务管理101JDBC事务管理102JDBC事务管理ApplicationContext.xml配置文件103Spring事务管理Spring事务概述:
Spring框架提供了极其强大而简便的事务处理功能,其核心便是PlatformTransactionManager抽象接口。Spring将所有的事务管理都抽象为PlatformTransactionManager、TransactionStatus和TransactionDefinition这3个接口,而无论其底层关联的具体的事务究竟是JDBC事务、JTA事务,还是ORM框架自定义的事务。PlatformTransactionManager:定义了事务管理器,所有与事务相关的操作都有它管理;TransactionStatus:代表事务本身,它提供了简单的控制事务执行和查询事务状态的方法;104Spring事务管理Spring事务概述:TransactionDefinition
:定义了事务的规则(事务的隔离级别、传播行为、事务超时、只读状态),
在启动事务时,事务管理器会根据TransactionDefinition来启动合适的事务;105Spring事务管理Spring事务概述:在Spring中实现事务管理有两种方式,一种是传统的编程式事务管理,也就是程序员在编写程序代码实现事务的管理,具体包括定义事务的开始、在程序异常时进行事务的回滚及程序正常执行后的事务提交。另一种则是基于AOP技术实现的声明式事务管理,事务管理本身是一项共有的系统级服务功能,完全可以将事务管理抽象成一个事务切面,程序员不再关心事务管理的问题,把主要精力放在核心业务逻辑代码的编写上,然后在需要进行事务管理的方法上切入事务切面,使之具有事务管理的功能,达到事务管理的目的。106Spring事务管理Spring编程式事务:PlatformTransactionManager:事务管理器接口,只定义了3个方法:getTransaction()获取事务的状态;
commit();rollback();事务管理器的实现类有多种,根据具体的持久层框架的不同而不同;实现类:DataSourceTransactionManager、 HibernateTransactionManager、 JdoTransactionManager等107Spring事务管理Spring编程式事务:可以使用PlatformTransactionManager直接管理事务。简单地通过一个bean引用给你的bean传递一个你使用的PlatformTransaction对象。然后,使用TransactionDefinition和TransactionStatus对象就可以发起、回滚、提交事务。流程一般如下:
1
.声明数据源
2
.声明一个事务管理类,例如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
3
.在我们的代码中加入事务处理代码108Spring事务管理Spring编程式事务://默认的事务属性是PROPAGATION_REQUIRED属性//初始化事务,参数定义事务的传播类型TransactionDefinitiontdefinition=newDefaultTransactionDefinition();//获取当前事务TransactionStatus
ts
=
transactionManager.getTransaction(td);
try{//逻辑处理语句
transactionMmit(ts);
}catch(Exception
e){
transactionManager.rollback(ts);
}
109Spring事务管理Spring编程式事务:
110Spring事务管理Spring编程式事务:
ApplicationContext.xml111Spring事务管理
Spring声明式事务:Spring为声明式事务提供了简单而强大的支持,所谓声明式事务,是指在Spring的配置文件中使用相应的标签对事务进行配置,这样做的好处是Spring可以帮助我们管理事务,例如:什么时候提交事务、什么时候回滚事务等。从开发效率与易维护的角度来看,Spring声明式事务管理是实际开发中比较常用的。112Spring事务管理
Spring声明式事务:实现方式:基于TransactionInterceptor的声明式事务管理基于
TransactionProxyFactoryBean
的声明式事务管理基于<tx>命名空间的声明式事务管理基于
@Transactional的声明式事务管理113Spring事务管理
Spring声明式事务:基于<tx>命名空间的声明式事务管理实现步骤在xml中启用tx和aop两个命名空间xmlns:tx=/schema/txxsi:schemaLocation="/schema/tx/schema/tx/spring-tx-5.0.xsd114Spring事务管理
Spring声明式事务:基于<tx>命名空间的声明式事务管理实现步骤在xml中配置通知、切入点以及Advisor115Spring事务管理
Spring声明式事务:说明:<aop:config/>定义,它确保有tx:advice切面定义事务增强处理能力在合适的点被织入。116Spring事务管理事务的传播方式:事务的传播行为用于指定在多个事务方法间调用时,事务是如何在这些方法间传播的,spring共支持7种传播行为。PROPAGATION_REQUIRED
表示业务逻辑方法需要在一个事务中运行,如果该方法在运行时,已经处在一个事务中,则直接加入到该事务中,否则自己创建一个新的事务。即:如果存在一个事务,则支持当前事务。如果没有事务则开启。(在实际开发中常用该传播方式。)PROPAGATION_SUPPORTS
表示业务逻辑方法如果在某个事务范围内被调用,则该方法直接成为当前事务的一部分。如果该方法在事务范围外被调用,则该方法在无事务的环境下执行。即:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。117Spring事务管理事务的传播方式:PROPAGATION_MANDATORY
表示业务逻辑方法只能在一个已经存在的事务中执行,该方法不能创建自己的事务,如果该方法在没有事务的环境下被调用,容器就会抛出事务不存在的异常。即:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。PROPAGATION_REQUIRES_NEW
表示不管当前是否有事务存在,该业务逻辑方法都会为自己创建一个全新的事务。如果该方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到该方法执行结束后新事务才算结束,原先的事务再恢复执行。即:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起,新事务运行完毕后,再接着运行被挂起的事务。118Spring事务管理PROPAGATION_NOT_SUPPORTED
表示业务逻辑方法不需要事务。如果该方法目前没有关联到某个事务,容器不会为它创建事务。如果该方法在一个事务中被调用,则该事务会被挂起,在方法调用结束后原先的事务才会恢复执行。即:总是非事务地执行,并挂起任何存在的事务,当前方法运行完毕后,被挂起的事务才恢复执行。PROPAGATION_NEVER
表示业务逻辑方法绝对不能在事务范围内执行。如果该方法在某个事务中执行,容器会抛出异常,只有没有关联到任何事务时该方法才能正常执行。即:总是非事务地执行,如果存在一个活动事务,则抛出异常119Spring事务管理PROPAGATION_NESTED
表示如果一个活动的事务存在,业务逻辑方法则运行在一个嵌套的事务中,如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点,内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器生效。即:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。120Spring事务管理--事务传播方式图示说
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版耳聋常见症状及护理方法培训
- 维生素临床科普
- 疟疾症状鉴别及护理要点解读
- 护理招聘自我介绍
- 2025版神经科多发性硬化症症状详解及康复护理指导
- 冠心病患者的护理
- 厂内车辆安全考试题及答案
- 2025年建筑架子工建筑特殊工种考试题及答案
- 2024年设备监理师重点试题带答案
- 2025年信息技术考试题素材及答案
- 山东省青岛2025年七年级上学期语文期中试卷附答案
- 冷库储存生姜合同范本
- 服务营销的考试题及答案
- 学堂在线 研究生学术与职业素养讲座 章节测试答案
- 安全技术交底(起重吊装)
- 精神分裂症患者护理(2)PPT
- Opera、绿云、西软、中软酒店管理系统对比分析
- 《农作物生产专业技术》课程标准
- 蔬菜捆扎机机械部分的设计说明书
- 钢的碳当量公式及其在焊接中的应用
- 中国地理知识(全面)(课堂PPT)
评论
0/150
提交评论