SpringBoot (一) --- 从Hello World开始!
一.SpringBoot是什么
在2003年,一个轻量级的Java开发框架横空出世,Spring是抱着解决企业级应用开发的复杂性,简化开发而出现的。但随着Spring的不断发展,涉及的领域逐渐增多,整个项目需要配合各种各样的文件,Spring开始变得笨重,繁琐的配置导致了开发和部署效率的降低,这与当初的设计理念背道而驰。于是在这样的背景下,SpringBoot出世了!SpringBoot不是Spring的替代品,而是提升Spring开发者体验的工具。SpringBoot以约定大于配置的思想帮我们集成了大量第三方库配置,是我们只需要基于少量的配置就能完成我们的开发任务,使开发者更专注于自己的业务逻辑。
SpringBoot优点:
简化 Spring 应用程序的创建和开发过程
开箱即用,提供各种默认配置简化项目开发
内嵌的Tomcat容器简化Web项目
没有冗余代码生成和XML配置的要求
不管怎样,我始终认为编程的乐趣在于我们完美运行出结果的那一刻~而我们大部分人输出的第一行代码也一定是Hello World!
所以,现在就让我们着手试试吧!
二. Hello World!
创建一个SpringBoot项目
填写自己的代码路径和选择版本
选择SpringBoot版本
SNAPSHOT为快照版本,并不稳定,我们不要选择
创建成功目录
.gitignore就是git软件要忽略的文件列表.(不用git的话可删除)
HELP.md md是一种文档格式 项目的帮助文档(可删除)
mvnw linux上处理mevan版本兼容问题的脚本(可删除)
mvnw.cmd windows 上处理mevan版本兼容问题的脚本(可删除)
我们只需要关注pom.xml
为了后期项目的统一管理,我们甚至可以把src文件夹都删掉,然后建立子项目。(如果你不想,可以从第5步直接跳到第10步)
查看我们的Maven路径:File --> Settings -->Build,Execution,Deployment -->Build Tools
如果本地没有Maven仓库,会默认保存在C:\Users\YourName\.m2下面,占用C盘空间
清除完整后样式
创建子项目,选择Project Structure...
点击+,然后new module,接下里与刚刚的创建流程类似
创建完成示例(我们同样可以把没必要的文件删除)
创建父子工程依赖关系
打开文件夹,我们可以看到有一个叫SpringBoot01Application的文件,他是我们程序的主入口
接下来我们需要编写一个http接口,在SpringBoot01Application的同级创建一个controller包,编写HelloController
HelloController:
package com.pan.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String Hello(){
return "Hello World!";
}
}
接下来,返回SpringBoot01Application文件运行,然后去浏览器输入localhost:8080/hello就能得到我们的结果啦!是不是很简单,是不是很兴奋!
三.总结与认识
刚刚上面的一片截图只是为了快速创建一个项目让大家上上手,先体验体验一下,激发大家兴趣,接下来我们进一步了解SpringBoot.
1. 谈谈SpringBoot的目录结构
src/main/java路径:主要编写业务程序,我们的业务代码都会放在这下面
src/main/resources路径:存放静态文件和配置文件,你看的有些教程下面可能会有static和templates这两个文件夹,static是主要存放静态文件的目录, 比如JS, CSS样式, 图片等,template目录是用来保存动态模版文件的目录, 比如Freemarker, JSP, Thymeleaf等需要服务器动态渲染数据的文件,但在实际的开发中,我们一般会自己映射路径
src/test/java路径:主要编写测试程序,我们平时的测试代码可以先放在这里运行
2. 两个pom.xml
父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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pan</groupId>
<artifactId>SpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot</name>
<description>SpringBoot</description>
<!-- 绑定子项目 -->
<packaging>pom</packaging>
<modules>
<module>SpringBoot-01</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot单元测试 -->
<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>
子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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>2.7.9</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<groupId>com.pan</groupId>
<artifactId>SpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SpringBoot-01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot-01</name>
<description>SpringBoot-01</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- 大家发现我们的依赖里面没有web场景启动器,但因为我们和父pom进行了绑定,我们的项目刚刚仍然顺利启动,
甚至即使注释掉下面的内容我们的项目依旧可以启动,
以后这个pom可以放该项目独有的依赖,进行模块化管理 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter</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>
3. 出现的注解
在上面的几行代码中一共出现了三个注解,我们就来看看这三个注解:
@SpringBootApplication:该注解出现的地方是SpringBoot项目的启动类,主要目的是开启自动配置,他是一个组合注解。按住ctrl+鼠标左键点击
我们发现还有很多注解,而其中最主要的是这三个@SpringBootConfiguration:、@EnableAutoConfiguration、@ComponentScan
@SpringBootConfiguration:
该注解继承自@Configuration,二者功能基本一致,标注当前类是配置类,除此之外,会在当前类内声明一个或多个以@Bean注解标记的方法实例纳入到Spring容器中。并且实例方法就是方法名。
@EnableAutoConfiguration:
借助@Import的支持,收集和注册特定场景相关的Bean配置。将所有符合自动配置条件的bean定义加载到IoC容器。
@ComponentScan:
告诉Spring那个package的用注解标识的类会被Spring自动扫描并切装入IoC容器中。2、自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些Bean加载到IoC容器中。例如:如果有个类使用了@Controller注解标识;那么如果不加上@ComponentScan,进行自动扫描改controller,那么该Controller就不会被Spring扫描到,更不会装入Sprint容器中,因此@Controller注解也没有任何意义。
@RestController:作用等同于@Controller + @ResponseBody
@Controller: 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。当然也有语义化的作用,即代表该类是充当Controller的作用
@ResponseBody: 它的作用简短截说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其他Object,它会以Json字符串的形式返回给客户端
@RequestMapping:这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
该注解可以在控制器类的级别和/或其中的方法的级别上使用。当他同时作用在类和方法上时
@RestController
@RequestMapping("/hello")
public class HelloWorld {
@RequestMapping("/")
public String hello() {
return "Hello World";
}
@RequestMapping("/index")
String index() {
return "index";
}
}
如上,到 /home 的请求会由 hello() 方法来处理,而到 /hello/index 的请求会由 index() 来处理。
处理多个 URI
@RestController
@RequestMapping("/test")
public class Test {
@RequestMapping(value = {
"",
"/a",
"a*",
"b/*,**/c"
})
public String hello() {
return "Hello World";
}
}
以下请求都会被处理:
localhost:8080/test
localhost:8080/test/
localhost:8080/test/a
localhost:8080/test/a
localhost:8080/test/b/
localhost:8080/test/b/b
@RequestParam 注解配合 @RequestMapping 一起使用,可以将请求的参数同处理方法的参数绑定在一起。@RequestParam 注解使用的时候可以有一个值,也可以没有值。这个值指定了需要被映射到处理方法参数的请求参数
@RequestParam语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
RequestMapping有太多知识点了,单独都能写一篇文章,这里就不多做介绍了...