Bootstrap

Spring Boot框架(笔记一:详细概念)

目录

1、Spring Boot

1.1 Spring Boot概念:

1.1.2 Spring Boot的特征:

2、第一个Spring Boot程序 

3、初探Spring Boot启动的原理

3.1 pom.xml介绍(Starters启动器介绍)

3.2 注解@SpringBootApplication

3.3 主启动类怎么运行

3.4 @RestController 和 @RequestMapping 注解使用

3.5 Maven在Spring boot的作用(SpringBoot项目启动)

3.6 SpringMVC的配置

4、开始使用Spring Boot

5、SpringBoot中的配置

5.1 yml配置文件读取,自动装配到类

​5.2 使用@Value将配置文件值读取注入到类对象中

5.3 YML和Properties后缀解释

5.4 YAML配置文件的使用

5.5 配置文件的优先级

5.6 @Configuration注解的使用

​5.7 JSR-303校验概念

6、任务

6.1 异步任务

6.2 定时执行任务


# 只想着把笔记放到上面,供以后参考。

Java后端导航:

Spring框架详解

Mybatis框架详解

Spring Boot框架(笔记二:数据层操作)

SpringBoot框架(笔记三:数据库事务)

本文章参考:

官网:https://docs.spring.io/spring-boot/docs/current/reference/html/

中文网:https://springdoc.cn/spring-boot/

学习SpringBoot之前我们先了解一下什么是微服务架构:

        首先Spring Boot是一个用于构建独立的、基于Spring的应用程序的框架。它可以帮助开发者快速构建单体应用。然而,当需要构建大规模、分布式的应用程序时,可以使用Spring Cloud来构建微服务架构。

服务器架构介绍:

        微服务架构是一种软件架构风格,将一个大型应用程序拆分为一组小型、相互独立的服务,每个服务都可以独立开发、部署和扩展。每个服务都围绕着特定的业务功能构建,可以通过轻量级的通信机制(如HTTP或消息队列)进行通信。微服务架构的核心原则是将应用程序拆分为一组小而自治的服务,每个服务都可以有自己的数据库,并通过API进行通信。

微服务架构的优势包括:

  1. 独立开发和部署:每个服务可以独立开发、测试和部署,这样可以提高开发团队的效率。
  2. 弹性和可伸缩性:由于每个服务都是自治的,可以根据需求独立扩展和缩减服务,提高系统的弹性和可伸缩性。
  3. 技术多样性:每个服务可以使用不同的技术栈和编程语言,以最适合特定需求的方式实现功能。
  4. 容错性:由于每个服务都是独立的,一个服务的故障不会影响整个系统的运行,提高了系统的容错性。
  5. 独立团队和自治性:每个服务可以由一个独立的团队负责开发和维护,团队可以根据需要进行决策,提高了团队的自治性和效率。

然而,微服务架构也带来了一些挑战,如服务间通信的复杂性、服务拆分和边界的定义、分布式事务的管理等。因此,在采用微服务架构时需要权衡利弊,并根据具体情况进行设计和实施。

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,就有了对应的启动器,有了启动器,我们的自动装配才会生效,才能成功。

装配步骤:

  1. springboot在启动的时候,从类路径下/META-INF/spring.factories 获取指定的值。
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!
  3. 以前我们需要自动配置的东西,现在springboot帮我们做了!
  4. 整合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项目步骤:

  1. 创建SpringBoot项目,导入web依赖。
  2. 在java.com.xxx包下面写一个home测试方法,访问路径进行测试。
  3. 测试启动xxxApplication主类中的main方法,并且访问默认在配置文件中生成的8080端口号(并进行路径访问)。
  4. 测试访问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配置类来满足需求)

  1. 想要哪个类成为配置类,就在class的上方加上@Configuration注解即可。
  2. Spring Boot倾向于通过Java代码来进行配置的定义。 虽然也可以使用XML来配置 SpringApplication ,但还是建议你通过 @Configuration 类来进行配置。 通常,可以把启动类是作为主要的 @Configuration 类。

自动装配: 

  1. Spring Boot的自动装配机制会试图根据你所添加的依赖来自动配置你的Spring应用程序。 例如,如果你添加了 HSQLDB 依赖,而且你没有手动配置任何DataSource Bean,那么Spring Boot就会自动配置内存数据库。
  2. 你需要将 @EnableAutoConfiguration@SpringBootApplication 注解添加到你的 @Configuration 类中,从而开启自动配置功能。

SpingBean和依赖注入@Autowired 注解: 

  1. 使用场景:如果一个Bean有多个构造函数,你需要用 @Autowired 注解来告诉Spring该用哪个构造函数进行注入。
  2. 当@Autowired注解写在类的上面时,表示该类需要被自动装配到容器中,并且会将该类的实例注入到其他需要该类的地方。
  3. 当@Autowired注解写在接口上面时,表示该接口的实现类需要被自动装配到容器中,并且会将该实现类的实例注入到其他需要该接口的地方。
  4. 需要注意的是,@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 配置文件的优先级

  1. 第一优先级:项目下创建config/application.yaml
  2. 第二优先级:项目下的application.yaml
  3. 第三优先级:resources下的config/application.yaml
  4. 第四优先级:resources下的application.yaml

5.6 @Configuration注解的使用

        @Configuration是用来配置Spring的配置信息的,它在配置类里面配置的信息只要加上@Bean注解那么这个配置就会出现在Spring的Bean容器当中。

 5.7 JSR-303校验概念

        JSR-303校验是Java标准化的一种校验框架,用于对Java对象进行数据校验。它可以帮助开发者在编写代码时,对数据进行合法性校验,从而减少错误和异常情况的发生,提高代码的健壮性和可靠性。

具体的案例包括:

  1. 表单数据校验:在Web开发中,用户提交的表单数据需要进行校验,以确保数据的合法性。JSR-303校验可以用于验证表单输入的数据,例如验证邮箱格式、密码复杂度、手机号码格式等。
  2. 实体对象校验:在业务逻辑处理中,需要对实体对象的属性进行校验,以确保满足业务规则。例如,在用户注册时,需要校验用户名是否已存在、密码是否符合要求等。
  3. 接口参数校验:在接口开发中,往往需要对传入的参数进行校验,以避免无效的参数导致的错误。JSR-303校验可以用于对接口参数进行校验,例如校验参数的非空性、长度范围、格式等。
  4. 数据库实体校验:在数据存储过程中,需要对数据库实体进行校验,以确保数据的完整性和一致性。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,被执行了!");
    }

}

 "这篇博客记录了我的学习中的一些笔记,仅仅只是一个开始,还有更多的内容等待着我们去探索和分享。"

;