Spring框架介绍


1 一、基本概念 Spring 的核心是轻量级(Lightweight)的容器(Container),它实现了 IoC 容器、非侵 入性(No intrusive)的框架,并提供 AOP概念的实现方式,提供对持久层(Persistence)、 事务(Transaction)的支持,提供 MVC Web 框架的实现,并对一些常用的企业服务 A PI(Application Interface)提供一致的模型封装,是一个全方位的应用程序框架(Application framework),另外,Spring 也提供了对现有框架(Struts、JSF、Hibernate 等)的整合方案。 Spring 旨在分离体系结构的层次,因此每一层都可以修改而不会影响到其它层。每一层 都不知道其上层的关注点;就其可能而言,只对所紧挨的下一层有依赖。层与层之间的依赖 通常是以接口的形式表现,以确保其耦合尽可能松散。 容器管理事务,容器,贯穿始终:1、对象生命周期的管理。 2、容器本身具备功能, 加在自己的类中。需要自己调用则为显示调用。 而尽量用容器隐式调用,Spring 即为隐式 调用、声明式编程。 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 文件。 Author:LuJianyu 2007-6-28 对现有表现层的支持与ORM紧密结合,可使用声明式事务管理 AOP标准接口的实 现(容器管理的声 明式的种种事务) 对JDBC 采用模板 回调;声明的 JDBC 事务管理. 提供了 Bean 工厂 对Bean 工厂的扩 展(比如对事务、 国际化的支持) 自己的 MVC 实现 2 总之,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 框架进行集成。 二、IoCIoCIoC IoC (InversionInversionInversion Inversion ofofof of ControlControlControl Control ) 1、定义:组件之间的依赖关系由容器在运行时决定。 例如:B对象所依赖的 A对象是由 Spring 创建好并且通过 Set 方法传递注入过来的。 最基本的优点体现在:若 A为接口,让 B依赖于接口。只看接口不管实现类。 可把工厂类 全部替换掉。对象均为容器创建。到时还能把容器的功能融入到其中 。 IoC 要求:容器尽量不要侵入到应用程序中去,应用程序本身可以依赖于抽象的接口, 容器根据这些接口所需要的资源注入到应用程序中,也就是说应用程序不会主动向容器 请求资源;容器会自动把这些对象给应用程序。 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 的三种方式:  通过构造方法直接创建: JavaBeanJavaBeanJavaBean JavaBean 调用/// / 包含 SpringSpringSpring Spring 控制权由对象本身转向容器;由容器根 据配置文件去创建实例并创建各个实例 之间的依赖关系。 3  通过静态工厂方法创建:  通过非静态工厂方法创建: 3、Spring 中实现 IoC 的方式:依赖注入(Dependency Injection) Spring 中依赖注入的两种方式:  通过 setter 方法注入: 其中,name 属性的取值依 setter 方法名而定。Spring 推荐使用 setter 方法注入  通过构造方法注入: 其中,index 表示构造方法中的参数索引(第一个参数索引为 0),type 表示构造方法中参 数的类型。  两种注入方式的区别:  Constructor: 可以在构建对象的同时,把依赖关系也构建好。对象创建后好就已经准 备好了所有的资源,安全性高。  Setter: 创建完对象之后再通过 set()方法进行属性的设定。 4、设置属性时可选的标签: value:基本类型(包装类型)或 String 类型 ref:引用工厂中其它的 bean list:List 或数组类型 set:Set 类型。用法与 list 类似。 map:Map 类型 props:Properties 类型,键值为 String 类型的,所以直接写值。 4 举例: ListListList List SetSetSet Set MapMapMap Map PropertiesPropertiesProperties 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 元素指定依赖,这是默认设置。由于显式指定协作者可以使配 置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是 系统架构的一种文档形式。 byNamebyNamebyName byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的 bean,并将其与 属性自动装配。例如,在 bean 定义中将 autowire 设置为 by name,而该 bean 包含 master 属 5 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.BeanNameAwareBeanNameAwareBeanNameAware BeanNameAware 此接口用得不多 实现 BeanNameAware 接口的 Bean 类,在依赖关系设定完成后、初始化方法之前,会 将Bean 在定义文件中的名称通过 setBeanFactory()方法设定给 Bean。 模式 说明 性(同时提供 setMaster(..)方法),Spring 就会查找名为 master 的bean 定义,并用它来装 配给 master 属性。 byTypebyTypebyType byType 如果容器中存在一个与指定属性类型相同的 bean,那么将与该属性自动装配。如果存在多个 该类型的 bean,那么将会抛出异常,并指出不能使用 byType 方式进行自动装配。若没有找到 相匹配的 bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过 设置 dependency-check="objects"让Spring 抛出异常。 constructorconstructorconstructor constructor 与byType 的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器 参数类型一致的 bean,那么将会抛出异常。 autodetectautodetectautodetect autodetect 通过 bean 类的自省机制(introspection)来决定是使用 constructor 还是 byType 方式进行 自动装配。如果发现默认的构造器,那么将使用 byType 方式。 6  org.springframework.beans.factory.BeanFactoryAwareBeanFactoryAwareBeanFactoryAware BeanFactoryAware 要重视 实现 BeanFactoryAware 接口的类,在依赖关系设定完成后、初始化方法之前,Spring 容器将会注入 BeanFactory 的实例。 放弃一些反向控制,在需要 B对象时再根据需要   org.springframework.context.ApplicationContextAwareApplicationContextAwareApplicationContextAware ApplicationContextAware 10、ApplicationContext ApplicationContext ApplicationContext ApplicationContext 的功能扩展: org.springframework.context.ApplicationContext,其基本功能与 BeanFactory 很相似,还 提供一个应用程序所需的更完整的框架功能。例如:提供取得资源文件更方便的方法、提高 文字消息解析方法、支持国际化消息等。 ①.BeanPostProcessorBeanPostProcessorBeanPostProcessor BeanPostProcessor :若想在 Spring 对bean 完成依赖注入之后,再补充一些后续操作, 则可以定义一个 bean 类来实现接口: org.springframework.beans.factory.config.BeanPostProcessorBeanPostProcessorBeanPostProcessor BeanPostProcessor ,然后在配置文件中定义该 bean 类;从而 Spring 容器会在每一个 bean 被初始化之前、之后分别执行实现了该接口的 bean 类的 postProcessBeforeInitialization()方法和 postProcessAfterInitialization()方法; ②.BeanFactoryPostProcessorBeanFactoryPostProcessorBeanFactoryPostProcessor BeanFactoryPostProcessor :对 Bean 工厂修改其它支持。  CustomEditorConfigurer:可借助实现了接口 java.beans.PropertyEditor 的类,并依据当中 的实现,将字符串类型转换为指定类型的对象;  PropertyPlaceholderConfigurer:可将配置文件中属性值用“${key}”形式表示,则会将 其值替换成指定的属性文件中 key 所对应的 value;  PropertyOverrideConfigurer:可借助该类在指定的属性文件中设定一些优先的属性(将 忽略配置文件中对应属性的设定值); (注意:属性文件中设定属性值的格式为:beanName.propertyName=value) ③.国际化消息的支持:可通过 ApplicationContext(继承于 MessageSource)的 getMessage() 方法获得指定资源文件中的消息;配置如下: 7 ④.事件的支持: 可发布的事件:ApplicationEvent 发布事件的方法:publishEvent(ApplicationEvent) 事件监听接口:ApplicationListener 11、ApplicationContext 管理 bean 的执行阶段: 创建 bean; 属性注入(依赖关系的注入); BeanNameAware 接口实现类的 setBeanName()方法; BeanFactoryAware 接口实现类的 setBeanFactory()方法; ApplicationContextAware 接口实现类的 setApplicationContext()方法; BeanPostProcessor 接口实现类中的 postProcessBeforeInitialization()方法; InitializingBean 接口实现类的 afterPropertiesSet()方法; Bean 定义文件中 init-method 属性所指定的方法; BeanPostProcessor 接口实现类中的 postProcessAfterInitialization()方法; 12、FactoryBean:用来创建 bean (注意:通过 bean 工厂的 getBean(“myObject”)得到的是 FactoryBean 所生产的产品; getBean(“&myObject”)得到的是 FactoryBean 实例本身) 三、AOPAOPAOP AOP (Aspect-orentedAspect-orentedAspect-orented Aspect-orented programmingprogrammingprogramming programming )面向层面编程 重点、难点 1、AOP学习目标: 使所需要的功能能够加在任何类中,而不需要调用。 ①借助于 Spring 编写一个自己的切面,加到任何一个 Java 中; ②Spring 本身也提供了编写好的切面功能。 切面有最大程度的复用性,耦合度趋于零。在事务方面,AOP用得较成功。 2、代理的两种方式:  静态代理:  针对每个具体类分别编写代理类;  针对一个接口编写一个代理类; 8  动态代理:  针对一个方面编写一个 InvocationHandler,然后借用 JDK 反射包中的 Proxy 类为各 种接口动态生成相应的代理类 AOP的主要原理:动态代理 研究一下动态代理的写法。 3、AOP中思想和名词术语:  Aspect:方面,层面  Joinpoint:结合点、联结点;加入业务流程的点或时机  Pointcut:切入点、作用点;指定某个方面在哪些联结点织入到应用程序中  Advice:通知、行为;某个方面的具体实现  Advisor:由 Pointcut 和Advice 共同构成  Pointcut:Spring 根据类名称及方法名称定义 Pointcut,表示 Advice 织入至应用程序的 时机;org.springframework.aop.Pointcut  ProxyFactoryBean:用来创建代理对象 Advice/Advisor bean LogHandler JointpointJointpoint Jointpoint SecurityHandler Aspects Cross-cuting concerns 被辨认为 Pointcuts … … 根据 具体设计为 AdvicesAdvicesAdvices Advices WeaveWeaveWeave Weave LoggingLoggingLogging Logging 业务流程1 业务流程2 业务流程3 9 创建代理对象需指定的三要素: ①target:设定目标对象(只能是一个); ②proxyInterfaces:设定代理接口(目标对象所实现的接口); ③interceptorNames:设定拦截器的名字(各个 advice 或advisor bean 的列表) AdviceAdviceAdvice 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 所要应用的目标对象上的方法名称 10 RegexpMethodPointcutAdvisor:可使用 Regular expression 定义Pointcut,在符合 Regular expression 的情况下应用 Advice,其 pattern 属性用来指定所要符合的完整类名(包括 package 名称)及方法名;定义该属性时可使用的符号包括:   AutoProxy:自动代理 BeanNameAutoProxyCreator:根据bean 的名字为其自动创建代理对象,bean 工厂自动返 回其代理对象: DefaultAdvisorAutoProxyCreator:自动将 Advisor 应用到符合 Pointcut 的目标对象上 符号 描述 ... . 符合任意一个字符 +++ + 符合前一个字符一次或多次 *** * 符合前一个字符零次或多次 \\\ \ 转义字符,用来转义正则表达式中使用到的字符 11 四、Spring Spring Spring Spring 的WebWebWeb Web MVCMVCMVC 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 实例配置如下: 12 Cglig 库作用1、Spring 通过调用 cglib 在客户端的类之上修改二进制码。 2、能够给某一个类生成子类(Hibernate 中也要用到,用来生成子类)。 CGLIB 用来生成动态代理类(dynamic proxy classes),供核心 DI和AOP实现之用,所 以大量 Spring 功能都要用到 CGLIB。 五、SpringSpringSpring Spring DataDataData Data AccessAccessAccess 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 SSH SSH SSH 编程示例图: 13 附,行业的一些名词术语: CRMERPOSSBSSBOSSOA Pre-Sale CRMCRMCRM CRM 客户关系管理 Customer Relationship Management ERPERPERP ERP 企业资源规划 Enterprise Resource Planning OSSOSSOSS OSS 运营支撑系统 Operation Support System BSSBSSBSS BSS 业务支撑系统 Business Support System BOSSBOSSBOSS BOSS 业务运营支撑系统 Business Operation Support System OAOAOA OA 办公自动化 Office Automatization Pre-SalePre-SalePre-Sale Pre-Sale 售前(基本上什么都要会) 卢剑宇 lujy@tarena.com.cn 2007-06-29 于Tarena
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 5 人已下载

下载pdf

pdf贡献者

sbngj

贡献于2010-12-05

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf