Spring Mvc加载流程:
WebApplicationContext和ApplicationContext的区别
存的Web相关的比如:Listener、Servlet、Filter、Session,Page等
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据URL找到具体的处理器(可以根据xml配置、注解进行查找),生成包含Handler以及处理器拦截器HandlerIntercepter的HandlerExecuteChain执行链,执行链包括处理器对象及处理器拦截器(如果有则生成)一并返回。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配结果处理Handler
6、处理器执行完之后Handler执行完成返回ModelAndView。
7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
BeanFactory和ApplicationContext的区别
BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 它负责生产和管理bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如
DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。
从表面上看,ApplicationContext如同BeanFactory一样具有Bean定义,Bean关联关系的设置及根据请求分发Bean的功能,但是ApplicationContext在此基础上还提供了其他功能。
(1)MessageSource, 提供国际化的消息访问
(2)统一的资源文件读取方式,如URL和文件
(3)事件传播特性,即支持aop特性
(4)载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
以下是三种比较常见的ApplicationContext实现方式
(1)ClassPathXmlApplicationContext:从ClassPath的XML配置文件中读取上下文,并生成上线文定义。
(2)FileSystemXMLApplicationContext:由文件系统中的XML配置文件读取上下文
(3)XmlWebApplicationContext:由Web应用的XML文件读取上下文
BeanFactory与FactoryBean
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。
FactoryBean:是一个Bean,作用是产生其他Bean的实例。
Spring Bean的生命周期
1.Spring对Bean进行实例化(相当于程序中的new Xx())
2.Spring将值和Bean的引用注入进Bean对应的属性中
3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)
5.如果Bean实现了ApplicationContextAwaer接口,Spring容器将调用setApplicationContext(ApplicationContext ctx)方法,把y应用上下文作为参数传入.(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory )
6.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法(作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)
7.如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。
8.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法(作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,时机不同 )
9.经过以上的工作后,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁
10.如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
Spring生命周期相关的在不同的阶段都有扩展点,
第一大类:影响多个Bean的接口,InstantiationAwareBeanPostProcessor和BeanPostProcessor分别在实例化阶段和初始化阶段有Before和After操作