springboot学习(一)——helloworld

赛博朋克
• 阅读 3275

以下内容,如有问题,烦请指出,谢谢

springboot出来也很久了,以前零散地学习了不少,不过很长时间了都没有在实际中使用过了,忘了不少,因此要最近准备抽时间系统的学习积累下springboot,给自己留个根。

因为以前学过一些,这里就主要根据官方文档来学习了,可能会根据自己的理解来选择一些知识点的学习顺序。官方文档地址:https://docs.spring.io/spring...

官方文档有十个大章节,第一章是综述,就不用太细看了,这里直接从第二章开始,也是介绍hello world的地方。
一开始就介绍了spring的四个目标:

  • 更快地开发spring程序
  • 提供默认配置,开箱即用
  • 提供大量插件(主要是各种starter)
  • 避免代码生成以及xml配置

上面这四个也是普通spring程序的弊病,简单来说就是入门门槛高了,spring的各种配置是很重要的,但是项目搭建后就很少管,然后新启动一个项目又要花很长时间去配置,配置得还是跟原来的差不多。

系统要求就是jdk1.7/servlet3.0及以上,1.6版本如何使用可以看很文档后面的说明。官方内嵌支持三种servlet容器,最常见的tomcat,然后是jetty以及undertow(jboss默认的),tomcat是默认的,如何servlet容器替换后面会有内容讲解。

第10小章是讲解如何生成springboot的基础项目,这个是给缺少基础的初学者看的,可以不用太关注,如果想生成,可以直接用https://start.spring.io/ 这个。

11小章开始正篇。
基础的helloworld很简单,先配置maven文件,强烈建议使用springboot提供的parent,不要自己一个个去单独依赖,这个parent本身写的比较好,可以作为很多项目的参考。如果你有一定的基础,可以不照着官方的started文档的代码来写,本身这段代码也比较少比较简单。这里我构造的项目结果如下,因为后续就主要用这个项目来学习springboot,因此就取名main,包名也尽量做到规范
springboot学习(一)——helloworld

具体代码如下
pom.xml

<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>pr.study.springboot</groupId>
  <artifactId>main</artifactId>
  <version>1.0.0</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
  </parent>

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

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

Main,java

package pr.study.springboot;

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

@SpringBootApplication
public class Main {

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

HelloWorldController.class

package pr.study.springboot.controller;

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

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

几点说明:
1、因为springboot-parent中的dependencies是使用dependencyManagement的形式,这种形式的依赖不会强制继承,必须在子pom中显式声明才会继承,但是不用声明版本,声明了版本会提示一个warning。

2、继承spring-boot-maven-plugin是为了利用springboot的fat-jar打包功能,和dependency一样,也是使用Management的形式,需要显式声明才会依赖。

3、Main.class我们编写的代码的启动入口类,使用spring-boot-maven-plugin打包成jar并用java -jar启动时,这个类并不是真正应用程序入口类Main-Class。

4、官方的代码中controller和main函数写在一个类中,因此可以不需要SpringBootApplication这个注解,写在不同的类中就需要这个注解,否则扫描不到controller。通过源码可以知道@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan,它具有ComponentScan的作用,因此不需要像spring程序那样显式指定包扫描.

5、@EnableAutoConfiguration,这个注解后面代表的一系列功能是springboot的核心之一,自动配置,这个注解解决了很多配置问题。他的基本原理就是通过你的maven依赖来猜出你需要注入那些bean,它会帮你启动相关配置并注入这个bean。这里我们依赖了spring-boot-starter-web,它就会帮我们开启springmvc相关的配置并自动注入相关的必须的bean。因为会自动配置并注入,所以springboot程序的依赖管理很重要没用的依赖尽量都去掉,特别是那些数据库相关的依赖。关于springboot的自动配置,这个是重点之一,后面细说。

6、@RestController = @Controller + @@ResponseBody,也是一个复合注解,减少代码量,类似的还有@GetMapping、@PostMapping等等。

上面这六点,1-3可以通过maven相关的知识更进一步了解,具体就是maven依赖管理以及maven打包,本人没有系统的学习,知识简单了解,所以这里就不细说了。4-6在后续的springboot学习中会慢慢学习到。

运行程序可以直接在Main上运行java application作为普通java程序运行,这时候Main中的main函数就是真正的启动函数。这里是使用嵌入式tomcat作为servlet容器来运行servlet程序,所以并不需要我们部署到tomcat。
springboot学习(一)——helloworld

红色标记的就是已经扫描到了并初始化成功了HelloWorldController。

打开浏览器请求 http://localhost:8080/hello 可以看到运行结果
springboot学习(一)——helloworld

如果运行出现这种问题

The Bean Validation API is on the classpath but no implementation could be found

那么请删除下springboot相关的本地jar包,有时候jar包下载会抽风。本身springmvc里面是依赖有hibernate-validator作为参数校验的(@Valid @Validated使用),是不应该出现这个问题的。

如果你想打包部署,因为引用了spring-boot-maven-plugin,所以直接运行 mvn clean package就可以打包,最后打包的target是一个fat-jar,也就是包含了所有依赖的可运行jar包。
打包好后,在路径下命令行输入 java -jar main-1.0.0.jar 就可以启动
springboot学习(一)——helloworld

你可以把 java -jar main-1.0.0.jar 写到脚本文件sh or bat中,这样就可以作为一个简单的启动脚本,然后和jar一起发送到目标机器上,运行启动脚本启动程序,这样就差不多就算是完成了一次简单的springboot程序的部署发布。

把这个打包好的jar解压下,简单看下结构
springboot学习(一)——helloworld

BOOT-INF是应用程序的主体,classes下面的就是我们的写的代码,lib里面的就是是我们的程序依赖的jar包
META-INF是一些基础数据,其中比较重要的就是MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: main
Implementation-Version: 1.0.0
Archiver-Version: Plexus Archiver
Built-By: pengrui
Implementation-Vendor-Id: pr.study.springboot
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: pr.study.springboot.Main
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_111
Implementation-URL: http://projects.spring.io/spring-boot/main/

这个文件描述了jar的基本结构

