ACCPV4.0第一章Spring基础ACCPV4.02课程目标理解IOC撑握SpringIOC容器的使用理解AOP撑握Spring中使用AOP撑握Spring中的事务、安全、远程调用、调度撑握Spring与Hibernate、Struts、JSF的结合了解Spring的MVC、及Spring的发展方向ACCPV4.03理解IOC了解Spring轻量级框架的特点了解Spring体系结构撑握建立Spring核心应用理解Spring的Bean的生命周期撑握Spring的IOC的配置撑握使用自定义配置参数目标ACCPV4.04IOC(Inversionofcontrol)即反向控制。IOC即使用容器来控制程序之间的依赖关系,而非用程序代码来控制。控制权由原来的代码转移到到了容器,所以也称之为反转控制。IOC又名,依赖注入,DI(DependencyInjection)。依赖注入:组件之间的依赖关系,由容器运行时动态的注入,而非编写代码给定。IOCACCPV4.05没有使用IOC的订单管理的业务类保存订单的代码未使用IOC示例代码rivateOrderDaoorderDao=null;publicOrderDaogetOrderDao(){//未使用IOC,代码新建Dao的实例orderDao=newOrderDao();}publicvoidsaveOrder(Orderorder){//获取Dao,调用Dao的方法保存订单getOrderDao().save(order);}ACCPV4.06使用IOC示例代码privateOrderDaoorderDao=null;publicOrderDaogetOrderDao(){//使用IOC,Dao由容器调用当前对象的//setOrderDao方法设置,所以直接返回DaoreturnorderDao}//容器自动调用该方法注入当前对象依赖的OrderDaopublicvoidsetOrderDao(OrderDaodao){this.orderDao=dao;}publicvoidsaveOrder(Orderorder){//获取Dao,调用Dao的方法保存订单getOrderDao().save(order);}ACCPV4.07Spring是一个轻量级的框架,轻量级与重量级框架没有明显的界限,一般以是否需要特定的Application服务为界。轻量级:非侵入式,框架更小,性能高。反向控制:Spring提倡使用IOC来实现松耦合,使用IOC对象是被动接收依赖类而不是主动去找。面向切面:Spring对面向切面的编程提供了强大的支持,例如可以将系统的事务,日志从业务代码中分离出来。容器:Spring是一个容器,它负责管理系统对象的生命周期和配置,例如你可以配置一个bean是产生一个实例还是每次请求都产生一个实例,它的容器相对于EJB容器更加简洁。框架:Spring实现了使用简单的组件来配置组装一个复杂的系统。Spring的特点ACCPV4.08Spring体系结构ACCPV4.09Spring核心模块(SpringCore)Spring的核心容器模块,它提供IOC的支持。该模块中包含BeanFactory,它采用工厂模式来实现IOC,负责对bean的生命周期的管理。ApplicationContext(上下文模块)该模块扩展了BeanFactory的功能,例如提供了i18n,系统生命周期以及验证的支持Spring的AOP模块该模块为应用系统的AOP开发提供了支持。Spring模块ACCPV4.010JDBC和DAO模块提供了JDBC封装的模板代码,使得使用JDBC开发更加简洁。O/R映射模块该模块提供了对许多流行的ORM框架的支持,其中包括Hibernate,JDO和iBATISSQL的支持SpringWeb模块该模块中Spring提供了对其它的WEB框架的支持,包知Struts,JSF,WEBWORK等SpringMVC框架Spring提供的用于开发WEB应用的MVC框架Spring模块ACCPV4.011核心容器提供了IOC的具体实现,所有的其它模块都是建立在它的基础之上。建立Spring核心应用的基本步骤引用Spring相关的Jar文件建立Spring的配置文件,它是一个XML文件,用于配置配置Bean的实例及依赖关系。建立Bean类,并在XML文件中注册及注入依赖。根据配置文件建立容器实例即:BeanFactory实例。通过BeanFactory获取容器中的Bean实例。建立Spring核心应用ACCPV4.012Spring的配置文件Spring2.0的核心容器只需要Spring.jar文件即可。Spring配置文件示例:配置文件一般存放在类路径中,以applicationContext.xml命名,Spring充许有多个配置文件。?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:schemaLocation=://注册bean及依赖/beansACCPV4.013注册Bean的实例及依赖Spring中Bean实例的注册及依赖注入示例://注册了一个com.Bar的实例barbeanid=barclass=com.Bar/bean/*注册一个com.Foo的实例foo,并为之注入了bar的属性,属性值引用已注册的bar实例*/beanid=fooclass=com.Foopropertyname=barref=bar/property/beanACCPV4.014建立使用BeanFactoryBeanFactory为Spring核心容器的实现接口。示例建立BeanFactory实例:BeanFactorybf=newXmlBeanFactory(newClassPathResource(applicationContext.xml));从当前BeanFactory中获取Bean实例Foofoo=(Foo)bf.getBean(foo);ACCPV4.015使用上下文模块Spring上下文模块,封装了Spring的核心模块,提供了更多的应用功能,Spring提供了三种类型的上下文,分别用于同的应用环境:ClassPathXmlApplicationContext通过引用类路径中的配置文件来建立ApplicationContext实例。FileSystemXmlApplicationContext通过引用文件系统中的配置文件来建立ApplicationContext实例。XmlWebApplicationContext从Web应用的环境中获取配置文件。建立Spring上下文实例,并获取注册的Bean:ApplicationContextapp=newClassPathXmlApplicationContext(applicationContext.xml);Foofoo=(Foo)app.getBean(foo);ACCPV4.016JavaWeb与Spring的整合JavaWeb实例化ApplicationContextcontext-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:resource/spring/applicationContext*.xml/param-value/context-param//配置Spring配置文件listener//配置监听以实例化Spring上下文listener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listenerACCPV4.017JavaWeb与Spring的整合Jsp/Servlet中获取Spring的Bean实体srv.TestServicests=(srv.TestServices)WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()).getBean(sayHello);ACCPV4.018Spring中Bean生命周期ACCPV4.019SpringBean的生命周期Bean的建立BeanFactory读取Bean定义文件,并生成各个Bean实例属性注入执行相关的Bean属性依赖注入,调用属性的set方法注入BeanNameAware的setBeanName()如果Bean类有实现org.springframework.beans.BeanNameAware接口,则执行它的setBeanName()方法BeanFactoryAware的setBeanFactory()如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,则执行它的setBeanFactory()方法BeanPostProcessors的ProcessBeforeInitialization()如果任何的BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例的processBeforeInitialization()方法ACCPV4.020SpringBean的生命周期initializingBean的afterPropertiesSet()如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法Bean定义文件中定义init-method可以在Bean定义文件中使用“init-method”属性设定方法名称例beanid=helloBeancalss=onlyfun.caterpillar.HelloBeaninit-method=initBean如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法BeanPostProcessors的ProcessaAfterInitialization()如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法BeanFactoryAware的setBeanFactory()执行DisposableBean的destroy()执行Bean定义文件中定义destroy-methodACCPV4.021SpringBean的作用域作用域是指Spring中的Bean实例的生命周期的时间范围Spring2.0在Spring1.2的基础上添了许多新的作用域,并且充许用户自己作用域,常见的作用域如下:singleton单实例,即在整个应用程序中有一个Bean的实例。prototype原型,每次请求获取bean时,容器都会构建bean的实例。以下几个为Spring2.0新加的作用域session对应web应用时,对应Web应用的每个会话会建立一个bean的实例。request对应web应用