我眼中的spring boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。它可以按照功能进行模块的引入,非常方便的添加功能,于web而言,通过内嵌的web容器(tomcat,jetty等)实现服务的发布,整个过程轻松优雅。去除xml的配置,让项目的风格更加的统一,大家可以更多的关注于代码本身。使用起来,处理方便还是方便,但是不只是方便。我觉得还有一个关键词就是定制。
他可以定制化spring的容器,可以在spring容器启动之前,注册一些自定义的处理方式(BeanFactoryPostProcessor,BeanPostProcessor),从而扩展了Spring的功能。比如我们在SpringBoot入门之SpringApplication.run它经历了什么中曾经提到过的spring boot的SPI,我们以ApplicationContextInitializer为例
在spring.factories文件中声明了要加载的ApplicationContextInitializer的实现类

# Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer

当调用getInitializers()方法时就会将上面的实现类加载到内存中,然后调用ApplicationContextInitializer类型的生命周期方法initialize,进行ApplicationContext的定制化操作。

    protected void applyInitializers(ConfigurableApplicationContext context) {
        for (ApplicationContextInitializer initializer : getInitializers()) {
            Class requiredType = GenericTypeResolver.resolveTypeArgument(
                    initializer.getClass(), ApplicationContextInitializer.class);
            Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
            initializer.initialize(context);
        }
    }

我们看一个ConfigurationWarningsApplicationContextInitializer它里面就是注册了一个ConfigurationWarningsPostProcessor的BeanFactoryPostProcessor,以便在refresh时,可以打印warn类型的日志。

    @Override
    public void initialize(ConfigurableApplicationContext context) {
        context.addBeanFactoryPostProcessor(
                new ConfigurationWarningsPostProcessor(getChecks()));
    }

这其实就是一个spring功能的扩展点,既然spring boot 提供了这种方式,那么我们也可以自定义类然后注册到spring container中达到我们的目的
。个人觉得,这才是spring boot 带给我们的最大的惊喜。

你可能感兴趣的:(我眼中的spring boot)