




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,Spring,2,.,Spring,重点内容IoCAOPSpring整合Struts2、Hibernate,3,.,Spring框架概述,Spring是什么?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架目的:解决企业应用开发的复杂性功能:使用基本的JavaBean代替EJB,确保开发的简单性、可测试性和松耦合性;同时提供更多的企业应用功能范围:Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益,4,.,Spring框架概述,Spring是什么?Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情目的:解决企业应用开发的复杂性功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能范围:Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益,5,.,Spring框架概述,Spring的历史Spring的基础架构起源于2000年早期,它是RodJohnson在一些成功的商业项目中构建的基础设施。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。在2002后期,RodJohnson发布了ExpertOne-on-OneJ2EEDesignandDevelopment一书,并随书提供了一个初步的开发框架实现interface21开发包,interface21就是书中阐述的思想的具体实现。后来,RodJohnson在interface21开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架Spring。2003年2月Spring框架正式成为一个开源项目,并发布于SourceForge中。,6,.,Spring框架概述,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类和接口。控制反转Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。,7,.,Spring框架概述,面向切面Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如权限、日志和事务管理等)进行内聚性的开发。应用对象只实现它们应该完成的业务功能,不考虑其它的系统级关注点,例如日志或事务支持。容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,可以配置每个bean如何被创建(bean可以创建一个单独的实例或者每次需要时都生成一个新的实例),以及它们是如何相互关联的。,8,.,Spring框架概述,框架Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。,9,.,Spring框架概述,Spring包含的模块,10,.,Spring框架概述,Springcore核心容器这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。Springcontext应用上下文(Context)模块核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。,11,.,Spring的AOP模块Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。为了确保Spring与其它AOP框架的互用性,Spring的AOP支持基于AOP联盟定义的API。AOP联盟是一个开源项目,它的目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性。通过访问他们的站点,你可以找到关于AOP联盟的更多内容。Spring的AOP模块也将元数据编程引入了Spring。使用Spring的元数据支持,你可以为你的源代码增加注释,指示Spring在何处以及如何应用切面函数。,12,.,JDBC抽象和DAO模块使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。这个模块还在几种数据库服务器给出的错误消息之上建立了一个有意义的异常层。使你不用再试图破译神秘的私有的SQL错误消息!另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。,13,.,对象/关系映射集成模块对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATISSQL映射。Spring的事务管理支持这些ORM框架中的每一个也包括JDBC。,14,.,Spring的Web模块Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。Spring的MVC框架Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。,15,.,Spring框架概述,Spring带来了复杂的J2EE开发的春天。Spring具有如下优点:低侵入式设计,代码的污染度低;独立于各种应用服务器,基于Spring框架的应用,可以真正实现WriteOnce,RunAnywhere;Spring的IoC容器降低了业务对象的耦合性;Spring的AOP支持允许将一些通用的功能(权限、事务、日志等)等集中处理,提升了复用性,同时让开发者集中精力于业务功能的处理实现;Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问;Spring是高度开放的,开发者可以自由选择Spring框架的部分或全部。,16,.,IoC(DI),InverseofControlDependencyInjection,17,.,示例分析实现一个用户注册信息持久化的类。功能:保存用户注册的信息;根据用户的名称获得该注册用户。,18,.,User.javapublicclassUserprivateLongid;privateStringname;privateStringpassword;privateStringgroup;publicUser(Stringname,Stringpassword)=name;this.password=password;/相应的get/set方法.,19,.,MemoryUserPersist.javapublicclassMemoryUserPersistprivatestaticMapusers=newHashMap();staticUserdefaultAdmin=newUser(Mike,“mm123);users.put(defaultAdmin.getName(),defaultAdmin);publicMemoryUserPersist()publicvoidsaveUser(Useruser)users.put(user.getName(),user);publicUserLoadUser(StringuserName)return(User)users.get(userName);,MemoryUserPersistuserPersist=newMemoryUserPersist();userPersist.saveUser(user);,开发初期,将用户持久化到内存中,用于系统演示,20,.,新需求:如果要持久化到文本文件中?实现一个TextUserPersist类,读写文本文件,实现数据持久化;实现一个TextUserPersist类,这个并不困难。但客户端代码将面临重大灾难:找到所有使用过MemoryUserPersist的客户端类,将他们中的MemoryUserPersist逐个手工修改为TextUserPersist;将持久化方法替换为TextUserPersist中对应的持久化方法;并且重新编译;以前的测试也必须全部从头来过!,21,.,面向接口编程什么是接口?接口定义了行为的协议,这些行为在实现接口的类中实现。接口定义了很多方法,但是没有实现它们。类履行接口协议并实现所有定义在接口中的方法。接口是一种只有声明没有实现的特殊类。接口的优点:程序不必知道其使用对象的具体类。一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。对象间的连接不必硬绑定(hardwire)到一个具体类的对象上,因此增加了灵活性。松散藕合(loosenscoupling)。增加了重用的可能性。,22,.,publicinterfaceUserDaopublicvoidsave(Useruser);publicUserload(Stringname);,publicclassMemoryUserDaoimplementsUserDaoprivatestaticMapusers=newHashMap();staticUseruser=newUser(“Mike”,“mm123);users.put(user.getName(),user);publicvoidsave(Useruser)users.put(user.getId(),user);publicUserload(Stringname)return(User)users.get(name);,UserDaouserDao=newMemoryUserDao();userDao.save(user);,23,.,publicclassTextUserDaoimplementsUserDaopublicvoidsave(Useruser)打开数据文件写入数据关闭文件publicUserload(Stringname)打开文件;读取数据到Useru中;关闭文件;returnu;,持久化到文本文件中,UserDaouserDao=newTextUserDao();userDao.save(user);,24,.,工厂模式使用一个工厂类来实现userDao对象的创建,这样客户端只要知道这一个工厂类就可以了,不用依赖任何具体的UserDao实现,publicclassUserDaoFactorypublicstaticUserDaocreateUserDao()returnnewMemoryUserDao();,客户端UserRegister代码片段如下:UserDaouserDao=UserDaoFactory.CreateUserDao();userDao.save(user);,现在如果再要更换持久化方式,比如使用文本文件持久化用户信息。就算有再多的客户代码调用了用户持久化对象我们都不用担心了。因为客户端和用户持久化对象的具体实现完全解耦。我们唯一要修改的只是一个UserDaoFactory类。,25,.,进一步改进:引入配置文件,Bean工厂通过读取配置文件,动态创建Bean实体,从而消除硬编码。,publicclassUserDaoFactorypublicstaticUserDaocreateUserDao()StringclassName=;className=从属性文件中取得这个UserDao的实现类全名。UserDaouserDao=null;tryuserDao=(UserDao)Class.forName(className).newInstance();catch(Exceptione)e.printStackTrace();returnuserDao;,如果要改变持久化方案,只需要修改配置文件,26,.,引入工厂模式,带来的额外工作:开发接口建立配置文件建立工厂类,并且工厂内可能还比较复杂(比如,在建立持久化实体是,可能需要传入数据库连接等)终极方案:IoC,27,.,组件纳入容器管理。组件的实例由容器创建,并根据依赖关系进行注入。,publicclassUserRegisterprivateUserDaouserDao=null;/由容器注入的实例对象publicvoidsetUserDao(UserDaouserDao)this.userDao=userDao;/UserRegister的业务方法,28,.,StringidStr=.;/解析元素的id,获取其字符串为userRegister;/idStr=“userReigster”StringclassStr=.;/解析,获取class为com.dev.spring.simple.UserRegister;/classStr=“com.dev.spring.simple.UserRegister”Classclazz=Class.forName(classStr);Objectobj=clazz.newInstance();/建立UserRegister的一个对象;container.put(idStr,obj);StringpropertyName=.;/解析的name,获取属性名为userDao;/propertyName=“userDao”;StringrefStr=.;/解析的ref,获取值为userMemoryDao;/refStr=“userMemoryDao”StringsetterName=set+propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);/生成setUserDao方法名;ObjectparamBean=container.get(refStr);Methodsetter=clazz.getMethod(setterName,paramBean.getClass();setter.invoke(obj,paramBean);,29,.,使用Spring的IoC,在工程中引入Spring框架下载Spring框架,按需求导入lib下的jar包;简化方法:导入lib下的所有jar包;Spring核心容器依赖于apachecommon-logging的jar包,因此,还需要下载commons-logging相关的jar。最简单的方法:引用MyEclipse中的Spring库工程名上点击右键,MyEclipseaddSpringCapabilities选择需要的Spring版本(选择高版本)选择需要加载的Spring模块(默认只加载Springcore);next后,指定spring配置文件,默认为new,新建,文件名为applicationContext.xml,保存在src目录下,30,.,使用Spring管理bean,使用Spring管理BeanSpring核心容器是一个超级大工厂,所有的对象(自定义的类,Java预定义的类,数据源,HibernateSessionFactory等)都可以成为Spring容器管理的对象。这些对象统称为BeanSpring容器中的Bean没有任何特殊要求,任何Java类都可以作为Spring容器中的Bean。,31,.,在XML文件中配置Bean,Reference:Spring3.0referencechp3-3.2,32,.,为Bean配置依赖,Reference:Spring3.0referencechp3-3.2,33,.,初始化Spring容器,ApplicationContext是Spring最常使用的容器接口,常用的实现类有ClassPathXmlApplicationContext:加载类路径下的spring配置文件FileSystemXmlApplicationContext:加载文件系统相对路径或绝对路径下的Spring配置文件,34,.,初始化Spring容器并获取bean,ApplicationContextcontext=newClassPathXmlApplicationContext(newString“applicationContext.xml“);PetStoreServiceImplservice=context.getBean(petStore,PetStoreServiceImpl.class);,35,.,从Spring中获取Bean,ObjectgetBean(Stringid):根据容器中Bean的id来获取,返回的Object需要强制类型转换;TgetBean(Stringid,ClassrequiredType):带一个泛型参数,通过id来获取Bean,返回结果不需要强制类型转换,36,.,Spring配置详解,根元素可配置的属性default-lazy-init:指定下的所有bean的默认延迟初始化行为;default-merge:默认的merge行为default-autowire:bean的默认自动装配行为default-autowire-candidates:可用作自动装配的候选bean;default-init-method:bean实例化后默认执行的初始化方法default-destroy-method:bean被spring容器销毁时候默认要调用的回收方法这些属性可以在每个中单独指定,属性名称为去掉default后的名称;在中的设置将覆盖的设置,37,.,Spring配置详解,将一个Bean加入到spring容器idBean的唯一标识符,取值在Spring容器中应该是唯一的,不能包含特殊字符class指定Bean的具体实现类,不能是接口name为Bean指定一个或多个别名,可以包含一些特殊字符,38,.,Spring配置详解,Bean的作用域singleton单例模式:只生成一个实例prototype原型:每次都从容器中获取一个新的实例request对每个HTTP请求,使用同一个实例,只有在web应用中有效session对每个HTTPSession,使用同一个实例,只有在web应用中有效globalsession每个全局的HTTPSession使用同一个实例,39,.,Spring配置详解,如果不显式执行bean的作用域,默认为singleton作用域,40,.,Spring配置详解,Spring注入方式set方法设值注入构造方法注入,41,.,构造方法注入,请参考spring3.0reference文档3.4DependenciesConstructor-baseddependencyinjection,42,.,set方法设值注入,为需要注入的属性设置set方法;在配置文件中,使用子元素配置Spring先调用无参数的构造方法,实例化Bean,然后会检测其所有的元素,并调用对应的set方法,为各个配置的属性注入,43,.,44,.,set方法注入,任何类型的数据,只要提供set方法,都可以接受spring注入Java基本数据类型(int,double,String,boolean)Java对象Java集合、数组等,45,.,set方法注入,设置普通属性值ExampleBeanbean.xml,1com.mysql.jdbc.Driver,46,.,set方法注入,注入其他Beanref指明需要注入的Bean的id,47,.,set方法注入,注入嵌套Bean将配置为或的子元素,则该仅作为setter注入、构造器注入的参数,不能被容器获取,不能被用到其他ban的注入中,48,.,set方法注入,注入集合示例:Chinese.javabean.xml,49,.,set方法注入,等集合中的元素可以是基本值类型,也可以是其他Bean或嵌套bean,甚至是另一个集合。因此,,元素可以有以下子元素:value:集合元素为java基本数据类型ref:集合元素为容器中的另一个Beanbean:集合元素是另一个嵌套beanlist,set,map,props:元素是另一个集合,50,.,set方法注入,集合的每个元素是key-value构成的entry;可以使用基本类型或者字符串作为key,也可以使用另一个Bean作为key;同理,value可以是一个基本类型的值,也可以是另一个bean。因此,集合中的元素支持4中属性:key基本数据类型或字符串作为keykey-ref另一个Bean作为keyvalue基本数据类型或字符串作为值value-ref另一个Bean作为值,51,.,set方法注入,泛型集合spring通过反射获取集合元素的类型,根据泛型信息将配置文件中的数据自动转换为对应的数据类型并注入,publicclassTestprivateMapprices;/*setPrices*/,52,.,publicclassTestprivateMapprices;/*setPrices*/,53,.,set方法注入,组合属性的注入示例:ExampleBean.javabeans.xmlSpring实例化exampleBean的时候,会执行exampleBean.getPerson().setName(“.”),因此,必须保证exampleBean中的person不能为null。在注入组合属性时,必须保证,除最后一个属性外,其他属性都不能为null.,54,.,自动装配Autowire,无须显式指定bean的依赖关系,由spring自动根据某种规则为容器中的bean注入依赖,为所有的bean指定一个默认的自动装配规则,为单独的一个bean配置自动装配规则,55,.,自动装配,自动装配策略no:不使用自动装配byName根据setter方法的方法名,找出匹配的bean执行依赖注入,如果没有找到名称匹配的bean,则注入对应的属性byType根据setter方法的形参,在容器中查找类型匹配的Bean执行注入,如果没有匹配的,则不执行注入constructor根据构造方法的参数,在容器中查找匹配的bean执行构造方法注入,如果不能找到匹配的Bean,则抛出异常;autodetectspring根据bean的内部结构,自行选择使用constructor或者byType策略,如果bean有一个默认的构造函数,则使用byType策略,56,.,自动装配,byName示例:chinese.javabean.xmlbyType示例:Chinese.javabean.xml该配置中,有两个Bean都实现了Dog接口,这将导致Spring无法确定选用那个Bean进行注入,将导致注入失败采用autowire-candidate=“false”,设置该bean是否为自动装配的候选bean,设置为false,则将其排除在自动装配之外;在的default-autowire-candidates中设置,排除不想作为候选的beandefault-autowire-candidate=“*abc”所有abc结尾的bean都将被排除在候选之外,57,.,Bean的生命周期方法,singleton类型的Bean,其创建和销毁都是由Spring容器负责,Spring可以精确地知道该Bean何时被创建、何时被初始化、何时销毁该Bean;prototype类型的Bean,容器创建后,就将其交给客户端,容器不再跟踪器生命周期,58,.,Bean的生命周期方法,singleton类型的bean,可以管理其生命周期行为依赖关系注入之后的行为方法一:在中配置init-method属性方法二:实现InitializingBean接口示例:Chinse.javabean.xml即将销毁Bean之前的行为方法一:在中配置destroy-method属性方法二:实现DisposableBean接口示例Chinese.javabean.xml,59,.,让Bean获取Spring容器,将spring容器注入给Bean实现ApplicationContextAware接口setApplicationContext(ApplicationContextcontext)Spring容器会自动检测所有的Bean,如果发现某个Bean实现了ApplicationContextAware接口,spring会在实例化该Bean后,调用setApplicationContext()方法,将容器本身注入到该bean中。示例:person.java,60,.,使用Annotation配置IoC,61,.,基于Annotation的IoC,启用SpringAnnotation在Spring配置文件中加入Springcontext相关的schema参考文档Annotation-basedcontainerconfiguration启用Annotation在POJO中使用Spring的IoC注解启用Spring自动扫描,62,.,IoCAnnotation,Component标注一个普通的Java组件(Bean)Controller标注一个控制层BeanService标注一个服务层BeanRepository标注一个DAO层Bean,63,.,IoCAnnotation,为Bean指定名称(id)默认情况下,使用类名,首字母小写作为Bean的idComponent(“userDaoHibernateImpl”)Service(“userService”),64,.,IoCAnnotation,指定Bean的作用域:Scope不显示指定,默认为singleton显示指定,使用Scope注解Repository(“messageDaoHibernateImpl”)Scope(“singleton”)publicclassMessageDaoImplimplementsMessageDao,65,.,IoCAnnotation,配置依赖:ResourceResource是JavaEE规范中的一个标准Annotation,位于javax.annotation包下用于set方法上或者属性字段上,ComponentpublicclassLoginActionextendsActionSupportprivateUserDaouserDao;Resource(name=“userDaoHibernateImpl”)publicvoidsetUserDao(UserDaouserDao)this.userDao=userDao;,66,.,IoCAnnotation,配置依赖:Resource省略
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江鸭2025版高考历史第29讲宋明理学和明末清初的思想活跃局面夯基提能作业含解析
- 石家庄科四试题及答案
- 结肠癌试题集及答案
- 2024年秋三年级语文上册第五单元16世界上第一个听诊器教学反思1苏教版
- 综合分析卫生管理的试题及答案
- 2024年高考语文母题题源系列专题08图文转换含解析
- 灰尘的旅行测试题及答案
- 营养与心理健康的联系试题及答案
- 医院药剂科的职责与任务试题及答案
- 职中数学考试试题及答案
- 玻璃更换施工方案
- 煤矿防冲细则课件
- 2025-2030中国静电仪行业市场现状分析及竞争格局与投资发展研究报告
- 工贸企业重大事故隐患判定标准解读20240902
- NSA2000变频器使用说明书
- 人教版小学四年级语文下册2024-2025学年度第二学期第三单元质量检测试卷含参考答案
- 2025年度国人饮水电器白皮书-TMIC天猫新品创新中心
- 合作合同范本 英文
- 2025年浙江国企温州快鹿集团有限公司招聘笔试参考题库含答案解析
- 新疆维吾尔自治区粘土砖瓦及建筑砌块制造行业企业排名统计报告
- 湘教版七年级下册地理期中试卷及答案
评论
0/150
提交评论