Spring Boot
jdk1.8
maven 3.6.1
springboot:最新版
IDEA最新
思维导图

介绍
spring是什么
轻量级的Java 开发框架
Spring是为了解决企业级应用开发的复杂性而创建的,,简化开发
spring如何简化
为了降低Java开发的复杂性,Spring采用了以下4种关键策略 1、基于POJO的轻量级和最小侵入性编程; 2、通过IOC容器,依赖注入(DI)和面向接口实现松耦合 3、基于切面(AOP)和惯例进行声明式编程; 4、通过切面和模版减少样式代码
Java企业级应用->J2EE->spring->springboot的过程
约定大于配置
Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。
并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具
Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置
同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用
默认配置了很多框架的使用方式,就像maven整合了所有的jar包
Spring Boot的主要优点:
为所有Spring开发者更快的入门
开箱即用,提供各种默认配置来简化项目配置
内嵌式容器简化Web项目
没有冗余代码生成和XML配置的要求
程序=数据结构+算法I(集合框架); 程序猿 程序=面向对象+框架; 码农
微服务
也是一种架构
业务service:userService:===>模块!(将业务服务拆分成模块)
springmvc,controller ==>提供接口!
架构

单体应用架构(al in one)

微服务架构(分块)
例如:
用户下单:controller!
背后:
仓库冻结:资金冻结;验证:购买成功,仓库数量减少,仓库解冻,资金解冻(太多了,容易崩,所以放在不同服务器上)把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。
服务和服务器之间接口连接,一个服务器需要维修,先提供缓存,更新好之后再连接接口
启动
启动服务

目录分析

配置文件可以修改端口号 server.port=8081
修改spring的图标,找点自动生成的网站,如下图banner.txt

建立第一个项目一定要在application同级目录下

建立项目时,未导入依赖,可以在pom.xml文件里面自行写入
pom.xml里面的每一个东西都是一个启动器
注意:
Maven 使用
pom.xml管理依赖和构建配置;Gradle 则使用
build.gradle(或build.gradle.ktskotlin 脚本)
如果使用Gradle 构建就没有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>3.5.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</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>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring-boot-dependencies:核心依赖在父工程中!
我们在写或者引入一些SPringboot依赖的时候,不需要指定版本,就因为有这些版本仓库
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>说白了就是Springboot的启动场景
比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!
(spring-boot-starte-xxxxx xxx就是相关的环境名称)
springboot会将所有的功能场景,都变成一个个的启动器
我们要使用什么功能,就只需要找到对应的启动器就可以了
主程序
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注解(相当于是启动类)
(1)控制层注解
@RestController // = @Controller + @ResponseBody,返回 JSON类型的数据
eg:浏览器 → [@RestController] → 所有方法自动带“直接给包裹”属性 → 输出:{"name":"张三", "age":20} → 直接返回给浏览器
@RequestMapping("/user") // 路径映射
@GetMapping("/list") // GET 请求
@PostMapping("/add") // POST 请求
@PutMapping("/update") // PUT 请求
@DeleteMapping("/delete") // DELETE 请求(2)Bean 管理注解
将对象交给 Spring 容器管理,javabbean就是java的类
这类注解用于标记类,告诉 Spring:“这个类的对象由你创建并管理”,无需手动
new对象@Component // 通用组件
@Service // 业务层
@Repository // 数据层
@Controller // 控制层(3)依赖注入
@Autowired // 自动注入
@Resource // JSR-250 注入(常见于兼容老项目)
@Value("${server.port}") // 获取配置(4)配置注解
@Configuration // 配置类
@Bean // 方法上定义 Bean
就是将方法作为对象存储,在下次使用的时候不需要再次new,直接调用即可
@ConfigurationProperties(prefix = "myconfig") // 配置属性绑定


注意:这么多自动配置为什么有的没有生效,需要导入对应的start才能有作用???
核心注解:@ConditionalOnXXX:如果这里面的条件都满足,才会生效
结论:
自动导入的核心文件:

springboot所有自动配置都是在启动的时候扫描并加载:spring.factories 所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了 对应的 start ,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!
springboot在启动的时候,从类路径下 /META-INF/spring.factories 获取指定的值;
将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!
以前我们需要自动配置的东西,现在springboot帮我们做了!
整合javaEE,解决方案和自动配置的东西都在 spring-boot-autoconfigure-2.2.0.RELEASE.jar 这个包下
它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置, @Configuration,JavaConfig!
有了自动配置类,免去了我们手动编写配置文件的工作!
主程序启动
最初以为就是运行了一个main方法,没想到却开启了一个服务
一部分是SpringApplication的实例化
二是run方法的执行
SpringApplication主要:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
run流程分析:

关于SpringBoot的理解 1、自动装配 2、run()
是普通的项目还是Web项目
推断当前的主类是哪个(你也可以自己写带有注解的主类,不使用默认的但是记得干掉它)
编译处理上下文的bean
自动装配的全面接管SpringMVC的配置
使用
配置
热部署

如何配置

这个可以删,自己重写一个,但是application不能变,变后缀
application.yaml是什么?
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
application.properties
语法结构 :key=value
server.port=8081
application.yaml
语法结构 :key:空格 value
server:
port: 8081
#这必须有空格,不然就就报错配置文件的作用 :修改SpringBoot自动配置的默认值**,因为SpringBoot在底层都给我们自动配置好了
(可以同时存在两个配置文件,两个有优先级)
区别:

