《Web开发框架第一讲《spring框架》.ppt》由会员分享,可在线阅读,更多相关《Web开发框架第一讲《spring框架》.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章第一章SpringSpring框架简介框架简介框架简介框架简介1Spring简介oSpring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。o目的:解决企业应用开发的复杂性。o功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能。o范围:任何Java应用。o简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。2Spring简介o轻量轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。o非侵入非侵入在应用中,一般不需要
2、引用springjar包里的类。o控制反转控制反转Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,某一接口的具体实现类的选择控制权从调用类中移除,转交给第三方裁决。o面向切面面向切面Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的完成业务逻辑仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。3Spring简介oSpring即是一个容器又是一个框架。o容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以
3、配置你的每个bean如何被创建基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。o框架Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等,使用Spring框架,开发人员可以专注于业务逻辑开发,这个意义上讲它是一个框架。4第二章第二章控制反转(控制反转(控制反转(控制反转(IOCIOC)5控制反转oIOC(控制反转:InverseofControl)是Spring的内核,AOP,声明式事务等功能都建立在该功能之上,它涉及到代码解耦,设计模式,代码优化等问题的考虑。o它包括两个方面
4、的内容:其一是控制;其二是反转。到底是什么东西的控制被反转了呢,来看个例子:o导演,剧本,场景,剧中人,演员,6控制反转o对于软件来说:控制反转即是某一接口的具体实现类的选择控制权从调用类中移除,转交给第三方裁决。o依赖注入DI(DependencyInjection):将调用类对接口的实现类的依赖关系由第三方注入,以移除调用类对接口实现类的依赖。7控制反转opublic class SaveEmployeeEditAction extends SsoaAction o/定义接口定义接口opublicEmployeeManageremployeeManager;o/属性注入属性注入opubli
5、cvoidsetEmployeeManager(EmployeeManageremployeeManager)othis.employeeManager=employeeManager;oopublicStringexecute()throwsException /使用接口使用接口oemployeeManager.updateEmployee(ee);ooo第三方控制实现类第三方控制实现类ooooo8oIOC类型o构造函数注入o在构造函数注入中,通过调用类的构造函数将接口实现类通过构造函数变量传入,如下代码所示opublicclassMenuBufferImplopublicMenuBuffe
6、rImpl()opublicMenuBufferImpl(PrivilegeDAOprivilegeDAO)othis.privilegeDAO=privilegeDAO;oooo/注入oooooo控制反转9控制反转o属性注入o属性注入可以有选择地通过Setter方法完成调用类所需依赖的注入,更加灵活方便。o一般使用属性注入。见前面例子10控制反转o课后扩展:o刚才看到,spring框架通过一个配置文件实现控制反转,在容器启动时根据配置文件的描述信息,自动实例化Bean并完成依赖关系的建立,从容器中即可返回准备就绪的Bean实例,以待以后使用。Spring之所以有这样的能力,主要归功于java
7、语言本身的类反射功能,反射机制简单的说就是我们利用编程的方式实现类的实例化,大家课下可以查询这方面的知识,加深对控制反转的了解。11BeanFactoryoSpring实现控制反转是通过配置方式来实现的,主要是xml配置文件,该文件一般命名为*-beans.xml,格式一般如下:12控制反转-BeanFactoryoSpring通过该配置文件描述Bean及Bean之间的依赖关系,在容器启动时实例化Bean并建立Bean之间的依赖关系。Spring的Ioc容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。oBeanFactor
8、y(Bean工厂)是Spring框架最核心的接口它提供了高级Ioc的配置机制,使管理不同类型的java对象成为可能。o一般我们称BeanFactory为Ioc容器。o使用如下:13oApplicationContext(应用上下文)建立在BeanFactory之上,提供了更多面向应用的功能,更易于创建实际应用,有时在web开发中为了方便也称ApplicationContext为Spring容器。控制反转-ApplicationContext14oWebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作。从WebApplic
9、ationContext中可以获得ServletContext的引用整个web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring引用上下文。Spring专门提供了一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContextsc)方法可以从ServletCOntext中获取WebApplicationContext实例。o使用例子:控制反转-WebApplicationContext15控制反转16控制反转-装配beano装配一个beanoooo权限管理p
10、rvoooo上段信息提供了实例化Car和Boss这两个Bean必须的信息,Ioc容器完全可以根据该信息创建者连个Bean实例。oBean命名:o一般情况,在配置一个bean是,需要为期指定一个id属性作为Bean的名称,id在Ioc容器中必须是唯一的,此外id的命名需要满足XML对id的命名规范:必须以字母开始,逗号和空格这些非完全结束符号是非法的。如果实际使用中需要使用一些id不允许的特殊字符,可以使用bean的name属性来命名,name没有命名上的限制,几乎可以使用任何字符,如?ab,123等。oId和name都可以指定多个名字,名字中间使用逗号、分号、或者空格进行分割,oo这里为bea
11、n定义了三个名字?car1,car2,#car3,他们是一样的,可以通过任何一个取得bean实例。o配置文件中不能出现相同的id,但可以出现相同的name,根据name取得bean时,以最后出现的name为准。o推荐使用id.17o属性注入配置属性注入配置o使用属性注入时,bean配置方式如下:ooooooohongqi,200,2000ooo两种方式设置属性的值,1,通过字面值value;2,通过idref引用别的bean.o上例中name的值是car.控制反转-装配bean18控制反转-装配beano构造函数注入装配构造函数注入装配o构造函数注入通过标记完成。o1,按类型匹配入参,按类型匹
12、配入参 ooooooooo$barando$coloro$maxSpeedoooo2,按索引匹配入参,按索引匹配入参ooooooooo$barando$coloro$maxSpeedooo19o注入参数详解注入参数详解o1,字面值o即可用字符串表示的值,这些值元素标签进行注入,比如oohongqioo对于一些特殊符号可以使用的特殊处理标签,比如:oooo当然也可以使用转义序列处理特殊符号,xml中共有五个特殊符号,它们的转义序列如下:o<o>o&o“"o'控制反转-装配bean20o2,引用其它引用其它beanoidrefoidref元素用来将容器内其它
13、bean的id传给或元素,同时提供错误难功能。oooorefo形式一:这是最常见的形式是通过使用ref标记指定bean属性的目标bean,通过该标签可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XMLbean元素的值即可以是指定的bean的id值也可以是其name值。o形式二:使用ref的local属性指定目标bean,它可以利用XML解析器来难所引用的bean是否存在同一文件中。local属性值必须是目标bean的id属性值。o形式三:通过使用ref的parent属性来引用当前窗口的父容器中的bean。parent属性值即可以是目标bean的id值,也可以是name
14、属性值。控制反转-装配bean21o3、内部、内部 bean:o所谓内部bean(innerbean)是指在一个bean的或中使用元素定义的bean.o内部bean不能被其它bean引用,只能在声明处为外部bean提供实例注入。o内部bean即使提供了id,name,scope属性也会被忽略.控制反转-装配bean22o4、集合合并:、集合合并:o从Spring2.0开始,SpringIoC容器将支持集合的合并。父子集合元素合并后的值就是子集合中的最终结果,而且子集合中的元素值将覆盖父集合中的对应的值。supportsomecompany.co.uko合并后内容:oadministrator=
15、sales=support=supportsomecompany.co.ukolist集合有排序功能,父bean的列表内容将排在子bean列表内容的前面;merge属性必须在继承的子bean中定义。控制反转-装配bean23o5、Nullso用于处理null值。Spring会把属性的空参数当作空字符串处理。oo等同于oexcapleBean.setEamil();o而null值则可以使用元素来表示:o控制反转-装配bean24o6、简写:o针对常见的value值或bean的引用,Spring提供了简化格式用于替代和元素。、元素都支持value属性,它可以用来替代内嵌的元素。ohello=ohe
16、llo=ohello=o和支持类似的简写属性ref,它可以替找整个内嵌的元素。o=o=o切记:尽管存在等同于元素的简写形式,但并没有的简写形式。omap中的entry元素的简写形式为key/key-ref和value/value-ref属性。o=oSpring建议使用简写形式控制反转-装配bean25o7、延迟初始化bean-lazy-init属性:oo如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singletonbean依赖于它,那么当ApplicationContext提前实例化singletonbean时,它必须也确保所有上述singleton依赖bean也被预先初始化,当
17、然也包括设置为延迟实例化的bean.o在容器层次中通过在元素上使用default-lazy-init属性来控制延迟初始化也是可能的。控制反转-装配bean26o8、自动装配属性:o模式说明ono不使用自动装配,必须通过ref元素指定依赖,这是默认设置。obyName根据属性名自动装配。Spring将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。obyType如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个,则抛出异常。oconstructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中未找到与构造器参数类型一
18、致的bean,那么将抛出异常。oautodetect通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。控制反转-装配bean27oBean之间的关系o1,继承,继承o如果多个bean存在相同的配置信息,spring允许我们定义一个父,子将自动继承父的配置信息。ooooooo200oo控制反转-装配bean28o2,依赖,依赖odepends-on属性可以用于当前bean初始化之前显式的强制一个或多个bean被初始化。oo若需要表达对多个bean的依赖,可以在中将指定的多个b
19、ean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。oo3,引用,引用o即前面讲的idref控制反转-装配bean29o循环依赖问题循环依赖问题oSpring容器能够顺利实例化以构造函数注入进行装配的bean有一个前提:Bean构造函数入参引用的对象必须已经准备就绪。由于这个机制的限制,如果两个bean都采用构造函数注入,而且都通过构造函数入参引用对方,就会发生类似于线程死锁的循环依赖问题。如下:oPublicclasscarooPubliccar(Bossboss)othis.boss=boss;oooPublicclassbossooPublicboss(Carcar)othis.
20、car=carl;ooo当启动Ioc容器时,由于存在循环依赖问题,Spring容器将无法成功启动,这时我们可以混合使用函数注入和属性输入来解决该问题。即,把上面的一个函数注入改为属性注入方式。控制反转-装配bean30第三章第三章面向切面编程面向切面编程面向切面编程面向切面编程(AOP)(AOP)基础基础基础基础31面向切面编程(AOP)oAOP相关概念o连接点连接点(Joinpoint):o程序执行的某个特定位置:比如类开始初始化前、类初始化后、某个方法调用前、调用后等。一个类或一段程序代码拥有的一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”,Spring仅支持方法的连接点。o
21、切点切点(Pointcut):o匹配连接点(Joinpoint)的断言。连接点相当于数据记录,切点相当于查询条件,一个切点可以匹配多个连接点。o增强增强(Advice):o织入到目标类连接点上的一段程序代码。o目标对象目标对象(Target):o增强逻辑的织入目标类o引介引介(Introduction)o引介是一种特殊的增强,为类添加一些属性和方法。通过它可以动态的为业务类增加接口的实现逻辑,让业务类成为这个接口的实现类。32o织入织入(Weaving):o将增强添加到对目标类具体连接点上的过程。o代理代理(Proxy)o一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的
22、代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能是原类的子类,所以我们可以采用调用原类相同的方式调用代理类o切面切面(Aspect)o切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,springAOP就是负责实施切面的框架,它将切面定义的横切逻辑织入到切面所指定的连接点中。oAOP的工作重点在于如何将增强应用于目标对象的连接点上,这包括两个工作:o1,如何通过切点和增强定位到连接点上;o2,如何在增强中编写切面的代码;面向切面编程(AOP)33o代理机制:oAOP通过动态代理技术在运行期织入增强代码,首先了解下AOP使用的两种代理机制:o1
23、,基于JDK的动态代理oJDK1.3以后,java提供了动态代理技术,允许开发者在运行期创建接口的代理实例。oJDK动态代理主要涉及两个类,oJava.lang.reflect.ProxyoJava.lang.reflect.InvocationHandleroInvocationHandler是一个接口,可以通过实现该接口定义的横切逻辑,并通过反射机制调用目标类的代码,动态的将横切逻辑和业务逻辑编织在一起。oProxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。o例子如下:面向切面编程(AOP)34o2,基于CGlib的动态代理oJDK只能为接
24、口创建代理实例,对于那些没有通过借口定义业务方法的类,可以通过CGLib创建代理实例。oCGLib采用底层字节码技术,可以为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,这时可以顺势织入横切逻辑。o例子如下:面向切面编程(AOP)35o小结:AOP就是通过JDK动态代理或CGLib动态代理技术为目标bean织入横切逻辑.虽然JdkProxyClass和CglibProxy实现了性能监视横切逻辑的动态织入,但是这种方式存在三个需要改进的地方。o1,目标类的所有方法都添加了性能监视横切逻辑。o2,通过硬编码方式制定了织入横切面的织入点,即在目标类业务方法的开始和结束前织入代码。
25、o3,手工编写代理实例的创建过程,为不同类创建代理时,需要分别编写相应的代码,没有做到通用。oSpringAOP主要工作就是围绕以上三点展开:通过切点指定在哪些类的哪些方法上施加横切逻辑,通过增强描述横切逻辑和方法的具体织入点,此外Spring通过切面将切点和增强或引介组装起来,有了切面信息,Spring就可以通过JDK或CGLib的动态代理技术采用统一的方式为目标bean创建织入切面的代理对象了。面向切面编程(AOP)36o创建增强类创建增强类o前置增强o后置增强o环绕增强o异常抛出增强o引介增强面向切面编程(AOP)37o前置增强前置增强oBeforeAdvice是前置增强的接口。o方法前置增强MethodBeforeAdvice接口是其子类。oSpring目前只提供方法调用的前置增强。o例子:面向切面编程(AOP)38o后置增强后置增强面向切面编程(AOP)39o环绕增强环绕增强面向切面编程(AOP)40oAOP应用:数据库事务管理应用:数据库事务管理o事务概念:事务是包含一个或多个SQL语句的逻辑工作单元。事务中的SQL语句能够全部提交也能够全部回滚。oSpring对事务的控制是在配置文件统一控制的。ooooooooooooooo面向切面编程(AOP)41424344454647课程完毕o谢谢大家的配合!48
限制150内