我的第一个SpringBoot 项目——Hello World

上一篇简单介绍了如何快速创建一个Spring Boot项目,我们有了一个基本的项目结构:

这里写图片描述

首先,我们分析pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.pw</groupId>
    <artifactId>pf-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>pf-web</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

从dependencies中的内容,我们很容易找到了上一篇中,我们提到的两个组件web 和 thymeleaf。从pom文件的依赖配置中,我们发现全都一样,具有相同的结构,都有前缀“spring-boot-starter”。作为SpringBoot 四大神器之一的 starter,主要用于简化依赖,我们再也不用为依赖的版本和maven地址而发愁,springBoot总会为我们匹配它认为最优秀的版本(虽然有时候可能并不是我们想要的),让依赖的版本见鬼去吧,具有选择恐慌症的伙伴们该乐坏了。另外,我们还可以自己定义一个starter, 这部分内容这里暂时不作介绍。

其次,我们将重点放在 WebApplication.java 这个类上:

package cn.pw.pf.web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebApplication {

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

只有 简简单单的几行代码,一个几乎被我们忘掉 的main方法,没错就是它,main方法。大道至简,回到了我们刚学习开发语言时的第一个代码——main方法,在这里它依旧是项目启动的入口,执行着最原始的使命。
和老革命的寒暄到此结束,我们进入重点,重点关注一下新同志@SpringBootApplication 这个注解:

查看@SpringBootApplication的源码,我们发现它是由@SpringBootConfiguration 、@EnableAutoConfiguration和@ComponentScan由三个注解组合而成。

①@SpringBootConfiguration : 配置类,相当于 xml
②@EnableAutoConfiguration : 启用spring自动装配
③@ComponentScan : 和xml配置自动扫描效果一样,默认扫描当前包和所有子包(所以,启动类一定要放在最外层的包中)。

接下来,我们写一个Controller,来访问我们的Hello World!
就在cn.pw.pf.web下创建一个controller包,在写一个HelloWorldController类。

package cn.pw.pf.web.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Hello World Controller
 * @Description:
 * @Author:libin
 * @Date: Created in 2017/11/9
 */
@RestController
@RequestMapping("/")
public class HelloWorldController {

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

OK,我们HelloWorld!写完了,启动项目。直接在idea中运行WebApplication类的main()方法,注意观察控制台。

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.8.RELEASE)

2017-11-09 23:35:35.779  INFO 25940 --- [           main] cn.pw.pf.web.WebApplication 
...//省略中间部分             
2017-11-09 23:36:04.967  INFO 25940 --- [nio-8080-exec-1] 
o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 29 ms

小知识:SpringBoot启动时的banner 是可以 自定义的哦!有兴趣的可以了解一下,换一个自己喜欢的banner

访问 HelloWorld。在浏览器输入 http://localhost:8080/hello 页面上显示出了我们想要的内容:Hello World !

项目打包运行。
我们使用maven 直接打包,在项目pom所在的目录下,执行 mvn package ,打包 成功后,我们在target目录下能找到 pf-web-0.0.1-SNAPSHOT.jar ,执行 java -jar pf-web-0.0.1-SNAPSHOT.jar。

是不是很简单,不过小朋友就要问了,这是个web项目 ,web容器tomcat呢?

tomcat的问题好解释,springBoot自己集成了tomcat的组件。

SpringBoot项目到底是如何启动的呢?启动流程是什么呢?我们的老朋友main()方法到底做了什么?
解压pf-web-0.0.1-SNAPSHOT.jar,打开META-INF 文件夹,用记事本打开 MANIFEST.MF :

Manifest-Version: 1.0
Implementation-Title: pf-web
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: libin
Implementation-Vendor-Id: cn.pw
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: cn.pw.pf.web.WebApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_121
Implementation-URL: http://projects.spring.io/spring-boot/pf-web/

我们看到 Main-Class: org.springframework.boot.loader.JarLauncher和
Start-Class: cn.pw.pf.web.WebApplication

看来JarLauncher类才是springBoot启动的入口,然后才运行的Start-Class。更加详细的启动原理和过程,我们在后面的高级篇里探讨。

下一章我们讨论SpringBoot 配置文件 application.yml (application.properties)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值