配置文件可以存在的路径(yaml)(同时代表了优先级)
flie:./config/(在主文件夹新建一个config目录,写yaml文件)
file:./(和主文件夹同级,写yaml文件)
classpath:/config/(在类文件下新建config目录,写yaml文件)
classpath:/(和类文件夹同级,写yaml文件)

配置多个环境
properties

正常启动走的是默认的配置文件(8080)
如何走其他的配置文件呢??
直接在默认的配置文件里面写
spring.profiles.active=dev//要么写dev,要么写test(就是写—后面你那个东西)
(其他配置文件记得写端口)
yaml
server:
port: 8081---
server:
port: 8082
spring:
profiles: dev---
server:
port: 8083
spring:
profiles: test激活:
spring:
profiles:
active: dev
自动装配原理
精髓: 1)、SpringBoot启动会加载大量的自动配置类 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中: 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了) 4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可: xxxxAutoConfigurartion:自动配置类:给容器中添加组件 xxxxProperties:封装配置文件中相关属性(通过配置文件修改(yaml))
查看自动配置类有没有生效
debug = true;//返回日志,
赋值
原生方式(spring)

yaml赋值
赋值的注解问题:(这个配置,可配可不配,不影响程序运行)

直接利用这个注解,将yaml文件的值和类的值进行绑定
@Configuration(prefix = "person")

在测试文件写输出语句
package com.test;
import ...
@SpringBootTest
class Springboot02ConfigApplicationTests {@Autowired
private Person person;@Test
void contextLoads() {
System.out.println(person);
}
}使用properties
不用使用上面的注解,换一个
@PropertySource(value = "classpath:mmm.properties")
//mmm.properties是你传参的properties文件@Value("${name}")
//
结论:配置yml和配置properties都可以获取到值 ( 强烈推荐 yml)
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value(spring)
如果说,我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties,不要犹豫!(Properties)
JSP303校验

强制格式
松散绑定:
yml中写的last-name,这个和lastName是一样的,后面跟着的字母默认是大写的。
这就是松散绑定
SpringbootWeb开发
之前都是jar包,webapp没处放(问题衍生)
springboot特点:自动装配
springboot 到底帮我们配置了什么? 我们能不能进行修改? 能修改哪些东西? 能不能扩展?
xxxxAutoConfiguraion..向容器中自动配置组件
xxxxProperties:自动配置类,装配配置文件中自定义的一些内容!
要解决的问题
导入静态资源…
网页首页(出现404报错问题)
写jsp,通过模板引擎
Thymeleaf装配扩展SpringMVC
增删改查
拦截器
国际化(中英文切换)
静态资源导入

创建文件的时候,就默认存在了资源包(静态和模板)
查看自动装配的源码
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
this.addResourceHandler(registry, this.mvcProperties.getWebjarsPathPattern(), "classpath:/META-INF/resources/webjars/");
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (Consumer)((registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
registration.addResourceLocations(new Resource[]{resource});
}}));
}
}添加静态资源的
webjars/导入一个静态资源包xxx.jar

写到pom.xml里面,等待下载之后直接就会部署到扩展包中
源码提到路径:
"classpath:/META-INF/resources/webjars/"

自主导入的静态资源
webjars/...就会映射到这个路径下直接访问可得到源码

ResourceHandlerRegistry registry是一个回调方法
前端访问什么路径(如
/static/**)时,系统会去哪个目录(如classpath:/static/)找对应的静态资源(跟上面的webjars一样)普通静态资源映射
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (Consumer)((registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
registration.addResourceLocations(new Resource[]{resource});
}
}));this.mvcProperties.getStaticPathPattern():获取静态资源的访问路径规则,默认是/**(可通过spring.mvc.static-path-pattern配置修改,比如改为/static/**)Lambda 表达式,于配置资源的存放目录(
ResourceLocations)registration.addResourceLocations(this.resourceProperties.getStaticLocations()):ResourceProperties.getStaticLocations()
//返回 Spring Boot 默认的静态资源目录,顺序是:classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/(可通过
spring.resources.static-locations自定义修改,但是一旦自定义,默认的目录就失效了)
按照上面的默认目录:有4个
总结:
在springboot,我们可以使用以下方式处理静态资源
webjars
localhost:8080/webjars/public,static, /**,resources
localhost:8080/
比较这四个目录的优先级:resources>static(默认)>public
首页定制
依旧查看配置源码
WebMvcAutoConfiguration.class@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
return (WelcomePageHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageHandlerMapping::new);
}@Bean
public WelcomePageNotAcceptableHandlerMapping welcomePageNotAcceptableHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
return (WelcomePageNotAcceptableHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageNotAcceptableHandlerMapping::new);
}private <T extends AbstractUrlHandlerMapping> T createWelcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider, WelcomePageHandlerMappingFactory<T> factory) {
TemplateAvailabilityProviders templateAvailabilityProviders = new TemplateAvailabilityProviders(applicationContext);
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
T handlerMapping = factory.create(templateAvailabilityProviders, applicationContext, this.getIndexHtmlResource(), staticPathPattern);
handlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
handlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return handlerMapping;
}意思就是说,要在静态资源的配置文件里面写index.html 让 Spring Boot 应用在访问根路径(如
http://localhost:8080/)时能自动展示欢迎页(通常是index.html或模板引擎渲染的首页)也可以使用templates目录下存放index.html
而且templates只能通过controller跳转,而且需要模板引擎支持(需要导入jar包)
模板引擎
thymreleaf
使用演示
流程图
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



