Spring笔记——将spring进行到底.doc_第1页
Spring笔记——将spring进行到底.doc_第2页
Spring笔记——将spring进行到底.doc_第3页
Spring笔记——将spring进行到底.doc_第4页
Spring笔记——将spring进行到底.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

chapter01 Spring简介一、Spring是什么? 业务层框架的动机-快速构建Java 企业应用,框架简化开发过程,提供公共服务和便利的工具1)使组件松散耦合,组件依赖可配置2)提供公共服务:比如 事务、安全3)简化使用 j2ee 的技术在了解Spring之前,我们来了解在Java EE框架下企业级开发采用EJB框架的一些不足: (1) EJB太笨重,而且Entity EJB不能脱离容器 (2) 企业级服务使用困难 (3) 开发的复杂度太高 (4) 侵入式方案,EJB要使用特定的接口 因此,Spring应运而生。3 Spring 的3个核心特性IOC - Inverse of control 使得业务组件都处在框架的管理之下框架可以管理组件的创建和依赖关系框架可以提供可以配置的服务AOPAspect Oreinted Programming在不修改组件的前提下,为组件提供扩展的服务简化对j2ee技术的使用更方便的使用 j2ee 的技术jdbc / orm / struts Spring是一个开源的用于简化采用Java语言开发企业级程序的一个分层的框架。关于程序的分层结构:1、Presentation layer(表示层) (1) 表示逻辑(生成界面代码) (2) 接收请求 (3) 处理业务层抛出的异常 (4) 负责规则验证(数据格式,数据非空等) (5) 流程控制2、Service layer(服务层/业务层) (1) 封装业务逻辑处理,并且对外暴露接口 (2) 负责事务,安全等服务3、Persistence layer(持久层) (1) 封装数据访问的逻辑,暴露接口 (2) 提供方便的数据访问的方案(查询语言,API,映射机制等)Domain layer(域层) (1) 业务对象以及业务关系的表示 (2) 处理简单的业务逻辑 (3) 域层的对象可以穿越表示层,业务层,持久层二、Spring的作用为什么要使用Spring? (1) 简化企业级开发 封装了大部分的企业级服务,提供了更好的访问这些服务的方式 提供了IOC,AOP功能的容器,方便编程 (2) 遵循Spring框架的应用程序,一定是设计良好的,针对接口编程,这样就简化了企业级程序的设计。 (3) Spring的组成 Spring Core:核心容器,BeanFactory提供了组件生命周期的管理,组件的创建,装配,销毁等功能 SpringContext:ApplicationContext,扩展核心容器,提供事件处理、国际化等功能。它提供了一些企业级服务的功能,提供了JNDI,EJB,RMI的支持。 Spring AOP:提供切面支持 Spring DAO:提供事务支持,JDBC,DAO支持 Spring ORM:对流行的O/R Mapping封装或支持 Spring Web:提供Web应用上下文,对Web开发提供功能上的支持,如请求,表单,异常等。 Spring Web MVC:全功能MVC框架,作用等同于Struts。chapter02 Spring的IoC一、IoC的概念IoC,Inversion of Control,控制反转。 对象的协作关系由对象自己负责。 依赖注入:对象的协作关系由容器来建立。二、IoC的类型 (1) 基于特定接口(侵入式方案) (2) 基于set方法 (3) 基于构造器三、Spring容器 Spring容器负责生成、组装、销毁组件,并负责事件处理、国际化等功能。 (1) BeanFactory 核心容器,负责组件生成和装配 实现主要包括Xml BeanFactory (2) ApplicationContext (3) WebApplicationContext (4) 四、IoC的使用 Resource:interface,用来包装资源 implements :ClassPathResource 在类路径下查找资源另有 FileSystemResource xmlBeanFactory:BeanFactory的一个实现,使用Resource对象来查找配置文件 BeanFactory.gerBean(“BeanId”):取得以参数命名,或者Id等于参数值的一个Bean实例。 BeanFactory(容器)在默认情况下,会采用单例方式返回对象。容器只到调用getBean方法时,才会实例化某个对象。 (1) Spring可以采用XML或者.properties文件作配置 (2) 配置文件(XML) 根元素可以有多个子元素,每个代表一个需要装配的对象。五、bean 的创建,通过构造方法和工厂创建(1)通过构造方法:consctructor注入无参的构造方法有参的构造方法,需指明构造方法的参数列表,通过: 如果Bean属性不多,并且属性值必须要注入才能使用,则应该采用constructor注入,其他情况就要set方法注入。(2).通过工厂方法获得 bean 对象bean 没有公共的构造方法,需通过工厂类或工厂实例来创建分为静态工厂和实例工厂方法两种情况.实例工厂配置代码:-奥迪A8/方法参数的处理sql800000.0/先创建工厂实例-.静态工厂配置奥迪A8800000.0.单例 beanbean 工厂生产bean 缺省都是单例的scope 属性scope=singleton|prototype|request|session后两者用于web应用中 六、依赖注入 1、构造方法注入 2、setter注入 3、接口注入(有侵入性)1、setter注入 (1) 注入简单属性(String和8中基本类型) parameterValue 对于基本类型,Spring容器会自动作类型转换,以便赋值。 (2) 注入对象 A、让Spring容器在当前配置文件中找到相应的Bean,并调用set方法,注入该Bean。 B、将一个Bean的定义嵌套在另一个Bean中(可读性差),被嵌套的Bean不能采用getBean()返回 C、采用搜索多个配置文件来注入 (3) 注入集合类型 Set Set中存放字符串,对象,集合,不允许重复shubook List (数组也用它了) List中可以放入字符串,对象,List 与Set一样 Map Map 有子元素来存取key,value,key只能为String200-1.23 Properties Properties有子元素zhangsan132、构造方法注入:见前面bean的创建(构造方法)3、spring 直接利用了 bean 的 set 或 构造方法,避免了使用接口注入的侵入性 七、解决依赖注入的遗留关系1、装配关系检查(Dependency checking) 让容器检测 bean 所有的依赖是否都已经满足,某个 bean 需要设置好所有属性,防止遗漏装配,在运行后出现莫名奇妙的情况 simple:检查简单类型,String 和 集合 ojects:检查对象类型,对其他对象的依赖 all:检查所有 none: 默认值2、装配方式:、自动装配(Autowring Properties)装配方式:byName,byType,autodetect,constructorautowire=“byName”:按照名称匹配按照Bean的Id与属性的名称进行匹配autowire=“byType”:按照类型匹配要注入的属性类型与配置文件中的Bean类型匹配的个数超过一个,会出错。autowire=“antodetect”:先按照construct,后按照byType。autowire=“constructor”:先去匹配构造器中参数类型,后与配置文件中的Bean类型匹配。autowire-candidate 属性指明是否作为 autowire 的候选对象,解决多个候选对象的冲突autowire-candidate=trueautowire-candidate=false、自动装配与手动装配可以结合使用,手动装配会覆盖自动装配。、比较两种注入方式关于自动匹配: 优点:快速开发 缺点:依赖关系不清楚,易出错,不易维护。自动匹配的应用场合: (1) 构建系统原型 (2) 与依赖关系检查(Dependency-check)结合使用 (3) 自动装配与手动装配结合3、管理 Bean 生命周期生命周期、构造、set、回调初始化方法、getBean 返回回调方法:两个属性指明init-method destroy-method 或实现两个接口:(框架的侵入性)InitiallizingBeanDisposableBean4、重用 bean 定义parent - 继承 bean 定义bean 之间不一定有继承关系abstract - 只作为模板,不可以被实例化,不作为bean使用其子类bean继承其定义并且被应用5、延迟加载beanbean 的加载时机预先加载:构造 bean 工厂时实例化所有bean延迟加载:getBean 时构造,先构造依赖的beanBeanFactory 总是延迟加载的ApplicationContext ,BeanFactory 的扩展预先加载 单例 bean,lazy-init (true|false)6、补充:name 代替 id: 取名要求比较宽泛,一个bean可定义多个name,空格或逗号隔开id= /取名要求比较严格,不能有特殊字符name=/myBeanname=a b c/3个名字有业务相关的成员变量才考虑多线程并发访问的安全问题7、在 bean 中获得工厂引入接口:BeanFactoryAware ApplicationContextAware工厂通常对 bean 是透明的 (即bena并不最大beanFactory的存在)某些时候 bean 需要知道工厂(获得工厂的引用),并不可避免的引入侵入性implements BeanFactoryAwaresetBeanFactory(BeanFactory bf)this.bf=bf;八、ApplicationContext 是对BeanFactory 的扩展,为应用提供事件框架和国际化的支持,预先实例化所有单例bean: 在实际过程中我们,优先选择 ApplicationContext 1、特殊的IoC 后处理Bean 接口:org.springframework.beans.factory.config.BeanPostProcessor允许在bean在构造好后做附加的处理,没有类的源代码改变类的属性 Spring已经实现该接口的BeanPostProcessor(不用再注册) ApplicationContextAwareProcessor: 把应用上下文传递给所用实现了 ApplicationContextAware接口的Bean ApplicationContextAware接口使用举例,可参照事件监听机制 DefaultAdvisorAutoProxyCreator自动对Bean应用切面1)实施 BeanPostProcessor:(1). public class UserModelUpdate implements BeanPostProcessor public Object postProcessAfterInitialization(Object bean, String beanId)throws BeansException if(bean instanceof UserModel)UserModel model = (UserModel) bean;model.setName(model.getName().toUpperCase();return bean;public Object postProcessBeforeInitialization(Object arg0, String arg1)throws BeansException return arg0 ;(2).beans.xml 中声明 UserModelUpdate Bean工厂后处理 接口: (只能在应用上下文中使用)org.springframework.beans.factory.config.BeanFactoryPostProcessor Bean 工厂的 plug-in可以在用户使用 bean 工厂前完成某些设置通常不需要扩展,spring 提供了几个实现CustomEditorConfigurer 对属性编辑器的支持PropertyPlaceHolderConfigurer 让appliction context 在属性文件中读取某些配置 PropertyOverrideConfigurer 在属性文件中配置属性覆盖 beans.xml 中的属性值1)对属性编辑器的支持属性编辑器可以把字符串转换为期望的类型实施:(1). 定义属性编辑器,包装转换规则AddressEditor extends PropertyEditorSupportpublic void setAsText(String text) /包装转换规则,得到对象public Object getValue(); /返回对象(2) 把属性编辑器注册给 appliction context /要转换的类 /编辑器类shaoyang,422317 /用此字符串组装对象2)让appliction context 在属性文件中读取某些配置实施:(1).属性文件 wxl/spring/resource/perties(2).引用属性文件的属性$key(3).注册属性文件wxl/spring/resource/perties3)在属性文件中配置属性覆盖 beans.xml 中的属性值实施:(1).注册属性文件wxl/spring/resource/perties(2) 在属性文件中,按以下规则覆盖属性beanid.beanpropername=new value 2、事件处理事件监听 提供了一个观察者模式的框架,快速实现组件间的事件通知实施: 1)自定义事件,通过继承org.springframework.context.ApplicationEvent 2)所有想得到通知的对象都自定义监听器,实现 org.springframework.context.ApplicationListener,并注册 3)发布事件,为得到应用上下文, 必须实现org.springframework.context.ApplicationContextAware接口事件源发出事件:applicationContext.publishEvent(event);自定义事件类什么时候需要?被观察者在需要传输数据给观察者时怎么做?自定义事件类通过继承org.springframework.context.ApplicationEvent3、国际化的支持(I18N)ApplicationContext 可以读取国际化的消息文件getMessage();实施:1)注册消息源wxl/spring/resource/WxlResource或wxl/spring/resource/WxlResourcebean 的id 必须是messageSource WxlResource是去掉后缀的名字2)读取消息ApplicationContext 的方法:ApplicationContext factory = new ClassPathXmlApplicationContext(application.xml);factory.getMessage(String key,String args,Locale l);key - 消息的keyargs- 插入到消息中的参数 国际化文件中name=Hello0Lucynew String l - 区域Locale 语言和区域代码的封装对象locale=new Local(zh,CN);local=Locale.getDefault();思考:工厂管理的组件怎样使用获得国际化消息bean必须知道工厂的存在,实现ApplicationContextAware接口,chapter03 Spring的AOP一、AOP(Aspect-oriented programming,面向切面编程): 什么是AOP? 定义:将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。二、AOP核心概念 1、Aspect(切面) 切面,是对交叉业务逻辑的统称。 2、Joinpoint(连接点) 连接点,指切面可以织入到目标对象的位置(方法,属性等)。 3、Advice(通知) 通知,指切面的具体实现。 4、Pointcut(切入点) 切入点,指通知应用到哪些类的哪些方法或属性之上的规则。 5、Introduction(引入) 引入,指动态地给一个对象增加方法或属性的一种特殊的通知。 6、Weaving(织入) 织入,指将通知插入到目标对象。 7、Target(目标对象) 目标对象,指需要织入切面的对象。 8、Proxy(代理对象) 代理对象,指切面织入目标对象之后形成的对象。三、Spring AOP原理 采用动态代理模式。 Spring AOP采用动态代理的过程:(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;(2) 目标对象如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP。四、Spring的通知1、Spring的通知类型(1) MethodBeforeAdvice 类全名:org.springframework.aop.MethodBeforeAdvice 在方法调用之前,做处理。 不能够改变返回值 不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)(2) AfterReturningAdvice 类全名:org.springframework.aop.AfterReturningAdvice 在方法调用之后,做处理。 不能够改变返回值 不能够改变目标方法的流程,也不能中断流程的处理过程(除非抛出异常)(3) MethodInterceptor 类全名:ercept.MethodInterceptor在方法调用之前以及之后,做处理。 可以改变返回值,也可以改变流程。(4) ThrowsAdvice 类全名:org.springframework.aop.ThrowsAdvice实现方法void afterThrowing(Method, args, target, ThrowableSubclass);/要么4个要么1个参数在方法抛出异常后,做处理。 当该通知处理完异常后,会简单地将异常再次抛出给目标调用方法。2、配置过程: 实现接口的列表,可选aop.IFoo 需要织入到目标对象的切面myMethodInterceptormyMethodBeforeAdvicemyAfterReturningAdvicemyThrowsAdvice/注意 : name 都是死的,不能改的(4)客户端使用动态代理来访问目标对象的方法。IFoo foo = (IFoo) context.getBean(foo); 注意:在默认情况下,通知会应用到所有的方法之上。ProxyFactoryBean的作用: 依照配置信息,将切面应用到目标对象,生成动态代理对象。 (1) Spring只支持方法连接点,不支持属性连接点。(原因是Spring AOP采用的是动态代理模式,而动态代理本身就是在方法调用前加入代码。) (2) Spring只在运行时,将切面织入到目标对象。(有些AOP实现,可以在编译时织入切面到目标对象。)五、切入点(Pointcut) 1、Pointcut 切入点是指通知/切面可以应用到哪些类,哪些方法之上。相当于过滤器,缩小拦截的方法的范围。概要:缩小接口或类的范围,缩小方法的范围 Pointcut API Pointcut:org.springframework.aop.Pointcut对某些类某些方法应用切面。 ClassFilter:org.springframework.aop.ClassFilter用来过滤类(哪些类可以应用切面) MethodMather:org.springframework.aop.MethodMatcher用来过滤方法(类中哪些方法应用切面) Advisor:org.springframework.aop.PointcutAdvisor将Pointcut与Advice结合到一起 2、自定义切入点: 步骤:1) implements Pointcut public class MyPointcut implements Pointcut /站在接口和类的角度上缩小过滤的范围public ClassFilter getClassFilter() /return ClassFilter.TRUE;return new ClassFilter()public boolean matches(Class c) if(IFoo.class.isAssignableFrom(c)return true;return false;/站在方法的级别上缩小范围public MethodMatcher getMethodMatcher() return new MethodMatcher()/该方法return true,意味着要对方法参数过滤,要调用3个参数的matches方法public boolean isRuntime() return true;/在这可以只考虑过滤方法public boolean matches(Method m, Class arg1) if(m.getName().equals(doA) | m.getName().equals(doB)return true;return false;public boolean matches(Method arg0, Class arg1, Object arg2) return true;/arg2就是参数列表,可以对此作处理;2) 把 pointcut 和 advice 组合成一个 advisor 对象3) 然后把 advisor 添加到 interceptorNames 中advisor2、预定义切入点 静态切入点:a、NameMatchMethodPointAdviosr org.springframework.aop.support.NameMatchMethodPointcutAdvisor 根据方法名称的特点进行匹配核心XML:mappedNameadvice(ref)配置文件样例:1) 2) /name都是固定的doAdoB /只这2个方法处理3) advisor1b、RegexpMethodPointcutAdvisor 根据正则表达式匹配方法名 org.springframework.aop.support.RegexpMethodPointcutAdvisor 核心XML:patternadvice(ref)配置文件样例: .*method.* regexpAdvisor 动态切入点: org.springframework.aop.support.ControlFlowPointcut 切入点的交叉与合并: Pointcuts.union配置文件样例: Introduction 一种特殊类型的Advice,为类动态增加方法和属性。 编程步骤: 1)实现org.springframework.aop.IntroductionI

温馨提示

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

评论

0/150

提交评论