Logo电子技术论坛Spring主讲:温春水时间安排3天第一天Spring基本概念(IOC)第二天AOP第三天Spring整合Struts,Hibernate•SSH目标理解Spring实现原理掌握SpringIOC,AOP掌握Spring的基础配置和用法熟练使用SSH开发项目主要内容Spring概述Spring整体结构Spring实例Spring核心概念介绍控制反转(IOC)依赖注入(DI)◦集合对象注入等◦Bean的管理◦BeanFactory◦ApplicationContextSpring在web中的使用Spring概述Spring是一个容器,它包含并且管理系统对象的生命周期和配置。在SSH项目中管理事务以及对象的注入.Spring概述轻量级的灵活性RodJohnsonExpertone-on-oneJ2EEDesignandDevelopmentSpring概述Spring是非侵入式的:基于Spring开发的系统中的对象一般不依赖于Spring的类。Spring整体介绍Spring整体介绍组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现Spring实例先看一个实例Spring配置文件applicationContext.xmlapplicationContext?xmlversion=1.0encoding=UTF-8?!DOCTYPEbeansPUBLIC-//SPRING//DTDBEAN//ENbeansbeanid=test1class=com.icss.oa.spring.SpringTestpropertyname=messagevaluetestgooooooogle/value/property/bean/beans函数调用ApplicationContextctx=newFileSystemXmlApplicationContext(E:\\workspace\\springProject\\WebRoot\\WEB-INF\\classes\\applicationContext.xml);SpringTestst=(SpringTest)ctx.getBean(test1);System.out.println(st.getMessage());优点组件间的依赖关系减少,极大改善了代码的可重用性。不需要实现框架指定的接口,因此可以轻松的将组件从Spring中脱离,甚至不需要任何修改Spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需在编写组件代码时就加以指定,从而在相当程度上降低了组件之间的耦合。核心容器核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory(ApplicationContext).BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring基本概念IOC=InverseOfControlDI=DependenceInjectionAOP面向接口面向抽象IOCanDIIOCIoC就是InversionofControl,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。保存到Floppy或者USBIOCIOCandDIMartinFowlerDI依赖注入所谓依赖注入,即在运行期由容器将依赖关系注入到组件之中。是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法进行设定。IOC和DI的关系通过DI来实现IOC//////////(struts)DIType1接口注入Type2设值注入Type3构造子注入type2settertype3Constructor实例看一下依赖注入的示例属性参考beanpropertyname=date1•beanclass=java.util.Date“//property属性参考refpropertyname=date1•refbean=beanDate//propertybeanid=beanDateclass=java.util.Date/自动绑定绑定的到底是什么?某个对象是另外一个对象的属性AutowirebyTypebyNameConstructorautodetectbyNamebeanid=collectionTestclass=com.icss.oa.spring.CollectionTestautowire=byNamebeanid=beanDateclass=java.util.Date/byTypebeanid=collectionTestclass=com.icss.oa.spring.CollectionTestautowire=byTypebeanid=beanDateclass=java.util.Date/绑定发生异常怎么办?如果有的属性没有完成自动绑定怎么办?如果能帮我们检查就好了dependency-check•Simple:•object•all•none绑定发生异常simple只检查简单的属性是否完成依赖关系,像是原生(primitive)数据类型或字符串对象object设定则检查对象类型的属性是否完成依赖关系all则检查全部的属性是否完成依赖关系none设定默认值,表示不检查依赖性绑定发生异常org.springframework.beans.factory.UnsatisfiedDependencyException:注入的valuevalueproperty•value/value/propertyrefproperty•refbean=“”//propertyproperty•reflocal=“”//property集合对象注入数组(String[])ListSetMapProperties数组,List,Set本质上是一样的String[]beanid=collectionTestclass=com.icss.oa.spring.CollectionTestpropertyname=strs•list–valueHello/value–valueWorld/value•/list/property/bean注意:String[]使用list.Listpropertyname=listslistvalueHelloList/valuevalueWorldList/value/list/propertyMappropertyname=mapsmap•entrykey=map1•valuemap1Value/value•/entry•entrykey=map2•valuemap2Value/value•/entry/map/propertyProperties一般用在事务里面:propertyname=propspropspropkey=prop1prop1Value/proppropkey=prop2prop2Value/proppropkey=prop3prop3Value/prop/props/property集合的取值ApplicationContextcontext=newFileSystemXmlApplicationContext(benas-config.xml);SomeBeansomeBean=(SomeBean)context.getBean(someBean);String[]strs=(String[])someBean.getSomeStrArray();Some[]somes=(Some[])someBean.getSomeObjArray();for(inti=0;istrs.length;i++){System.out.println(strs[i]+somes[i].getName());//取得Map类型依赖注入对象MapsomeMap=(Map)someBean.getSomeMap();System.out.println(someMap.get(MapTest));System.out.println(someMap.get(someKey1));}思考Bean被谁管理着呢?Bean管理BeanWrapperBeanFactoryApplicationContextBeanWrapperObjectobj=Class.forName(com.icss.oa.spring.Dog).newInstance();BeanWrapperbw=newBeanWrapperImpl(obj);bw.setPropertyValue(dogName,value1);bw.setPropertyValue(startDate1,newDate());System.out.println(dogName===+bw.getPropertyValue(dogName));System.out.println(date===+bw.getPropertyValue(startDate1));BeanFactory负责创建并维护Bean实例,负责bean的生命周期BeanFactoryInputStreamis=newFileInputStream(bean.xml);XmlBeanFactoryfactory=newXmlBeanFactory(is);Actionaction=(Action)factory.getBean(TheAction);此时我们获得的Action实例,由BeanFactory进行加载,并根据配置文件进行了初始化和属性设定BeanFactorybeanid=TheAction“class=net.xiaxin.spring.qs.UpperAction“singleton=true”init-method=init“destroy-method=cleanup“depends-on=ActionManager“ApplicationContextBeanFactory提供了针对JavaBean的管理功能,而ApplicationContext提供了一个更为框架化的实现ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性相对BeanFactory而言,ApplicationContext提供了以下扩展功能:ApplicationContext国际化支持资源访问事件传播国际化支持如何实现国际化注意:把.properties文件放到class目录下Step1在applicationContext中加入beansdescriptionSpringQuickStart/descr