Spring基础-2-理解Spring体系结构的模块构成掌握BeanFactory和ApplicationContext的使用方法掌握Bean的生命周期掌握在IoC容器中装配Bean的方法掌握依赖注入的不同方式掌握注入参数的不同类型掌握Bean的不同作用域类型掌握IoC容器中对Bean进行自动装配的不同类型了解依赖检查的几种处理模式目标-3-Spring起源背景2002年,RodJohnson《Expertone-on-oneJ2EEdesignanddevelopment》2004年3月24日,又推出了一部堪称经典的力作《Expertone-on-oneJ2EEDevelopmentwithoutEJB》-4-Spring概述Spring是一个全方位的解决方案,主要包括如下功能:基于依赖注入(控制反转IoC)的核心机制声明式的面向切面编程(AOP)支持与多种技术整合优秀的WebMVC框架-5-Spring起源背景Spring具有如下优点:低侵入式设计,代码无污染独立于各种应用服务器,真正实现WriteOnce、RunAnywhere(一次编写、随处运行)的承诺IoC容器降低了业务对象替换的复杂性,降低了组件之间的耦合AOP容器允许将一些通用任务如安全、事务、日志等进行集中式处理Spring中的ORM和DAO支持提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问Spring的高度开放性,并不强制开发者完全依赖于Spring,可自由选用Spring框架的部分或全部功能-6-Spring体系结构-7-为什么要使用Spring?SSH框架的流程大致是:JSP页面----Struts------Service(业务逻辑处理类)---Hibernate-8-为什么要使用Spring?Struts负责控制Service(业务逻辑处理类),从而控制了Service的生命周期,这样层与层之间的依赖很强,属于耦合。使用Spring框架就起到了控制Action对象和Service类的作用,两者之间的关系就松散了-9-为什么要使用Spring?//DAO层publicclassUserDao{publicvoidinsert(Useruser){}}//Service层publicclassUserService{publicvoidinsert(Useruser){UserDaouserdao=newUserDao();userdao.insert(user);}}-10-为什么要使用Spring?//DAO层publicclassUserDao{publicvoidinsert(Useruser){}}//Service层publicclassUserService{privateUserDaouserdao;publicUserDaogetUserdao(){returnuserdao;}publicvoidsetUserdao(UserDaouserdao){this.userdao=userdao;}publicvoidinsert(Useruser){userdao.insert(user);}}-11-IoC容器-12-IoC容器MartinFowler著名的面向对象分析设计、UML、模式等方面的专家,敏捷开发方法的创始人之一-13-IoC容器•IoC(InversionofControl,控制反转)是Spring框架的基础,AOP、声明式事务等功能都是在此基础上实现的BeanFactoryApplicationContextSpringIoC容器注入业务对象(POJO)可用的完整系统装配、集成业务对象生产-14-BeanFactory•org.springframework.beans.factory.BeanFactory是IoC容器的核心接口,其职责是实例化、定位、配置应用程序中的对象及建立这些对象间的依赖方法功能说明booleancontainsBean(Stringname)判断容器是否包含id为name的Bean定义ObjectgetBean(Stringname)返回容器中id为name的BeanObjectgetBean(Stringname,ClassrequiredType)返回容器中特定id和类型的BeanClassgetType(Stringname)返回容器中id为name的Bean的类型AutowireCapableBeanFactoryListableBeanFactoryBeanDefinitionRegistryBeanFactoryHierarchicalBeanFactoryConfigurableBeanFactoryConfigurableListableBeanFactoryDefaultListableBeanFactoryXmlBeanFactorySpring加载资源并装配Bean对象的过程如下:1)定义Spring的配置文件(bean.xml)。2)通过Resource类(例如,ClassPathResource)将JavaBean的配置文件抽象成一个Resource对象。3)创建Bean工厂。(例如,DefaultListableBeanFactory和XmlBeanDefinitionReader)4)实例化XmlBeanDefinitionReader对象,并将Bean工厂对象作为参数传递进去供后续回调使用。5)通过XmlBeanDefinitionReader对象读取之前抽象出的Resource对象(包含了XML文件的解析过程)。6)IoC容器创建完毕,用户可以通过容器获取到所需的Bean对象信息。-16-使用BeanFactory?xmlversion=1.0encoding=UTF-8?!DOCTYPEbeansPUBLIC-//SPRING//DTDBEAN2.0//EN!--创建一个id为customer的Bean对象--beanid=customerclass=com.dh.ch07.pojos.Customer!--根据属性名称注入相应的值--propertyname=userNamevalue=zhangsan/propertyname=passwordvalue=123/propertyname=realNamevalue=张三/propertyname=addressvalue=青岛/propertyname=mobilevalue=12345678//bean/beans//根据配置文件创建ClassPathResource对象ClassPathResourceis=newClassPathResource(bean.xml);//创建BeanFactory对象BeanFactoryfactory=newXmlBeanFactory(is);//从BeanFactory对象中,根据id获取具体对象Customercustomer=(Customer)factory.getBean(customer);-17-ApplicationContext•ApplicationContext接口由BeanFactory派生而来,增强了BeanFactory的功能,提供了更多的面向实际应用的方法,如添加了Bean生命周期的控制、框架事件体系、国际化支持、资源加载透明化等多项功能-18-使用ApplicationContext(1)ApplicationContext接口的主要实现类:ClassPathXmlApplicationContext:从类路径加载配置文件FileSystemXmlApplicationContext:从文件系统中装载配置文件加载配置文件•Spring的配置文件在类路径下•Spring的配置文件在文件系统的路径下ApplicationContextctx=newClassPathXmlApplicationContext(bean.xml);ApplicationContextctx=newFileSystemXmlApplicationContext(E:/workspace/ch07/src/bean.xml);-19-使用ApplicationContext(2)获取到ApplicationContext实例后,可以调用BeanFactory的getBean()方法获取Bean。Customercustomer=(Customer)ctx.getBean(customer);-20-使用ApplicationContext•ApplicationContext在初始化应用上下文时,默认会实例化所有的singletonBean(单例Bean)。•因此系统前期初始化ApplicationContext时将有较大的系统开销,时间稍长一些,但程序后面获取Bean实例时将直接从缓存中调用,因此具有较好的性能-21-Bean生命周期实例化设置属性值调用BeanFactoryAware的setBeanFactory()方法调用ApplicationContextAware的setApplicationContext()方法调用BeanPostProcessor的postProcessBeforeInitialization()方法调用InitializingBean的afterPropertiesSet()方法通过init-method属性配置的初始化方法调用BeanPostProcessor的postProcessAfterInitialization()方法Spring缓存池中准备就绪的Bean将准备就绪的Bean交给调用者调用DisposableBean的afterPropertiesSet()方法通过destroy-method属性配置的销毁方法-22-7.3IoC容器中装配Bean7.3.1Spring配置文件•Spring配置文件可以采用DTD和Schema两种格式。-23-(1)DTD格式的配置文件?xmlversion=1.0encoding=UTF-8?!DOCTYPEbeansPUBLIC-//SPRING//DTDBEAN3.0//EN=customerclass=com.dh.ch07.pojos.Customer/bean/beans-24-(2)Schema格式的配置文件,拥有自己的命名空间。?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:aop=:tx=:schemaLocation=“://://://://