Spring的基本用法目录•1Spring简介•2Spring的下载和安装•3Spring的依赖注入•4使用Spring容器•5Spring容器中的Bean•6容器中Bean的生命周期•7本章小结Spring简介•Spring框架由RodJohnson开发,2003年发布了第一个版本,目前已发展成为JavaEE开发中最重要的框架之一。•Spring为企业应用提供了一个轻量级的解决方案,内容包括:–基于依赖注入的核心机制–基于AOP的声明式事务管理–与多种持久层技术的整合–优秀的WebMVC框架–其他Spring的组成结构图Spring的组成结构图详解•核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。•Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。•SpringAOP:通过配置管理特性,SpringAOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。SpringAOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用SpringAOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。•SpringDAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。SpringDAO的面向JDBC的异常遵从通用的DAO异常层次结构。•SpringORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQLMap。所有这些都遵从Spring的通用事务和DAO异常层次结构。•SpringWeb模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与JakartaStruts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。•SpringMVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。Spring的优点•低侵入式设计,代码的污染极低。•独立于各种应用服务器。•Spring的DI容器降低了业务对象替换的复杂性,提高了组件之间的解耦。•Spring的AOP支持通用任务的集中式管理。•Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层数据库访问。•Spring的开放性好,开发者可自由选用Spring框架的部分或全部。Spring的缺点•中断了应用程序的逻辑,使代码变得不直观;•把逻辑处理由代码化变为配置化,增加了出错的概率,也使后期的维护难度增加;•调试不方便。目录•1Spring简介•2Spring的下载和安装•3Spring的依赖注入•4使用Spring容器•5Spring容器中的Bean•6容器中Bean的生命周期•7本章小结下载Spring•Spring官方网站:下载Spring下载SpringSpring3.0.5的jar包如何使用Spring•对于JavaSE项目,只需在项目的classpath中增加相应的Springjar包即可。•对于Web项目,只需要如下两个步骤–拷贝所有jar包到web项目的WEB-INF/lib下–将所需的第三方类库文件复制到Web项目的WEB-INF/lib下目录•1Spring简介•2Spring的下载和安装•3Spring的依赖注入•4使用Spring容器•5Spring容器中的Bean•6容器中Bean的生命周期•7本章小结Spring中的IoC•IoC:InverseOfControl•DI:DependcyInjection•IoC和DI的含义是相同的•IoC的含义:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring框架中是IoC容器)负责将这些联系在一起。•IoC是Spring的核心和基础Spring中的IoC•IoC,即控制反转,有时候也叫做DI(依赖注入)。•IoC实现的基础是工厂模式,所使用的技术主要是java的反射技术。•SimpleFactory模式:应用和具体的实体类分离、解耦。代码的不同阶段简单工厂模式的实例Spring的做法(配置文件)Spring的使用方式1ClassPathResourcecpr=newClassPathResource(applicationContext.xml);XmlBeanFactoryfactory=newXmlBeanFactory(cpr);Aa=(PersonA)factory.getBean(a);Spring的使用方式2ApplicationContextctx=newFileSystemXmlApplicationContext(src/applicationContext.xml);Personp=(Person)ctx.getBean(chinese);稍复杂的IoC实例实例1人使用斧头砍柴对象之间存在主要依赖关系查看对象之间的依赖关系(示意图)稍复杂的IoC实例实例2人使用杯子喝水对象之间存在主要依赖关系查看对象之间的依赖关系(示意图)小技巧•光标选中接口类型,按【Ctrl+t】进入接口的实现方法。Spring类图IoC和反射IoC详细介绍Java反射机制IoC的实现原理是Java反射机制Spring的底层实现(尤其是IoC)使用了大量的Java反射,Java反射机制的学习及了解有助于对Spring的深层次理解。Java反射的包是java.lang.reflect,主要包含Class、Field、Method、Constrator等类,提供一种运行时获取和改变对象状态及属性的相关API。JAVA反射机制提供的功能•在运行时判断任意一个对象所属的类•在运行时构造任意一个类的对象•在运行时判断任意一个类所具有的成员变量和方法•在运行时调用任一个对象的方法•在运行时创建新类对象•以下通过实例演示来了解Java反射机制Java反射实例1publicstaticvoidmain(String[]args)throwsException{//加载并初始化命令行参数所指定的类ClassclassType=Class.forName(args[0]);//获取到该类所对应的所有方法Methodmethod[]=classType.getDeclaredMethods();//打印出类的所有方法for(Methodm:method){System.out.println(m);}}运行时传入参数运行结果Java的反射实例2publicclasstest{privateStringstr=dps;publicStringgetStr(){returnstr;}}Java的反射实例2testmyTest=newtest();System.out.println(myTest.getStr());Classclazz=test.class;Fieldfield=clazz.getDeclaredField(str);field.setAccessible(true);field.set(myTest,“change”);System.out.println(myTest.getStr());运行结果改变自己,从改变习惯开始随心所欲,而不随波逐流依赖注入的方式•设值注入–IoC容器使用属性的setter方法来注入被依赖的实例–实际操作演示•构造注入–IoC容器使用构造器来注入被依赖的实例–实际操作演示•两种注入方式的选择–建议以设值注入为主,构造注入为辅的策略–对于依赖关系无须变化的注入,尽量采用构造注入–其他依赖关系的注入,则考虑采用设值注入目录•1Spring简介•2Spring的下载和安装•3Spring的依赖注入•4使用Spring容器•5Spring容器中的Bean•6容器中Bean的生命周期•7本章小结Spring容器简介•Spring容器是生成Bean实例的工厂,并管理容器中的Bean。•BeanFactory接口和ApplicationContext接口都可以代表Spring容器。•ApplicationContext是BeanFactory的子接口•通常使用ApplicationContext代表容器。Spring容器简介•ApplicationContext接口的常用实现类–FileSystemXmlApplicationContext–ClassPathXmlApplicationContext–XmlWebApplication–AnnotationConfigWebApplicationSpring容器简介•ApplicationContext的增强功能–提供国际化支持–资源访问–事件机制–载入多个配置文件–以声明式的方式启动、创建Spring容器目录•1Spring简介•2Spring的下载和安装•3Spring的依赖注入•4使用Spring容器•5Spring容器中的Bean•6容器中Bean的生命周期•7本章小结Bean定义•定义Bean时,通常需要指定两个属性:–id:确定该Bean的唯一性标识–class:指定该Bean的具体实现类•另外,可以给Bean定义别名。容器中Bean的作用域•singleton:在springIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。默认方式。•prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()的操作。•request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于webApplicationContext环境。•session:同一个HTTPsession共享一个Bean,不同HTTPsession使用不同的Bean,该作用域仅适用于webApplicationContext环境。•globalSession:同一个全局session共享一个Bean,一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境.注入普通属性值•目标类型:基本类型•示例代码自动装配(自动注入属性值)•Spring能根据某种规则,自动装配Bean与Bean之间的依赖关系。•简化了代码,但是降低了依赖关系的透明度和清晰性•autowire属性的设置–no–byName–byType–constructor–autodetect注入集合类型的值•如果Bean的属性是个集合,也可以完成相应值的注入。•不同集合类型的注入方式:–List:list../–Set:sett../–Map:map../–Properties:props../注入集合类型的值(示例)propertyname=myListlistvalue张1/valuevalue张2/valuevalue张3/value/list/propertypropertyname=mySetsetvalue王1/valuevalue王2/valuereflocal=glassCup//set/property