Hello

简介

本文将通过程序员入门必经之路 Hello World ,引导读者走进 Spring Boot的世界。

Hello World

Spring Boot大行其道的现在,姑且认为各位读者都写过类似下面这段代码:

package org.ifinal.finalframework.example;

@SpringBootApplication
@RestController
public class FinalApplication {

    public static void main(final String[] args) {
        SpringApplication.run(FinalApplication.class);
    }

    @GetMapping("/helloworld")
    public String hello() {
        return "Hello World";
    }

}

当运行main方法,并访问http://localhost:8080/helloworld时,是的,就这么简单的几行代码,一个基于 Spring BootHello World 应用就创建好了。

然后再想想之前的Spring MVC时代的各种配置……

我想,此刻,与首次听说Spring Boot时的百般拒绝,和第一次使用 Spring Boot 时那无比波澜的小心脏,应该只有简短几句:”哎呦!卧槽!真香!“能概述了。

真香

真香定律

刚刚诠释了一下”真香定律”,现在是时候来分析一下为什么是真的香了。

现在,让我们回到上面那短短的几行代码,都做了些什么:

  1. 创建了一个FinalApplication类;
  2. 在类上声明了一个@SpringBootApplication注解;
  3. main方法写了一行代码:SpringApplication.run(FinalApplication.class);
  4. 声明了一个/helloworld的接口。

这4点中,除了1和4看着眼熟之外,2和3是新接触的内容,我们先查看@SpringBootApplication的源码,发现有比较熟悉的代码@ComponentScan

package org.springframework.boot.autoconfigure;

@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})
public @interface SpringBootApplication {

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

}

@ComponentScan实现了在 Spring MVC 时代的 Spring XML 配置文件 <context:component-scan> 节点的Java代码支持,再加上 @AliasFor 注解,暂且可以断定 @SpringBootApplication 启到了相同的作用,实现了组件扫描的功能。那么剩下的SpringApplication.run(FinalApplication.class);应该就是启动 Spring 容器 并初始化 WEB 环境了。

事实上也确实如此。

结语

本文通过一个简单了Hello World示例,向读者展示了Spring Boot相对于传统Spring MVC优势的冰山一角

在后续的章节中,将通过演示一些在工作中应用的真实案例,逐渐的将Spring Boot强大的封装展示给各位读者,并通过解读一些核心源码,了解其设计思想与实现原理,与各位一起学习,共同进步!