0%

SpringBoot学习笔记1

前言

  之前学的springboot笔记,放上来方便查看

SpringBoot 2

1.入门基础

雷丰阳老师语雀地址:https://www.yuque.com/atguigu/springboot

  1. 需要掌握
  • 熟悉Spring基础
  • 熟悉Maven使用
  1. 环境要求

2.spring与springboot

2.1 基本区别

  • 宏观上的spring包括整个spring生态圈
    • web开发
    • 数据访问
    • 安全控制
    • 分布式
    • 消息服务
    • 移动开发
    • 批处理
  • 微观上的spring仅仅指spring framework
  • spring底层是Java
  • springboot底层是spring

2.2 spring5的重大升级

  • 增加了响应式编程 reactive stack
  • 内部源码设计
    • 基于Java8的一些新特性,如:接口默认实现。重新设计源码架构。
    • 接口默认实现需要关键字default,对于该方法提供了空实现

2.3 springboot优缺点

  • 优点
    • Create stand-alone Spring applications
    • 创建独立Spring应用
    • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
    • 内嵌web服务器
    • Provide opinionated ‘starter’ dependencies to simplify your build configuration
    • 自动starter依赖,简化构建配置
    • Automatically configure Spring and 3rd party libraries whenever possible
    • 自动配置Spring以及第三方功能
    • Provide production-ready features such as metrics, health checks, and externalized configuration
    • 提供生产级别的监控、健康检查及外部化配置
    • Absolutely no code generation and no requirement for XML configuration
    • 无代码生成、无需编写XML

SpringBoot是整合Spring技术栈的一站式框架

SpringBoot是简化Spring技术栈的快速开发脚手架

  • 缺点
    • 人称版本帝,迭代快,需要时刻关注变化
    • 封装太深,内部原理复杂,不容易精通

3.第一个springboot程序

https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.first-application

  1. 配置pom文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    </parent>

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>
  2. 编写主程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*
    * 主程序类
    * @SpringBootApplication:这是一个SpringBoot应用
    * */
    @SpringBootApplication
    public class Main {
    public static void main(String[] args) {
    SpringApplication.run(Main.class,args);
    }
    }
  3. 编写controller

    1
    2
    3
    4
    5
    6
    7
    @RestController
    public class HelloController {
    @RequestMapping("/hello")
    public String handle01(){
    return "Hello, Spring Boot 2!";
    }
    }

    注:官网用的,把上述两个文件写在一起

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @RestController
    @EnableAutoConfiguration
    public class MyApplication {

    @RequestMapping("/")
    String home() {
    return "Hello World!";
    }

    public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
    }

    }
  4. 运行程序,直接在浏览器输入地址即可

  5. 配置文件统一写在application.properties

    1
    2
    #修改默认端口号
    server.port=8888
  6. 快捷生成可执行的jar

    1
    2
    3
    4
    5
    6
    7
    8
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    ![image-20210711170405448](SpringBoot 2-01.assets/image-20210711170405448.png)

![image-20210711170440942](SpringBoot 2-01.assets/image-20210711170440942.png)

​ 执行命令:jar包目录下 java -jar jar包名.jar

4.springboot特点

  1. 依赖管理

    • 父项目做依赖管理
    • 开发导入starter场景启动器
    • 无需关注版本号,自动版本仲裁
    • 可以修改默认版本号
    1
    2
    3
    4
    5
    1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
    2、在当前项目里面重写配置
    <properties>
    <mysql.version>5.1.43</mysql.version>
    </properties>
  2. 自动配置

    • 自动配好Tomcat

    • 自动配好SpringMVC

    • 自动配好Web常见功能,如:字符编码问题

    • 默认的包结构

      • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来

      • 无需以前的包扫描配置

      • 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.atguigu”)

      • 或者@ComponentScan 指定扫描路径

      1
      2
      3
      4
      5
      @SpringBootApplication
      等同于
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan("com.atguigu.boot")
    • 各种配置拥有默认值

    • 按需加载所有自动配置项

5.容器功能

