Spring 容器启动


一、容器启动

容器启动后,首先会加载 Configuration Metadata,解析后编组为相应的 BeanDefinition,最后将 BeanDefinition 注册到相应的BeanDefinitionRegistry

二、Bean 的实例化

在启动阶段,所有 bean 的信息都已经以 BeanDefinition 的方式注册到 BeanDefinitionRegistry,当方法明确地以 getBean 方法请求某个对象,或者因为对象的依赖关系隐式地请求某个对象,就会触发 Bean 的实例化。

容器会首先检查对象是否已经实例化,如果没有就会根据 BeanDefinition 的信息实例化对象,并注入依赖。如果对象实现了回调接口,也会根据回调接口的要求装配它。

三、干预 BeanFactory 的启动

Spring 提供了 BeanFactoryPostProcessor 的容器扩展机制。该机制允许我们在容器实例化对象之前,对注册到容器的 BeanDefinition 信息做修改

常用的实现 BeanFactoryPostProcessor 接口的类:

beanpost

  • BeanFactory 手动应用所有 BeanFactoryPostProcessor:
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("...")); 
PropertyPlaceholderConfigurer propertyPostProcessor = new PropertyPlaceholderConfigurer(); propertyPostProcessor.setLocation(new ClassPathResource("...")); 
propertyPostProcessor.postProcessBeanFactory(beanFactory);
  • ApplicationContext ApplicationContext 会自动识别 BeanFactoryPostProcessor 并装配:
<beans> 
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
      <list> 
        <value>conf/jdbc.properties</value> 
        <value>conf/mail.properties</value> 
      </list> 
    </property> 
  </bean> 
</beans>