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

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

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

官方文档有十个大章节,第一章是综述,就不用太细看了,这里直接从第二章开始,也是介绍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,包名也尽量做到规范

具体代码如下

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>pr.study.springboot</groupId>
  5. <artifactId>main</artifactId>
  6. <version>1.0.0</version>
  7. <parent>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-parent</artifactId>
  10. <version>1.5.8.RELEASE</version>
  11. </parent>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. </dependencies>
  18. <build>
  19. <plugins>
  20. <plugin>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-maven-plugin</artifactId>
  23. </plugin>
  24. </plugins>
  25. </build>
  26. </project>

Main,java

  1. package pr.study.springboot;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Main {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Main.class, args);
  8. }
  9. }

HelloWorldController.class

  1. package pr.study.springboot.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class HelloWorldController {
  6. @RequestMapping("/hello")
  7. public String hello() {
  8. return "hello world";
  9. }
  10. }

几点说明:

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。

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

打开浏览器请求 http://localhost:8080/hello 可以看到运行结果

如果运行出现这种问题

  1. 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 就可以启动

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

把这个打包好的jar解压下,简单看下结构

BOOT-INF是应用程序的主体,classes下面的就是我们的写的代码,lib里面的就是是我们的程序依赖的jar包

META-INF是一些基础数据,其中比较重要的就是MANIFEST.MF

  1. Manifest-Version: 1.0
  2. Implementation-Title: main
  3. Implementation-Version: 1.0.0
  4. Archiver-Version: Plexus Archiver
  5. Built-By: pengrui
  6. Implementation-Vendor-Id: pr.study.springboot
  7. Spring-Boot-Version: 1.5.8.RELEASE
  8. Implementation-Vendor: Pivotal Software, Inc.
  9. Main-Class: org.springframework.boot.loader.JarLauncher
  10. Start-Class: pr.study.springboot.Main
  11. Spring-Boot-Classes: BOOT-INF/classes/
  12. Spring-Boot-Lib: BOOT-INF/lib/
  13. Created-By: Apache Maven 3.3.9
  14. Build-Jdk: 1.8.0_111
  15. 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/study-springboot

https://github.com/page12/study-springboot

springboot学习(一)——helloworld的更多相关文章

  1. SpringBoot学习之Helloworld

    1. 如果使用Spring开发一个"HelloWorld"的web应用 创建一个web项目并且导入相关jar包.SpringMVC Servlet 创建一个web.xml 编写一个 ...

  2. springboot 学习资源推荐

    springboot 是什么?对于构建生产就绪的Spring应用程序有一个看法. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.(这是springboot的官方介绍) 我们为什么要学 ...

  3. AspectJ基础学习之三HelloWorld(转载)

    AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...

  4. [Cocos2d-x for WP8学习笔记] HelloWorld结构分析

    先来看一下目录结构: Assets:游戏资源文件,图片音频等,Resource文件夹也有类似功能 include:用于放置游戏头文件 Shaders:渲染器着色器文件(大雾) cocos2dorig. ...

  5. [Cocos2d-x for WP8学习笔记] HelloWorld

    Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...

  6. (一)IDEA工具开第一个springboot应用之helloworld

    (一)IDEA工具开第一个springboot应用之helloworld 一.前置知识 1.maven相关知识 2.spring注解 3.RESTful API 二.idea开发第一个springbo ...

  7. Springboot学习记录1--概念介绍以及环境搭建

    摘要:springboot学习记录,环境搭建: 官方文档地址:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/ht ...

  8. SpringBoot学习笔记

    SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...

  9. SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问

    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672

随机推荐

  1. 打字机效果-so easy

    html <p> <span>有了梦想,我们的心有了飞翔:有了飞翔,我们的梦想不再遥远......</span> </p> js $(function( ...

  2. node学习笔记(二)(ajax方式向node后台提交数据)

    通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...

  3. HTML5开发在2017年发展趋势如何?

    随着移动互联网行业的飞速发展,人们借助于网络相互传达获取的信息越来越广泛,互联网前端开发中HTML5是最受关注的热点,HTML5让开发者和用户重新的对网页有了新的认识,从浏览器到APP都在受h5带来的 ...

  4. ABAP 7.52 中的Open SQL新特性

    S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52. 本文翻译了更新文档中有关Open SQL的部分 本文链接:http://www.cnblogs.com/hhelibe ...

  5. 谈谈form-data请求格式

    最近一直都比较忙,坚持月月更新博客的计划不得中止了,今天好不容易抽出点时间来说说最近项目中遇到的一个问题,有关request post请求格式中的multipart/form-data格式. 引言 最 ...

  6. [C#]使用Gembox.SpreadSheet向Excel写入数据及图表

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  7. kvm虚拟机管理 系统自动化安装

    原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...

  8. linux内核模块编程实例

    linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...

  9. CCF-201409-2-画图

    问题描述 试题编号: 201409-2 试题名称: 画图 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩 ...

  10. Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径)

    在今天的学习Maven项目中遇到的这个错误:pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径) 在Maven项目学习中,缓存问 ...