  • Main-Class:通过java -jar 启动时应用程序启动的真正主类,java程序可以有多个main函数,但是这个类中的main函数的第一个启动的函数
  • Start-Class:我们的springboot程序启动的类,直接运行main方法时,这个类中的main函数最先运行,通过 java -jar 运行时,这个类中main并不是最先运行的,只是从这个类开始,我们的写的那部分代码才开始运行
  • Spring-Boot-Classes:我们写的代码存放的路径
  • Spring-Boot-Lib:我们的依赖包存放的路径

关于JarLauncher以及org.springframework.boot.loader.*里面的内容,我还没有研究过,这个后续再细说。

到这里,一个简单的springboot程序的编码、本地测试运行、打包、启动就都简单过了一遍,后面再一个个补充丰满。

代码相关:
https://gitee.com/page12/stud...
https://github.com/page12/stu...

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Redis未授权访问漏洞复现学习
0x00前言前段时间看到想复现学习一下,然后就忘了越临近考试越不想复习!在这里插入图片描述(https://oscimg.oschina.net/oscnet/ec73a943a3d9e18184946ee4c4ca290e14f.jpg)常见的未授权访问漏洞Redis未授权访问漏洞MongoDB未授权访问漏
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
CanOpen学习笔记1
这是很久以前写的一点学习笔记,一直放在云笔记里面,最近有点空闲时间,打算整理一下把以前的笔记都分享出来,希望能对正在学习的人有所用处。有的内容有很长一段时间没搞过了,有些遗忘了,分享的博客有错误的地方还请各位看客不吝指出,谢谢。先写写CanFestival3的对象字典编辑器的安装使用吧。要安装的辅助软件还不少,先把Python和wxPython安装
Stella981 Stella981
3年前
SpringBoot学习之路:01.开发环境搭建及概念叙述
        最近刚刚开始学习SpringBoot框架,在此记录自己的学习过程,记录自己在学习过程中遇到的坑,以及解决问题的过程,有不对的地方请各位批评指正,开始环境搭建之前先说说一些基本的概念:1.什么是SpringBoot    SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简
Stella981 Stella981
3年前
NIO开发Http服务器(5
最近学习了JavaNIO技术,觉得不能再去写一些HelloWorld的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室。我们是做WEB开发的,整天围着tomcat、nginx转,所以选择了一个新的方向,就是自己开发一个简单的Http服务器,在总结JavaNIO的同时,也加深一下对http协议的理解。项目实现了静态资源(
赛博朋克
赛博朋克
Lv1
何必去怀念犯过的错何必去遗憾那些如果.
文章
5
粉丝
0
获赞
0