Spring技术介绍
![Spring技术介绍](https://img.360docs.net/img18/0qjh3358kkpp8ic93bn-81.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、基本概念
Spring 的核心是轻量级(Lightweight )的容器(Container ),它实现了IoC 容器、非侵入性(No intrusive )的框架,并提供AOP 概念的实现方式,提供对持久层(Persistence )、事务(Transaction )的支持,提供MVC Web 框架的实现,并对一些常用的企业服务API (Application Interface )提供一致的模型封装,是一个全方位的应用程序框架(Application framework ),另外,Spring 也提供了对现有框架(Struts 、JSF 、Hibernate 等)的整合方案。
Spring 旨在分离体系结构的层次,因此每一层都可以修改而不会影响到其它层。每一层都不知道其上层的关注点;就其可能而言,只对所紧挨的下一层有依赖。层与层之间的依赖通常是以接口的形式表现,以确保其耦合尽可能松散。
容器管理事务,容器,贯穿始终:1、对象生命周期的管理。 2、容器本身具备功能,加在自己的类中。需要自己调用则为显示调用。 而尽量用容器隐式调用,Spring 即为隐式
对现有表现层的支持
与ORM 紧密结合,可使用声明式事务管理 AOP 标准接口的实
现(容器管理的声
明式的种种事务)
对JDBC 采用模板回调;声明的JDBC 事务管理.
提供了Bean 工厂
对Bean 工厂的扩
展(比如对事务、国际化的支持)
自己的MVC 实现
调用、声明式编程。
Spring 轻量级容器体现在:只需设置一个Jar 文件到CLASSPATH ,不用去调用它,但又可以拥有其强大的功能。组件的极大程度的复用。
让层与层中耦合度低——Loosely-Coupled 工厂类创建DAO 对象。
声明式编程:在xml 文件中声明。 基于POJO 类,支持事务,事务是根本;而EJB 事务由Container 管理。
Spring 将 View 层与持久层,比如与Hibernate 联系起来。Spring 简化Hibernate 的使用,还可以帮助管理Hibernate 。Spring 本身没有O-R_mapping ,因为有Hibernate ,她已经做得很好了。
Spring 将编译时异常(checked )转化为运行时异常(runtime )。比如,JDBC 则为编译时异常,即必须写try…catch ;而Hibernate 程序为运行时异常。
在spring-framework-2.0.5\dist 目录下 有jar 文件、 dtd 文件、 tld 文件。
总之,Spring 是一个轻型容器(light-weight container ),其核心是Bean 工厂(Bean Factory ),用以构造我们所需要的M (Model )。在此基础之上,Spring 提供了AOP (Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean 工厂的扩展ApplicationContext 更加方便我们实现Java EE 的应用;DAO/ORM 的实现方便我们进行数据库的开发;Web MVC 和Spring Web 提供了Java Web 应用的框架或与其它流行的Web 框架进行集成。
二、IoC (Inversion of Control )
1、定义:组件..之间的依赖关系....由容器..在运行时决定。
例如:B 对象所依赖的A 对象是由 Spring 创建好并且通过Set 方法传递注入过来的。 最基本的优点体现在:若A 为接口,让B 依赖于接口。只看接口不管实现类。 可把工厂类全部替换掉。对象均为容器创建。到时还能把容器的功能融入到其中。
IoC 要求:容器尽量不要侵入到应用程序中去,应用程序本身可以依赖于抽象的接口,
容器根据这些接口所需要的资源注入到应用程序中,也就是说应用程序不会主动向容器
JavaBean 调用/包含 Spring
控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系。
请求资源;容器会自动把这些对象给应用程序。
●IoC有基于set方式的注入(property)、基于构造方法的注入。
●IoC核心的bean工厂:在Spring中,bean工厂创建的各个实例称作bean。业务组件间
的依赖是容器(Bean工厂)解决的。BeanFactory负责读取Bean定义文件,管理对象的加载、生成,维护Bean对象与Bean对象的依赖关系,负责Bean的生命周期,对于简单的应用程序来说,使用BeanFactory就已经足够来管理Bean,在对象的管理上就可以获得许多的便利性。
●Spring中有两个包里的类都可以做IoC:
beans包:org.springframework.beans包;
context包:org.springframework.context包,其类功能更加强大。
2、bean工厂创建bean的三种方式:
?通过构造方法直接创建:
?通过静态工厂方法创建:
?通过非静态工厂方法创建:
3、Spring中实现IoC的方式:依赖注入(Dependency Injection)
Spring中依赖注入的两种方式:
通过setter方法注入:
其中,name属性的取值依setter方法名而定。Spring推荐使用setter方法注入。
通过构造方法注入:
constructor-arg>
constructor-arg>
constructor-arg>
其中,index 表示构造方法中的参数索引(第一个参数索引为0),type 表示构造方法中参数的类型。
● 两种注入方式的区别:
? Constructor :可以在构建对象的同时,把依赖关系也构建好。对象创建后好就已经
准备好了所有的资源,安全性高。
? Setter: 创建完对象之后再通过set()方法进行属性的设定。
4、设置属性时可选的标签:
value :基本类型(包装类型)或String 类型 ref :引用工厂中其它的bean list :List 或数组类型
set :Set 类型。用法与list 类似。 map :Map 类型
props :Properties 类型,键值为String 类型的,所以直接写值。 举例:
List Set
Map Properties
如果key依赖其它对象用key-ref, 如果还是一个Map,可再嵌套。
◆abstract 属性
如果在配置文件中把某个方法设置成为abstract=“true”的(缺省false ),那么不能通过beanFactory 获得bean 的实例。
◆lazy-init属性
如果使用的是XmlBeanFactory来获得beanFactory:缺省的是延迟加载,如果不想延迟加载,则需要把工厂bean实例的lazy-init设置为false,例如:
5、自动装配:自动将某个bean 注入到另一个bean的属性当中。
(bean标签的autowire属性)其分类如下表:(大型应用不推荐使用,因为可读性太差)
模式说明
no 不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。
byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置
dependency-check="objects"让Spring抛出异常。
constructor
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中
没有找到与构造器参数类型一致的bean,那么将会抛出异常。
模式 说明
autodetect 通过bean 类的自省机制(introspection )来决定是使用constructor 还是
byType 方式进行自动装配。如果发现默认的构造器,那么将使用byType 方
式。
6、依赖检查:检查bean 的属性是否完成依赖关系的注入
(bean 标签的dependency-check 属性)
? 作用:检查bean 的属性是否完成依赖关系的注入 ? 分类:
错误!未找到引用源。.simple : 只查看简单的类型是否完成依赖注入(基本类型和字符串)
错误!未找到引用源。.objects:
检查对象类型是否完成依赖注入 错误!未找到引用源。.all: 检查全部的类型是否完成依赖注入。 错误!未找到引用源。.none: 默认的设置,表示不检查依赖性。
7、生命周期方法:
init-method (也可实现接口org.springframework.beans.factory.InitializingBean ) destroy-method(也可实现接口DisposableBean)
8、单例bean :默认情况下,从bean 工厂所取得的实例为Singleton (bean 的singleton 属性)
9、Aware 相关接口:可以通过实现Aware 接口来获得Spring 所提供的资源或使用某些功能。 ● org.springframework.beans.factory.BeanNameAware 此接口用得不多
实现BeanNameAware 接口的Bean 类,在依赖关系设定完成后、初始化方法之前,会将Bean 在定义文件中的名称通过setBeanFactory()方法设定给Bean 。
● org.springframework.beans.factory.BeanFactoryAware 要重视
实现BeanFactoryAware接口的类,在依赖关系设定完成后、初始化方法之前,Spring 容器将会注入BeanFactory的实例。
放弃一些反向控制,在需要B对象时再根据需要
●org.springframework.context.ApplicationContextAware
10、ApplicationContext的功能扩展:
org.springframework.context.ApplicationContext,其基本功能与BeanFactory很相似,还提供一个应用程序所需的更完整的框架功能。例如:提供取得资源文件更方便的方法、提高文字消息解析方法、支持国际化消息等。
错误!未找到引用源。.BeanPostProcessor:若想在Spring对bean完成依赖注入之后,再补充一些后续操作,则可以定义一个bean类来实现接口:
org.springframework.beans.factory.config.BeanPostProcessor,然后在配置文件中定义该bean 类;从而Spring容器会在每一个bean被初始化之前、之后分别执行实现了该接口的bean
类的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法;
错误!未找到引用源。.BeanFactoryPostProcessor:对Bean工厂修改其它支持。
●CustomEditorConfigurer:可借助实现了接口java.beans.PropertyEditor的类,并依据当中
的实现,将字符串类型转换为指定类型的对象;
●PropertyPlaceholderConfigurer:可将配置文件中属性值用“${key}”形式表示,则会将
其值替换成指定的属性文件中key所对应的value;
●PropertyOverrideConfigurer:可借助该类在指定的属性文件中设定一些优先的属性(将
忽略配置文件中对应属性的设定值);
(注意:属性文件中设定属性值的格式为:beanName.propertyName=value)
错误!未找到引用源。.国际化消息的支持:可通过ApplicationContext(继承于MessageSource)的getMessage()方法获得指定资源文件中的消息;配置如下:
错误!未找到引用源。.事件的支持:
可发布的事件:ApplicationEvent
发布事件的方法:publishEvent (ApplicationEvent ) 事件监听接口:ApplicationListener
11、ApplicationContext 管理bean 的执行阶段:(他回预先实例化所有的singleton bean) ●创建bean ;
●属性注入(依赖关系的注入);
●BeanNameAware 接口实现类的setBeanName ()方法; ●BeanFactoryAware 接口实现类的setBeanFactory ()方法;
●ApplicationContextAware 接口实现类的setApplicationContext ()方法;
●BeanPostProcessor 接口实现类中的postProcessBeforeInitialization ()方法;
(init 方法调用前要做的后续操作)
●InitializingBean 接口实现类的afterPropertiesSet ()方法; ●Bean 定义文件中init-method 属性所指定的方法;
●BeanPostProcessor 接口实现类中的postProcessAfterInitialization ()方法; 12、FactoryBean :用来创建bean
(注意:通过bean 工厂的getBean(“myObject ”)得到的是FactoryBean 所生产的产品;getBean(“&myObject ”)得到的是FactoryBean 实例本身)
三、AOP (Aspect-orented programming )面向层面编程 重点、难点
1、AOP 学习目标:
使所需要的功能能够加在任何类中,而不需要调用。
错误!未找到引用源。借助于Spring 编写一个自己的切面,加到任何一个Java 中; 错误!未找到引用源。Spring 本身也提供了编写好的切面功能。
切面有最大程度的复用性,耦合度趋于零。在事务方面,AOP 用得较成功。 2、代理的两种方式: ◆
静态代理:
? 针对每个具体类分别编写代理类; ? 针对一个接口编写一个代理类; ◆ 动态代理:
? 针对一个方面编写一个InvocationHandler ,然后借用JDK 反射包中的Proxy 类为各
种接口动态生成相应的代理类
AOP 的主要原理:动态代理 (研究一下动态代理的写法) 3、AOP 中思想和名词术语:
● Aspect :方面,层面,切面。是一段能够被“植入”到程序中的代码; ● Join Point :结合点、联结点;加入业务流程的点或时机;
● Pointcut :切入点、作用点;指定某个方面在哪些联结点织入到应用程序中 ● Advice :通知、行为;某个方面的具体实现,代表了一个动作. ● Advisor :切入点配置器,由Pointcut 和Advice 共同构成
● Pointcut :Spring 根据类名称及方法名称定义Pointcut ,表示Advice 织入至应用程序的
时机;org.springframework.aop.Pointcut ● ProxyFactoryBean :用来创建代理对象
LogHandler
Jointpoint Jointpoint Jointpoint
SecurityHandler
Aspects
Cross-cuting concerns
被辨认为 Pointcuts
… …
根据
具体设计为Advices
Weave
Logging
业务流程1 业务流程2 业务流程3
创建代理对象需指定的三要素:
错误!未找到引用源。target:设定目标对象(只能是一个);
错误!未找到引用源。proxyInterfaces:设定代理接口(目标对象所实现的接口);
错误!未找到引用源。interceptorNames:设定拦截器的名字(各个advice或advisor bean 的列表)
Advice:五种(根据织入的时机不同而划分)
●Before Advice:在目标对象的方法执行之前加入行为;
要实现的接口:org.springframework.aop.MethodBeforeAdvice
●After Advice:在目标对象的方法执行之后加入行为;
要实现的接口:org.springframework.aop.AfterReturningAdvice
●Throw Advice:在目标对象的方法发生异常时加入行为;
要实现的接口:org.springframework.aop.ThrowsAdvice
●Around Advice:在目标对象的方法执行前后加入行为;
要实现的接口:org.aopalliance.intercept.MethodInterceptor
●Introduction Advice:引入的行为(增加了可操作的方法)。
◆声明要添加的功能接口;
◆创建引入Advice;
(继承org.springframework.aop.support.DelegatingIntroductionInterceptor,并实现添加的功能接口)
◆在配置文件中定义一个DefaultIntroductionAdvisor的bean。
(需要两个构造方法的参数:Advice和添加的功能接口)
●PointcutAdvisor:Pointcut定义了Advice的应用时机;在Spring中,使用PointcutAdvisor
将Pointcut和Advice结合为一个对象。
●NameMatchMethodPointcutAdvisor:可用来指定Advice所要应用的目标对象上的方法名称
●RegexpMethodPointcutAdvisor:可使用Regular expression定义Pointcut,在符合Regular
expression的情况下应用Advice,其pattern属性用来指定所要符合的完整类名(包括package名称)及方法名;定义该属性时可使用的符号包括:
符号描述
. 符合任意一个字符
+ 符合前一个字符一次或多次
* 符合前一个字符零次或多次
\ 转义字符,用来转义正则表达式中使用到的字符
●AutoProxy:自动代理
?BeanNameAutoProxyCreator:根据bean的名字为其自动创建代理对象,bean工厂自动返
回其代理对象:
?DefaultAdvisorAutoProxyCreator:自动将Advisor应用到符合Pointcut的目标对象上
四、Spring的Web MVC
1、DispatcherServlet:作为前端控制器,负责分发客户的请求到Controller;
在web.xml中的配置如下:
2、Controller:负责处理客户请求,并返回ModelAndView实例;
Controller必须实现接口org.springframework.web.servlet.mvc.Controller,实现该接口中的方法handleRequest(),在该方法中处理请求,并返回ModelAndView实例
3、HandlerMapping:DispatcherServlet根据它来决定请求由哪一个Controller处理;
?默认情况下,DispatcherServlet将使用org.springframework.web.servlet.handler.
BeanNameUrlHandlerMapping,即使用和客户请求的URL名称一致的Controller的bean实例来处理请求;
?另外一种常用的HandlerMapping为org.springframework.web.servlet.handler.
SimpleUrlHandlerMapping,配置如下:
在以上“mappings”属性设置中,“key”为请求的URL,而“value”为处理请求的Controller 的bean名称
4、ModelAndView:用来封装View与呈现在View中的Model对象;
DispatcherServlet根据它来解析View名称,并处理呈现在View中的Model对象
5、ViewResolver:DispatcherServlet委托ViewResolver来解析View名称;
常用的ViewResolver实例配置如下:
Cglig库作用1、Spring通过调用cglib在客户端的类之上修改二进制码。
2、能够给某一个类生成子类(Hibernate中也要用到,用来生成子类)。
CGLIB用来生成动态代理类(dynamic proxy classes),供核心DI和AOP实现之用,所
以大量Spring功能都要用到CGLIB。
五、Spring Data Access
1、Template
2、Dao Support
3、Transaction Manager
4、Transaction Proxy
Spring对Hibernate的集成:
Spring与Struts的集成
如下3种方式:
错误!未找到引用源。、使用Spring的ActionSupport类整合Struts。
错误!未找到引用源。、使用Spring的DelegatingRequestProcessor覆盖Struts的RequestProcessor。
错误!未找到引用源。、将Struts Action管理委托给Spring框架。
SSH编程示例图:
附:行业的一些名词术语
CRM ERP OSS BSS BOSS OA Pre-Sale
CRM客户关系管理Customer Relationship Management ERP企业资源规划Enterprise Resource Planning
OSS运营支撑系统Operation Support System
BSS业务支撑系统Business Support System
BOSS业务运营支撑系统Business Operation Support System OA办公自动化Office Automatization
Pre-Sale售前(基本上什么都要会)