目录
3.4 @RestController 和 @RequestMapping 注解使用
3.5 Maven在Spring boot的作用(SpringBoot项目启动)
# 只想着把笔记放到上面,供以后参考。
Java后端导航:
本文章参考:
官网:https://docs.spring.io/spring-boot/docs/current/reference/html/
中文网:https://springdoc.cn/spring-boot/
学习SpringBoot之前我们先了解一下什么是微服务架构:
首先Spring Boot是一个用于构建独立的、基于Spring的应用程序的框架。它可以帮助开发者快速构建单体应用。然而,当需要构建大规模、分布式的应用程序时,可以使用Spring Cloud来构建微服务架构。
服务器架构介绍:
微服务架构是一种软件架构风格,将一个大型应用程序拆分为一组小型、相互独立的服务,每个服务都可以独立开发、部署和扩展。每个服务都围绕着特定的业务功能构建,可以通过轻量级的通信机制(如HTTP或消息队列)进行通信。微服务架构的核心原则是将应用程序拆分为一组小而自治的服务,每个服务都可以有自己的数据库,并通过API进行通信。
微服务架构的优势包括:
- 独立开发和部署:每个服务可以独立开发、测试和部署,这样可以提高开发团队的效率。
- 弹性和可伸缩性:由于每个服务都是自治的,可以根据需求独立扩展和缩减服务,提高系统的弹性和可伸缩性。
- 技术多样性:每个服务可以使用不同的技术栈和编程语言,以最适合特定需求的方式实现功能。
- 容错性:由于每个服务都是独立的,一个服务的故障不会影响整个系统的运行,提高了系统的容错性。
- 独立团队和自治性:每个服务可以由一个独立的团队负责开发和维护,团队可以根据需要进行决策,提高了团队的自治性和效率。
然而,微服务架构也带来了一些挑战,如服务间通信的复杂性、服务拆分和边界的定义、分布式事务的管理等。因此,在采用微服务架构时需要权衡利弊,并根据具体情况进行设计和实施。
1、Spring Boot
Spring Boot是由Pivotal团队提供的全新框架。
1.1 Spring Boot概念:
Spring Boot基于Spring开发,Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来代替Spring的解决方案,而是和Spring框架紧凑结合用于提升Spring开发者体验的工具。
Spring Boot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数Spring Boot应用只需要很少的Spring配置,同时它集成了大量常用的第三方库配置(例如:Redis、MongoDB、Jpa、RabbitMQ、Quartz等等...),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用。
简单的说就是Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架。
而Spring Boot还是出生名门,从一开始就站在一个比较高的起点,又经过这几年的发展,生态足够完善,Spring Boot已经当之无愧成为Java领域最热门的技术。
1.1.2 Spring Boot的特征:
- 创建独立的Spring应用程序。
- 直接嵌入Tomcat,Jetty或Undertow。(无需部署WAR文件)
- 提供自以为是的“入门”依赖项,以简化您的构建配置。
- 尽可能自动配置Spring和3rd Party库。
- 提供可用于生产的功能,例如指标,运行状况检查和外部化配置。
- 完全没有代码生成,也不需要XML配置。
2、第一个Spring Boot程序
在IDEA中创建一个spring initializr,并导入spring-boot-starter-web依赖,这样做会生成一个新的项目结构。
默认生成的Spring boot项目结构有:主启动类+配置文件。
3、初探Spring Boot启动的原理
3.1 pom.xml介绍(Starters启动器介绍)
Starter依赖参考:https://springdoc.cn/spring-boot/using.html#using.build-systems.starters
- spring-boot-starter-parent 是一个特殊的starter,它在pom.xml 的 dependency-management 里面声明了Spring Boot的各个依赖及其版本。子项目直接继承它,子项在导入 Spring Boot 依赖时,不需要声明版本号。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
以上依赖也称为启动器:
Starter解释:
Starter可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成spring及其他技术,而不需要到处找示例代码和依赖包。如果你想使用Spring JPA访问数据库,只要加入spring-boot-data-jpa启动器依赖就可以直接使用。
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。
除Spring Boot以外的第三方的启动器不能以spring-boot开头命名,它们都被spring boot官方保留。
启动器作用:
- 比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!
- springboot会将所有的功能场景,都变成一个个的启动器。
- 我们要使用什么功能,就只需要找到对应的启动器
starter
,导入对应的依赖即可。
3.2 注解@SpringBootApplication
在说明@SpringBootApplication注解的时候,让我们先来了解一下它包含的其他注解吧:
首先@SpringBootApplication注解的自动装配还是众人皆知的,而@SpringBootApplication是一个元注解也可以说是一个组合注解。
它是由Spring Framework提供的一个注解,用于简化配置和启动Spring Boot应用程序。元注解是指可以应用于其他注解上的注解。
@SpringBootApplication这个组合注解,它整合了多个其他注解,包括@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。这些注解的作用如下:
- @SpringBootConfiguration:用于标识该类是Spring Boot应用程序的配置类,相当于@Configuration注解。
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制,根据项目的依赖和配置,自动配置Spring应用程序的各种组件。
- @ComponentScan:扫描指定的包及其子包,注入Spring管理的Bean。在启动类添加
@ComponentScan
注解,也不需要定义它任何参数, 你的所有应用组件(@Component
、@Service
、@Repository
、@Controller
和其他)都会自动注册为Spring Bean.
通过使用@SpringBootApplication注解,可以简化Spring Boot应用程序的配置,减少开发人员的工作量。只需要在主类上添加@SpringBootApplication注解,就可以自动配置Spring Boot应用程序,并扫描指定包中的组件。
需要注意的是,@SpringBootApplication注解通常应用于Spring Boot应用程序的主类上,以标识应用程序的入口点。
自动装配(Spring Boot的自动装配是依靠@SpringBootApilication内部的注解来完成自动装配的,而这些注解又与spring boot的Starter启动器紧密相关)
自动配置是Spring Boot框架的一大特点,它通过分析项目的依赖和配置来自动配置Spring应用程序的各个组件,简化了开发者的配置工作。例如,如果项目引入了Spring Data JPA依赖,Spring Boot会自动配置JPA相关的Bean,无需手动配置。这样,开发者只需要关注业务逻辑的实现,而不需要关心底层框架的配置,这就是自动装配。
注解代码介绍:
// 该注解是Spring Boot框架中的核心注解之一。它的作用是将一个类标记为Spring Boot应用程序的主类。
@SpringBootApplication
// 该注解是一个特定于Spring Boot的配置类注解,用于标记一个类为Spring Boot的配置类,并启用自动装配和组件扫描功能,以及定义和配置其他的应用程序配置项。
@SpringBootConfiguration
@Configuration // spring配置类注解
@Component // spring的注解
// 启用自动配置机制,根据项目的依赖和配置,自动配置Spring应用程序所需的Bean和配置。
@EnableAutoConfiguration
@AutoConfigurationPackage // 自动配置包
@Import(AutoConfigurationPackages.Registrar.class) // 自动配置"包注册"
@Import(AutoConfigurationImportSelector.class) // 自动配置导入选择
Spring Boot所有的自动配置都是在启动时扫描并加载。
所有的自动装配类都在这个里面被扫描,但是不一定都生效,要判断条件是否成立。我们要导入对应的start,就有了对应的启动器,有了启动器,我们的自动装配才会生效,才能成功。
装配步骤:
- springboot在启动的时候,从类路径下/META-INF/
spring.factories
获取指定的值。 - 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!
- 以前我们需要自动配置的东西,现在springboot帮我们做了!
- 整合JavaEE,解决方案和自动配置的东西都在| 这个包下。
5.它会把所有需要导入的组件,以类名的方式返回,这些组件就会添加到容器。
6.容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些给容器中导入了这个场景需要的所有组件,并自动配置。
7.有了自动配置类,免去了我们手动编写配置文件的工作。
源代码图注解展示:
(获取所有的配置)方法查看:
3.3 主启动类怎么运行
运行SpringbootApplication主类就可以启动整个spring boot项目了。(运行完后访问localhost:8080端口测试)
重点是@SpringBootApplication
该注解继承了自动配置包,自动装配等等...功能。
// @SpringBootApplication 这个类是springboot的应用 启动类下的所有资源被导入
@SpringBootApplication
public class SpringbootApplication {
// 将springboot应用启动
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
3.4 @RestController 和 @RequestMapping 注解使用
@RestController 和 @RequestMapping 注解是Spring MVC注解(它们不是Spring Boot特有的)。
这里将它们与Spring Boot项目一起使用,@RestController将返回的结果字符串直接响应给客户端,@SpringBootApplication是spring boot的主要启动类注解,@RequestMapping("/") 这个注解提供了"routing"(路由)信息。它告诉spring。任何带有/路径的HTTP请求都应该被映射到home方法中去。
@RestController // 将返回的结果字符串直接响应给客户端
@SpringBootApplication // spring boot的主要启动类注解
public class SpringbootApplication {
@RequestMapping("/") // 该注解提供了"routing"(路由)信息。它告诉spring。任何带有/路径的HTTP请求都应该被映射到home方法中去。
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication .class, args);
}
}
3.5 Maven在Spring boot的作用(SpringBoot项目启动)
在启动了SpringBootApplication主要类后,由于配置了spring-boot-starter-parent的pom.xml依赖,这个依赖里面配置了一些maven以及gradle的命令也可以通过命令来启动。
所以在IDEA中直接启动Spring Boot默认生成的xxxApplication主类的main方法,再去访问localhost:8080地址,就会打印MyApplication下的home方法了。
注意:这个8080端口号是当前默认生成配置文件中配置的。application.properties
小结第一个Spring Boot项目步骤:
- 创建SpringBoot项目,导入web依赖。
- 在java.com.xxx包下面写一个home测试方法,访问路径进行测试。
- 测试启动xxxApplication主类中的main方法,并且访问默认在配置文件中生成的8080端口号(并进行路径访问)。
- 测试访问localhost:8080地址查看SpringBoot项目是否启动成功。
3.6 SpringMVC的配置
首先我们要实现一个视图解析器的接口,把它注册到bean中。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
// ViewResolver实现了视图解析器接口的类,我们就可以把它看作视图解析器
@Bean
public ViewResolver myViewResolver() {
return new MyViewResolver();
}
// 自定义了一个自己的视图解析器MyViewResolver
public static class MyViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
}
设置视图跳转,把所有访问lei路径的请求都跳转到test页面:
// 视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/lei").setViewName("test");
}
Spring Boot中@Configuration注解,这个注解代表着这是将MyMcvConfig类中的配置都注册到spring中去,代表这是一个Spring的配置类。
@EnableWebMvc注解开启SpringMVC代码实例。
Spring mvc的重点是开启mvc。
@Configuration // mvc配置
@EnableWebMvc // 开启springmvc
public class MyMvcConfig implements WebMvcConfigurer {
}
4、开始使用Spring Boot
常用Spring Boot项目类的介绍:
参考官网:
我们通常建议你将你启动类放在一个根package中,高于其他的类,@SpringBootApplication 注解一般都是注解在启动类上的。它默认会扫描当前类下的所有子包。例如,如果你正在编写一个JPA应用程序,你的
@Entity
类只有定义在启动类的子包下才能被扫描加载到。这样的好处也显而易见,@SpringBootApplication
默认只会扫描加载你项目工程中的组件。
Configuration类(通常在开发中我们都会自定义其它Configuration配置类来满足需求)
- 想要哪个类成为配置类,就在class的上方加上@Configuration注解即可。
- Spring Boot倾向于通过Java代码来进行配置的定义。 虽然也可以使用XML来配置
SpringApplication
,但还是建议你通过@Configuration
类来进行配置。 通常,可以把启动类是作为主要的@Configuration
类。
自动装配:
- Spring Boot的自动装配机制会试图根据你所添加的依赖来自动配置你的Spring应用程序。 例如,如果你添加了
HSQLDB
依赖,而且你没有手动配置任何DataSource Bean,那么Spring Boot就会自动配置内存数据库。 - 你需要将
@EnableAutoConfiguration
或@SpringBootApplication
注解添加到你的@Configuration
类中,从而开启自动配置功能。
SpingBean和依赖注入@Autowired 注解:
- 使用场景:如果一个Bean有多个构造函数,你需要用
@Autowired
注解来告诉Spring该用哪个构造函数进行注入。 - 当@Autowired注解写在类的上面时,表示该类需要被自动装配到容器中,并且会将该类的实例注入到其他需要该类的地方。
- 当@Autowired注解写在接口上面时,表示该接口的实现类需要被自动装配到容器中,并且会将该实现类的实例注入到其他需要该接口的地方。
- 需要注意的是,@Autowired注解只能用于装配被Spring容器管理的对象,即通过@Component、@Service、@Repository等注解声明的Bean。如果没有将类或接口声明为Spring Bean,即使在类或接口上使用@Autowired注解,也无法从容器中获取属性。
5、SpringBoot中的配置
参考教程:https://blog.csdn.net/qq_44932835/article/details/109783836
导入配置文件绑定的依赖:
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
5.1 yml配置文件读取,自动装配到类
直接上图按照步骤走:
基本在运行过程中不会遇到问题,如果在Spring Boot项目启动成功后,再配置yml配置文件的读取,自动装配到类期间出现了问题,那么就参考上面的教程,或者在评论区给某编评论。
5.2 使用@Value将配置文件值读取注入到类对象中
与以上的yml配置文件读取对象的不同点:没有了@ConfigurationProperties(prefix = "product")注解。
而是多了@Value("${product.name}")注解(配置完直接运行项目)。
三种读取的方式:(@Value不支持复杂类型(List是支持的)如下演示)
如果在使用配置文件注入的时候产生了乱码问题:
解决办法: 在idea的设置中设置字符编码集为UTF-8。
5.3 YML和Properties后缀解释
在Spring Boot框架中,"application.yml"和"application.properties"是默认的配置文件名。它们用于配置应用程序的属性和设置。
- "application"是文件名的前缀,表示这是应用程序的配置文件。
- ".yml"和".properties"是文件的扩展名,分别表示使用YAML格式和键值对格式进行配置。
这两个文件的作用是相同的,都用于配置应用程序的属性和设置,只是格式不同。
使用"application.yml"或"application.properties"文件,都可以指定应用程序的一些配置,如数据库连接信息、日志级别、服务器端口等。这些配置会被Spring Boot框架读取并应用到应用程序中。
使用"application.yml"或"application.properties"配置文件的好处是,可以集中管理应用程序的配置,而不需要硬编码到代码中。这样可以更方便地修改和调整应用程序的行为,而不需要重新编译和部署应用程序。
5.4 YAML配置文件的使用
详细参考:YAML 入门教程 | 菜鸟教程 (runoob.com)
注意:yaml对空格的要求特别高。
5.5 配置文件的优先级
- 第一优先级:项目下创建config/application.yaml
- 第二优先级:项目下的application.yaml
- 第三优先级:resources下的config/application.yaml
- 第四优先级:resources下的application.yaml
5.6 @Configuration注解的使用
@Configuration是用来配置Spring的配置信息的,它在配置类里面配置的信息只要加上@Bean注解那么这个配置就会出现在Spring的Bean容器当中。
5.7 JSR-303校验概念
JSR-303校验是Java标准化的一种校验框架,用于对Java对象进行数据校验。它可以帮助开发者在编写代码时,对数据进行合法性校验,从而减少错误和异常情况的发生,提高代码的健壮性和可靠性。
具体的案例包括:
- 表单数据校验:在Web开发中,用户提交的表单数据需要进行校验,以确保数据的合法性。JSR-303校验可以用于验证表单输入的数据,例如验证邮箱格式、密码复杂度、手机号码格式等。
- 实体对象校验:在业务逻辑处理中,需要对实体对象的属性进行校验,以确保满足业务规则。例如,在用户注册时,需要校验用户名是否已存在、密码是否符合要求等。
- 接口参数校验:在接口开发中,往往需要对传入的参数进行校验,以避免无效的参数导致的错误。JSR-303校验可以用于对接口参数进行校验,例如校验参数的非空性、长度范围、格式等。
- 数据库实体校验:在数据存储过程中,需要对数据库实体进行校验,以确保数据的完整性和一致性。JSR-303校验可以用于对数据库实体属性进行校验,例如校验字符串长度、数值范围、日期格式等。
6、任务
6.1 异步任务
1.创建一个Spring Boot项目,选择web支持
2.写一个service层方法
@Service
public class AsyncService {
// 告诉spring这是个异步方法
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理...");
}
}
3.写一个controller层测试调用service层的方法
@RestController
public class AsyncController {
@Autowired
AsyncService service;
@RequestMapping("/hello")
public String hello(){
service.hello(); // 停留3秒--转圈等待3秒
return "ok";
}
}
4.使用@Async注解 让这个方法变成异步方法。使用@EnableAsync注解在核心类中开启异步功能。
6.2 定时执行任务
@Service // 在service层操作
public class ScheduledService {
/**
* cron 表达式
* 秒 分 时 日 月 周几
* (cron = "0 45 21 * * ?")每天的21 点 45 分 0 秒执行一次
* 30 0/5 10 18 * * ? 每天的10和18点,每个5分钟执行一次
* 0 15 10 ? 1-6 每个月的周一到周六的10.15分执行
*
* */
@Scheduled(cron = "0 45 21 * * ?") // 加上注解
public void hello(){
System.out.println("hello,被执行了!");
}
}
"这篇博客记录了我的学习中的一些笔记,仅仅只是一个开始,还有更多的内容等待着我们去探索和分享。"