Spring vs. Spring Boot

Spring的强大之处在于它不仅仅定义了bean的生命周期,还在其生命周期中的各个节点开放出接口来改变其行为,完成一些定制化的服务:如果bean需要获取ApplicationContext实现ApplicationContextAware即可;如果希望在bean实例化之前或之后做点什么可以实现BeanPostProcessor接口;如果想要在bean所有属性设置完成之后初始化之前完成一些工作可以实现InitializingBean接口;想自定义加载一些bean 可以实现BeanFactoryPostProcessor。  实现BeanFactoryPostProcessor接口,可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息

  • ApplicationContextInitializer开放能力。ApplicationContextInitializer从名字可以看出其会完成context的初始化工作。集团中diamond starter利用这个能力提供Spring Boot应用的环境配置能力
    • context初始化时从diamond读取环境配置。
  • BeanFactoryPostProcessor的开放能力,Spring允许实现BeanFactoryPostProcessor接口的bean提前对context中已加载的bean定义做一些处理工作。Spring Boot的自动装配利用了
    • Spring默认加载的BeanFactoryPostProcessor扫描ComponentScan注解,将路径下所有的类定义加载进来。
    • 加载完成后对于配置类按照上面的顺序完成解析。
  • Spring自动加载META-INF/spring.factories配置的能力,详见loadfactorynames

     

猜你喜欢

转载自weiboxie.iteye.com/blog/2389406
今日推荐