5.1 组件添加

  1. @Configuration
    • 基本使用
    • @Configuration(proxyBeanMethods = true)Full模式与Lite模式
      • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断,false
      • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式,默认true
  2. @Bean、@Component、@Controller、@Service、@Repository

    和之前spring中的注解一样

  3. @ComponentScan、@Import
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     * 4@Import({User.class, DBHelper.class})
    * 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
    *
    *
    *
    */

    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
    public class MyConfig {
    }
  4. @Conditional

    条件装配:满足Conditional指定的条件,则进行组件注入

5.2 原生配置文件引入

  1. @ImportResource

    1
    @ImportResource("classpath:beans.xml")

5.3 配置绑定

  1. @Component + @ConfigurationProperties

    1
    2
    3
    4
    5
    /**
    * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
    */
    @Component
    @ConfigurationProperties(prefix = "mycar")
    1
    2
    mycar.carName=byd
    mycar.carPrice=100
  2. @EnableConfigurationProperties + @ConfigurationProperties

    1
    2
    3
    4
    5
    @EnableConfigurationProperties(Car.class)
    //1、开启Car配置绑定功能
    //2、把这个Car这个组件自动注册到容器中
    public class MyConfig {
    }

6.自动装配原理

6.1 引导加载自动配置类

  • @SpringBootApplication表示这是一个springboot应用,里面包括

  • ```Java
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(

    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
    

    ), @Filter(

    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
    

    )}
    )

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    1. @SpringBootConfiguration

    表示当前是一个配置类@Configuration

    2. @ComponentScan

    指定扫描

    3. @EnableAutoConfiguration

    ```Java
    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    • @AutoConfigurationPackage自动配置包,其中包含了默认的包规则

    • ~~~java
      @Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
      public @interface AutoConfigurationPackage {}

      //利用Registrar给容器中导入一系列组件
      //将指定的一个包下的所有组件导入进来?MainApplication 所在包下。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11

      - @Import(AutoConfigurationImportSelector.class)

      - ~~~Java
      1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
      2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
      3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
      4、从META-INF/spring.factories位置来加载一个文件。
      默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
      spring-boot-autoconfigure-2.5.2.RELEASE.jar包里面也有META-INF/spring.factories
      一共131

      ![image-20210712174901262](SpringBoot 2-01.assets/image-20210712174901262.png)

6.2 按需开启自动配置

1
2
虽然我们127个(2.5.2一共131个)场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。

6.3 修改默认配置

springboot底层已经配置好了所有了组件,用户配置了的话则以配置的优先

因为里面都有条件装配

1
2
3
4
5
6
7
8
9
10
        @Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
}
给容器中加入了文件上传解析器;

总结:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

  • 生效的配置类就会给容器中装配很多组件

  • 只要容器中有这些组件,相当于这些功能就有了

  • 定制化配置

  • 用户直接自己@Bean替换底层的组件

  • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 —-> application.properties

同时需要修改某些默认的配置

6.4 最佳实践

7.开发技巧

7.1 Lombok

  • 主要是不用额外写getter,setter等方法
  • 实际使用看公司需求

7.2 热部署

  1. devtools

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    </dependency>
    • 项目或者页面修改以后:Ctrl+F9;
    • 只适合springboot
  2. jrebel

使用教程:https://blog.csdn.net/lianghecai52171314/article/details/105637251

  • 适合所有Java代码
  • 收费
  • 安装路径不允许有中文,解决https://blog.csdn.net/sweet_chu/article/details/102838558
  • 目前对于idea热部署最好的解决方案就是安装JRebel插件
  • 项目或者页面修改以后:
    • Ctrl+Shift+F9;
    • 鼠标移开就可以
  • 无法生效情况
    • 重新往容器里面注入东西
    • 修改resource下面的东西

7.3 Spring Initailizr(项目初始化向导)

  • 选择new Spring Initailizr,选择好需要的场景依赖
    • 自动导入依赖
    • 自动生成项目结构
    • 自动生成主类

![image-20210713170615292](SpringBoot 2-01.assets/image-20210713170615292.png)

-------------本文结束感谢您的阅读-------------
您的支持将成为我创作的动力!