IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot2——了解自动配置原理 -> 正文阅读

[Java知识库]SpringBoot2——了解自动配置原理

1、SpringBoot特点

1.1、依赖管理

我们查看一下 pom.xml 文件中的项目依赖情况:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
</parent>

点进去之后发现其还有父项目:

<parent>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-dependencies</artifactId>
 	<version>2.6.6</version>
</parent>

点进去之后:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.6.6</version>
  <packaging>pom</packaging>
  <name>spring-boot-dependencies</name>
  <description>Spring Boot Dependencies</description>
  <url>https://spring.io/projects/spring-boot</url>
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0</url>
    </license>
  </licenses>
  <developers>
    <developer>
      <name>Pivotal</name>
      <email>info@pivotal.io</email>
      <organization>Pivotal Software, Inc.</organization>
      <organizationUrl>https://www.spring.io</organizationUrl>
    </developer>
  </developers>
  <scm>
    <url>https://github.com/spring-projects/spring-boot</url>
  </scm>
  <properties>
    <activemq.version>5.16.4</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.95</appengine-sdk.version>
    <artemis.version>2.19.1</artemis.version>
      ......

父项目的主要功能就是依赖管理,几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制。

  • 无需关注版本号,自动版本仲裁

    1. 引入依赖默认都可以不写版本;
    2. 引入非版本仲裁的jar,要写版本号。

    比如:我们想要引入mysql的依赖

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    

    在这里我们不需要指定版本号。刷新maven后,查看版本号为:8.0.28

    可以查找一下spring-boot-dependencies文件中指定的mysql版本号:

    <mysql.version>8.0.28</mysql.version>
    
  • 可以修改默认版本号

    1. 查看spring-boot-dependencies里面规定当前依赖的版本用的key;
    2. 在当前项目里面重写配置

    比如:就修改mysql的驱动版本为5.1.43

    查看spring-boot-dependencies里面规定当前依赖的版本用的key:(上边已经提到过了,使用的是<mysql.version>标签)

    在当前项目的 pom.xml 中重写:

    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>
    

    再次刷新maven,可以看到mysql的包就是5.1.43了。

开发导入starter场景启动器

  1. spring-boot-starter-* : *就某种场景

  2. 只要引入starter,这个场景的所有常规需要的依赖我们都自动引入

  3. SpringBoot所有支持的场景

    https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

  4. *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器

  5. 所有场景启动器最底层的依赖

    <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter</artifactId>
      	<version>2.6.6</version>
      	<scope>compile</scope>
    </dependency>
    

可以使用IDEA的功能,查看一下jar包的依赖关系:

在这里插入图片描述

1.2、自动配置

  • 自动配好Tomcat

    1. 引入Tomcat依赖

      web的场景spring-boot-starter-web中已经引入Tomcat:

      <dependency>
        	<groupId>org.springframework.boot</groupId>
        	<artifactId>spring-boot-starter-tomcat</artifactId>
        	<version>2.6.6</version>
        	<scope>compile</scope>
      </dependency>
      
    2. 配置Tomcat

      可以在统一的配置文件中进行配置即可。

  • 自动配好SpringMVC

    1. 引入SpringMVC全套组件

    2. 自动配好SpringMVC常用组件(功能)

        • SpringBoot帮我们配置好了所有web开发的常见场景

      验证:在主程序中我们打印一下IOC容器中注册的Bean:

      @SpringBootApplication
      public class MainApplication {
          public static void main(String[] args) {
              //1、返回IOC容器
              ConfigurableApplicationContext run =
                      SpringApplication.run(MainApplication.class, args);
              //2、查看容器里边的组件
              String[] names = run.getBeanDefinitionNames();
              for (String name :
                      names) {
                  System.out.println(name);
              }
          }
      
      }
      

      第一、在web应用中,肯定要配置的就是前端控制器:dispatcherServlet

      org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration dispatcherServlet
      

      第二、解决字符乱码问题,需要配置字符编码过滤器:characterEncodingFilter

      org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
      characterEncodingFilter
      

      第三、视图解析器

      ......
      defaultViewResolver
      viewResolver
      ......
      

      第四、文件上传解析器:multipartResolver

      org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
      multipartConfigElement multipartResolver
      
  • 默认的包结构

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

    • 无需以前的包扫描配置

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

      • 或者 @ComponentScan 指定扫描路径

      查看 @SpringBootApplication 源码:

      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan(
          excludeFilters = {@Filter(
          type = FilterType.CUSTOM,
          classes = {TypeExcludeFilter.class}
      ), @Filter(
          type = FilterType.CUSTOM,
          classes = {AutoConfigurationExcludeFilter.class}
      )}
      )
      public @interface SpringBootApplication {
          ......
      

      是一个组合了其他注解的组合注解。

  • 各种配置拥有默认值

    • 默认配置最终都是映射到某个类上,如:MultipartProperties

      在这里插入图片描述

    • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

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

    • 非常多的starter
    • 引入了哪些场景这个场景的自动配置才会开启
    • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

2、容器功能

2.1、组件添加

准备两个组件User和Pet:

public class Pet {
    private String name;
    ......
public class User {
    private String name;
    private Integer age;
    ......

之前使用Spring进行组件注册,我们需要创建一个**xml配置文件**,在里边使用 <bean> 标签进行组件注册。

使用SpringBoot,则可以使用 @Configuration 注解。

2.1.1、@Configuration

使用 @Configuration 注解标注一个类(配置类),就相当于说明这是一个配置文件。

@Configuration //告诉SpringBoot,这是一个配置类 == 一个配置文件
public class MyConfig {

    @Bean //给容器中添加组件,以方法名作为组件的id,返回类型是组件类型。返回的值,就是组件在容器中的实例
    public User user01(){
        return new User("zhangsan", 18);
    }

    @Bean("tom") //自定义组件名id
    public Pet tomPet(){
        return new Pet("tomPet");
    }
}

使用 @Bean 注解给容器中注册组件:以方法名作为组件的id,返回类型是组件类型。返回的值,就是组件在容器中的实例。

也就是说,id默认为方法名,也可以自定义组件名id。

那么,如何查看容器中是否包含指定id的类呢?

在主程序中,从IOC容器中获取指定id名的Bean:

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1、返回IOC容器
        ConfigurableApplicationContext run =
                SpringApplication.run(MainApplication.class, args);
        //2、查看容器里边的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name :
                names) {
            System.out.println(name);
        }

        //3、从容器中获取组件
        Pet tom01 = run.getBean("tom", Pet.class);
        Pet tom02 = run.getBean("tom", Pet.class);

        System.out.println(tom01 == tom02); //true
    }

}

也就是说,使用 @Bean 默认就是单实例。

未完待续…

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:29:52  更:2022-04-07 22:30:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:39:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码