Spring专业学习笔记

在继续我自己的对认证指南中提到的现有资源的补充之前,我想重申一下我用于准备的所有资源:


豆的生命周期

Bean初始化过程

认证的关键领域之一是Spring提供的生命周期管理。 到考试时,您应该完全了解此图。 此图描述了将bean加载到应用程序上下文中的过程。 起点是在bean XML文件中定义bean(但也可用于程序配置)。 上下文初始化后,所有配置文件和类都将加载到应用程序中。 由于所有这些源都包含bean的不同表示形式,因此需要一个合并步骤,将bean定义统一为一种内部格式。 初始化整个配置后,需要检查是否有错误和无效的配置。 验证配置后,便会建立依赖树并建立索引。

下一步,Spring应用BeanFactoryPostProcessor s (从现在开始为BFPP)。 BFPP允许自定义修改应用程序上下文的Bean定义。 应用程序上下文可以在它们的bean定义中自动检测BFPP bean,并在创建任何其他bean之前应用它们。 BFPP的经典示例包括PropertyResourceConfigurerPropertyPlaceHolderConfigurer 当此阶段结束并且Spring拥有所有最终bean定义时,该过程将离开“ happens一次”部分,并输入“每个bean的happens”部分。

Spring专业学习笔记

请注意,即使我使用通常描述UML元素的图形元素,该图片也不符合UML。

在第二阶段时,首先执行的是对所有SPEL表达式的求值。 Spring表达式语言(简称SPEL)是一种支持在运行时查询和操纵对象图的表达语言。 现在,所有SPEL表达式都已求值,Spring执行依赖项注入(构造函数和设置器)。 下一步,Spring应用BeanPostProcessors (从现在开始为BPP)。 BPP是工厂钩子,允许自定义修改新bean实例。 应用程序上下文可以在其Bean定义中自动检测BPP Bean,并将其应用于随后创建的任何Bean。

调用postProcessBeforeInitializationpostProcessAfterInitialization可以从bean定义之外提供bean生命周期挂钩,而与bean类型无关。 要指定特定于Bean的Bean生命周期挂钩,您可以从三种可能的方式中进行选择(相对于执行优先级进行排序):

  1. @PostConstruct
    • 使用JSR-250批注@PostConstruct批注方法
  2. afterPropertiesSet
  3. init-method
    • 在XML配置文件中定义bean元素的init-method属性

当bean完成此过程时,它将存储在一个商店中,该商店基本上是一个以bean ID为键,而bean对象为值的映射。 当所有bean得到处理后,上下文被初始化,我们可以在上下文上调用getBean并检索bean实例。

豆销毁过程

整个过程始于ApplicationContext关闭(无论是通过显式调用close方法还是从运行应用程序的容器中调用)。 发生这种情况时,所有bean和上下文本身都会被破坏。 就像bean初始化一样,Spring提供了销毁bean的生命周期挂钩,并提供了三种可能的方式(按执行优先级排序):

  1. @PreDestroy
    • 使用JSR-250批注@PreDestroy批注方法
  2. destroy
    • 实现DisposableBean接口并提供destroy方法的实现
  3. destroy-method
    • 在XML配置文件中定义bean元素的destroy-method属性

但是,这有一个棘手的部分。 当您处理原型bean时,在上下文关闭时会出现一种有趣的行为。 在原型bean完全初始化并执行了所有初始化生命周期挂钩之后,容器将移交引用,并且此后不再对此原型bean进行引用。 这意味着将不执行销毁生命周期挂钩。

Spring MVC中的请求处理

关于Spring MVC,熟悉Spring如何将请求转换为响应的基本原理很重要。 一切都始于ContextLoaderListener ,它将ApplicationContext的生命周期与ServletContext的生命周期联系起来。 然后有一个DelegatingFilterProxy ,它是标准servlet过滤器的代理,委派给实现javax.servlet.Filter接口的Spring管理的Bean。 DelegatingFilterProxy作用是将Filter的方法委托给从Spring应用程序上下文获得的bean。 这使bean可以从Spring Web应用程序上下文生命周期支持和配置灵活性中受益。 Bean必须实现javax.servlet.Filter并且其名称必须与filter-name元素中filter-name

DelegatingFilterProxy将所有映射的请求委派给*Servlet,该Servlet将请求分派给控制器,并提供其他功能来促进Web应用程序的开发。 但是,Spring的DispatcherServlet所做的不只是这些。 它与Spring IoC容器完全集成。 每个DispatcherServlet都有自己的WebApplicationContext ,它继承了根WebApplicationContext中已经定义的所有bean。 WebApplicationContext是普通的旧ApplicationContext的扩展,它只拥有几个特定的​​bean。 这些bean提供了方便的工具包,我称之为“通用”,其中包括对以下内容的支持:解决客户端使用的语言环境,解决Web应用程序的主题,将异常映射到视图,从HTML表单上传中解析多部分请求等其他。

完成所有这些工作后, DispatcherServlet需要确定将传入请求DispatcherServlet到哪里。 为此, DispatcherServlet转向HandlerMapping ,后者将请求映射到控制器。 Spring的处理程序映射机制包括处理程序拦截器,当您要将特定功能应用于某些请求(例如,检查委托人)时,该处理程序很有用。

Spring专业学习笔记

请注意,即使我使用通常描述UML元素的图形元素 ,该图片也不符合UML。

在执行到达控制器之前,必须执行某些步骤,例如解析各种注释。 HandlerAdapter的主要目的是使DispatcherServlet免受此类细节的影响。 HandlerExecutionChain对象包装处理程序(控制器或方法)。 它还可能包含一组HandlerInterceptor类型的拦截器对象。 每个拦截器可以否决处理请求的执行。

在执行到达控制器或方法时, HandlerAdapter已经执行了依赖项注入,类型转换,根据JSR-303的验证等。 在控制器内部,您可以像在应用程序中的任何标准Bean中一样调用Bean方法。 当控制器完成其逻辑并用相关数据填充Model时, HandlerInterceptor检索一个字符串(但也可以是特殊的对象类型),该字符串随后解析为View对象。

为了做到这一点,Spring执行返回的字符串到视图的映射。 Spring中的视图由逻辑视图名称寻址,并由视图解析器解析。 最后,Spring将模型对象插入视图中并呈现结果,然后将结果以响应的形式返回给客户端。

远程方法调用协议

当涉及远程方法调用及其支持的协议时,了解所述协议的基本属性和局限性很有用。

RMI协议信息
协议 港口 序列化
RMI 1099 +“随机” IO可序列化
黑森州 80 + 443 二进制XML(压缩)
麻布 80 + 443 纯XML(开销!)
HttpInvoker 80 + 443 IO可序列化

翻译自: https://www.javacodegeeks.com/2014/06/spring-professional-study-notes.html