跳到主要内容

IoC详解-深入IoC实现

BeanFactoryPostProcessor

  • Spring 提供的容器扩展机制,允许我们在容器实例化相应对象前对注册到容器的 BeanDefinition 所保存的信息做相应的修改
  • 使用方式:
    • BeanFactory: 作为 ApplicationContext 的父类,功能比较弱,需要手动写代码进行应用
      // 声明将被后处理的BeanFactory实例
      ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("配置文件地址"));
      // 声明要使用的BeanFactoryPostProcessor
      PropertyPlaceholderConfigurer propertyPostProcessor = new PropertyPlaceholderConfigurer();
      propertyPostProcessor.setLocation(new ClassPathResource("jdbc.properties"));
      // 执行后处理操作
      propertyPostProcessor.postProcessBeanFactory(beanFactory);
    • ApplicationContext: 可以自动识别容器中的 BeanFactoryPostProcessor 实例对象并使用,一个容器中可以使用多个 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>
  • Spring 提供的 BeanFactoryPostProcessor 实现类
    1. PropertyPlaceholderConfigurer
      • 允许我们在 XML配置文件中只用占位符,并将这些占位符所代表的资源单独配置到 properties 文件中加载
      • 实现机制: 当 BeanFactory 在第一阶段加载完成所有配置信息时,BeanFactory 中保存的对象属性信息还只是以占位符的形式存在,当 PropertyPlaceholderConfigurer 作为 BeanFactoryPostProcessor 被应用时,会使用 properties 配置文件中的配置信息来替换 BeanFactory 中占位符所表示的属性值,当进入容器实现的第二阶段实例化时,bean 定义中的属性值就是最终替换完成的
    2. PropertyOverrideConfigurer
      对容器中配置的任何想处理的 bean 定义的 property 信息进行覆盖替换
    3. CustomEditorConfigurer
      传达由字符串到具体对象转换的相关信息给 PropertyEditor
    4. PropertyEditor
      处理字符串到具体对象的转换