1 简介
1.1 Spring5框架和基本概念
1.1.1 什么是注解
Java注解是附加在代码中的⼀些元信息,⽤于⼀些⼯具在编译、运⾏时进⾏解析和使⽤,起到说明、配置的功能,注解本质上继承 Annotation 接⼝,我们可以通过反射获取注解的相关信息,从⽽做些逻辑操作。
springboot⾥⾯⼤量使⽤了注解,@Controller 、@RestController 、@Service、@Autowired 等
1.1.2 什么是Spring框架
什么是Spring:轻量级的 DI / IoC 和 AOP 容器的开源框架:https://spring.io/projects/spring-framework
1.1.3 有啥好处:
管理创建和组装对象之间的依赖关系, 加了spring注解的类会⾃动创建⼀个实例,加到IOC容器⾥⾯,然后看哪⾥需要它,就⾃动赋值过去。
使⽤前:⼿⼯创建
Controller -> Service -> Dao
UserControoler
private UserService userService = new UserService();
使⽤后:Spring创建,⾃动注⼊
Controller -> Service -> Dao
UserControoler
@Autowired
private UserService userService
2 快速入门
2.1 SpringCloud和SpringBoot的关系
单体应⽤:
- 开发速度慢
- 启动时间⻓
- 依赖庞⼤
微服务:
- 易开发、理解和维护
- 独⽴的部署和启动
问题:
- 分布式系统 --> 分布式事务问题
- 需要管理多个服务 --> 服务治理
SpringCloud和SpringBoot的关系
- SpringCloud基于SpringBoot
2.2 SpringBoot2.X介绍和环境依赖
SpringBoot2.X介绍
- 官⽹:https://spring.io/projects/spring-boot
- GitHub地址:https://github.com/spring-projects/spring-boot
- 官⽅⽂档:https://spring.io/guides/gs/spring-boot/
相关软件环境
- JDK1.8+以上
- Maven3.5+
- IDEA
- PostMan
2.3 SpringBoot2.X项⽬创建⼯具Spring Initializr
使⽤Spring Initializr创建SpringBoot2.X项⽬
- 常⻅的创建SpringBoot创建⽅式
- 本地创建,maven依赖
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
<groupId>com.jackyan</groupId>
<artifactId>springbootdemo1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 在线创建 :https://start.spring.io/
下载之后解压导入maven即可
最终自动生成的项目结构如下:
2.4 SpringBoot2.X开发第⼀个JSON接⼝
- 什么是SpringBoot,有什么⽤
⼀个web开发框架
Servlet 、SpringMVC
可以简化配置 - SpringBoot开发项⽬常⻅的交互使⽤形式
后端接⼝直接返回⻚⾯,现在⽐较少了
常⻅的传统IT公司⽐较多,配合模板引擎,由后端⻚⾯渲染返回
返回JSON数据,主流场景
互联⽹公司⽤的⽐较多,⽐如微服务接⼝,前后端分离项⽬,⼿机app等,基本都是通
过JSON交互 - 如何使⽤SpringBoot2.X开发JSON接⼝
@RestController注解
return ⼀个POJO对象 - 开发一个json接口
创建controller
com.jackyan.springbootdemo2.controller.TestController
@RestController
@RequestMapping("/app/v1/test")
public class TestController {
@RequestMapping("list")
public Object getList() {
Map<String, String> map = new HashMap<>();
map.put("1", "jackyan");
map.put("2", "daisy");
return map;
}
}
启动项目
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.2)
2022-01-11 16:23:51.217 INFO 28676 --- [ main] c.j.s.Springbootdemo2Application : Starting Springbootdemo2Application using Java 1.8.0_291 on LAPTOP-IIK6CDN8 with PID 28676 (C:\Users\yangzhihua01\IdeaProjects\springbootdemo2\target\classes started by yangzhihua01 in C:\Users\yangzhihua01\IdeaProjects\springbootdemo2)
2022-01-11 16:23:51.220 INFO 28676 --- [ main] c.j.s.Springbootdemo2Application : No active profile set, falling back to default profiles: default
2022-01-11 16:23:51.867 INFO 28676 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-01-11 16:23:51.875 INFO 28676 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-01-11 16:23:51.875 INFO 28676 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
浏览器访问
2.5 使用postman工具
2.6 SpringBoot2.X常⽤注解
- @Controller 作⽤:⽤于标记这个类是⼀个控制器,返回⻚⾯的时候使⽤;如果要返回JSON,则需要在接⼝上使⽤@ResponseBody才可以
- @RestController 作⽤:⽤于标记这个类是⼀个控制器,返回JSON数据的时候使⽤,如果使⽤这个注解,则接⼝返回数据会被序列化为JSON
所以:@RestController = @Controller+@ResponseBody - @RequestMapping 作⽤:路由映射,⽤于类上做1级路径;⽤于某个⽅法上做⼦路径
- @SpringBootApplication 作⽤: ⽤于标记是SringBoot应⽤,⾥⾯包含多个⼦注解,即
@SpringBootApplication =@Configuration+@EnableAutoConfiguration+@ComponentScan - @Configuration: 主要标注在某个类上,⽤于spring扫描注⼊,⼀般结合@Bean使⽤
- @EnableAutoConfiguration: 启⽤Spring的⾃动加载配置,⾃动载⼊应⽤程序所需的所有Bean
- @ComponentScan:告诉spring扫描包的范围,默认是Applocation类所在的全部⼦包,可以指定其他包:@ComponentScan({"net.xdclass.package1","net.xdclass.package2"})
3 SpringBoot2.X开发规范
3.1 SpringBoot2.x⽬录⽂件结构
- 目录
src/main/java:存放代码
src/main/resources: application.properties
static: 存放静态⽂件,⽐如 css、js、image, (访问⽅式 http://localhost:8080/js/main.js)
templates:存放静态⻚⾯jsp,html,tpl
config:存放配置⽂件,application.properties
同个⽂件的加载顺序,静态资源⽂件 Spring Boot 默认会挨个从
META/resources > resources > static > public ⾥⾯找是否存在相应的资源,如果有则直接返回,不在默认加载的⽬录,则找不到
默认配置:
spring.resources.static-locations = classpath:/META�INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
3.2 SpringBoot2.x启动类位置
三种形式:
1、当启动类和controller在同⼀类中时,在该类上添加注解@Controller即可;
2、当启动类和controller分开时,启动类要放在根⽬录下,启动类上只需要注解
@SpringBootApplication;
3、当启动类和controller分开时,如果启动类在⾮根⽬录下,需要在启动类中增加注解
@ComponentScan,并配置需要扫描的包名,如(basePackages = )
@ComponentScan(basePackages ={"net.jackyan.controller","net.jackyan.service"})
强烈推荐第⼆种⽅式,不然漏配置扫描包,项⽬庞⼤,出现问题则难排查
3.3 SpringBoot2.X启动⽅式
1、IDEA开发中启动 - 本地开发中常⽤
2、外置Tomcat中启动 - tomcat版本兼容问题复杂,微服务容器化部署复杂,接近淘汰
3、Jar⽅式打包启动 - 官⽅推荐,⼯作中最常⽤
步骤:pom⽂件新增maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果没有加,则执⾏jar包 ,报错如下
java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar no main manifest attribute, in spring-boot-demo-0.0.1-SNAPSHOT.jar
打包、启动命令
构建:mvn install
构建跳过测试类 mvn install -Dmaven.test.skip=true
target⽬录下有对应的jar包就是打包后项⽬
进到对应的target⽬录启动 java -jar xxxxx.jar 即可
想后台运⾏,就⽤守护进程 nohup java -jar xxx.jar &
3.4 解打包后的springboot⾥⾯的⽬录结构
example.jar
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-BOOT-INF
+-classes
| +-mycompany
| +-project
| +-YourClasses.class
+-lib
+-dependency1.jar
+-dependency2.jar