Loading

1 2

【01】SpringBoot2核心技术-基础入门

SpringBoot 2

2021-12-09_211649

2021-12-09_211850

1. SpringBoot2核心技术-基础入门

01 Spring与SpringBoot

1、Spring 能做什么

1.1 Spring的能力

2021-12-09_212215

  • 微服务:将一个应用的所有功能拆分成一个一个微小的功能模块,一个微小的功能模块就是一个微服务
  • 响应式编程:为了应对高并发服务器端开发场景,一种实现异步编程的方式。
  • 分布式应用
  • web开发
  • 无服务开发:函数式服务
  • 事件驱动

1.2 Spring生态圈

2021-12-09_212754

覆盖了:

​ web开发

​ 数据访问

​ 安全控制

​ 分布式

​ 消息服务

​ 移动开发

​ 批处理

​ ......

1.3 Spring5重大升级

​ SpringBoot2基于Spring5,Spring5基于JDK8,但也支持Java 9

​ 两套编程方法:响应式编程技术栈传统Servlet技术栈

2021-12-09_213433

​ 基于JDK8的一些新特性,比如接口默认实现,重新设计源码架构

2、为什么要用SpringBoot

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

能快速创建出生产级别的Spring应用,让我们使用Spring开发变得简单

2.1 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依赖,简化构建配置(已经将使用到的web开发环境各种依赖整合完毕,并进行了版本控制)
  • 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、时代背景

3.1 微服务

James Lewis and Martin Fowler (2014) 提出微服务完整概念。https://martinfowler.com/microservices/

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.-- James Lewis and Martin Fowler (2014)

  • 微服务是一种架构风格

  • 一个应用拆分为一组小型服务

  • 每个服务运行在自己的进程内,也就是可独立部署和升级

  • 服务之间使用轻量级HTTP交互

  • 服务围绕业务功能拆分

  • 可以由全自动部署机制独立部署

  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术

3.2 分布式

​ 微服务的出现,导致大型软件被拆分成一个一个小的微服务独立部署后,必然会产生分布式,进而产生一系列的分布式问题。

image

分布式的困难

  • 远程调用

  • 服务发现

  • 负载均衡

  • 服务容错

  • 配置管理

  • 服务监控

  • 链路追踪

  • 日志管理

  • 任务调度

  • ......

分布式的解决

  • SpringBoot + SpringCloud

2021-12-09_215952

使用SpringBoot创建出许多微服务模块,然后使用SpringCloud将许多微服务模块给网状连接起来,再使用Spring Cloud Data Flow将各个微服务网络之间的数据流做成响应式数据流。

3.3 云原生

原生应用如何上云。 Cloud Native

上云的困难

  • 服务自愈

  • 弹性伸缩

  • 服务隔离

  • 自动化部署

  • 灰度发布

  • 流量治理

  • ......

02 SpringBoot2 入门

1、环境要求

SpringBoot 2.6.1

  • Java 8 或更高
  • Maven 3.5+(配置好阿里云镜像)

2、HelloWorld

​ 浏览器发送 /hello 请求,响应请求,并打印输出"Hello! SpringBoot 2!"

2.1 创建Maven工程并引入依赖

​ 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>SpringBoot2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

2.2 创建主程序

用于启动SpringBoot应用

/**
*   主程序类
*       @SpringBootApplication:这是一个SpringBoot应用
* */
@SpringBootApplication
public class MainApplication {

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

}

2.3 编写业务逻辑

@RestController // ResponseBody、@Controller
public class HelloSpringBoot {

    @RequestMapping("/hello")
    public String hello(){
        return "Hello! SpringBoot 2!";
    }
}

2.4 测试

​ 直接运行main方法,并在浏览器中输入/hello请求

2021-12-09_225512

2.5 如何简化配置

​ 在resources文件下创建application.properties文件,就可以在其中进行配置:

#修改Tomcat本地服务器端口号
server.port=8888 

​ 如果需要更多的配置,可以去参考官方文档(Spring Boot Reference Documentation)的Application Properties

2.6 简化部署

  • 在pom.xml文件中添加:
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • clean和package

    2021-12-09_225900

  • target文件下的jar包,可以直接使用java -jar命令

    2021-12-09_230131

  • 测试:发送/hello请求,能够显示响应的文字

03 了解自动配置原理

1、SpringBoot特点

1.1 依赖管理

  • 父项目做依赖管理

​ 在pom.xml文件中:

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

​ 进入他的父项目中发现还有一个父项目:

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

​ 再进去,就能发现里面引入了许多Spring开发中需要的jar包,并使用properties标签对各个jar包的版本号进行了控制:几乎声明了所有开发中常用的依赖的版本号——自动版本仲裁机制

2021-12-10_103707

2021-12-10_103724

  • 开发导入starter场景启动器

    1、会有很多starter,spring-boot-starter-* : *就某种场景
    2、只要引入starter,那么这个场景的所有常规需要的依赖,都会为我们自动引入
    3、SpringBoot所有支持的场景(各种starter)
    https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
    4、见到的  *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
    5、所有场景启动器最底层的依赖,在pom.xml的dependencies标签内中spring-boot-starter-web引入
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
          <version>2.6.1</version>
          <scope>compile</scope>
        </dependency>
    
  • 无需关注版本号,自动版本仲裁

    • 引入依赖默认可以不写版本,因为父项目已经声明了版本号

              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
              </dependency>
      
    • 引入非版本仲裁的jar,才会写版本号。修改默认版本号,只需在pom.xml文件中重写配置即可

          <properties>
              <mysql.version>8.0.27</mysql.version>
          </properties>
      

1.2 自动配置

  • 自动配置好Tomcat(在pom.xml文件中的starter-web中,引入了tomcat的starter)

    • 引入Tomcat依赖
    • 配置好Tomcat
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <version>2.6.1</version>
          <scope>compile</scope>
        </dependency>
    
  • 自动配好SpringMVC(配置地点,跟tomcat一样,使用了starter)

    • 引入SpringMVC全套组件
    • 自动配好SpringMVC常用组件(功能)
  • 自动配好Web常见功能,如:字符编码问题

    • SpringBoot帮我们配置好了所有web开发的常见场景
  • @SpringBootApplication
    public class MainApplication {
    
        // 打印IOC容器中的组件,就可以知道SpringBoot为我们配置好了哪些常用的组件
        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);
            }
        }
    
    }
    
  • 默认的包结构

    • 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来(注意!为什么不需要配置包扫描的原因)
    • 无需以前的包扫描配置
    • 想要改变扫描路径,在主程序注解中@SpringBootApplication(scanBasePackages="com.atguigu")
      • 或者@ComponentScan 指定扫描路径
    • //@SpringBootApplication // 与下面三个注解等价
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan("com.atguigu")
      
  • 各种配置拥有默认值(在application.properties里面更改)

    • 默认配置最终都是映射到某个类上,如:MultipartProperties
    • 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
  • 按需加载所有自动配置项

    • 非常多的starter
    • 引入了哪些场景这个场景的自动配置才会开启
    • SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面(starter-web —> boot-starter)
  •     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-autoconfigure</artifactId>
          <version>2.6.1</version>
          <scope>compile</scope>
        </dependency>
    

2、容器功能

2.1 组件添加

1、@Configuration
  • 基本使用

    代替原来Spring中的xml配置文件

    /**
    *   1、配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
    *   2、配置类本身也是组件
    *   3、proxyBeanMethods:代理bean的方法,默认为true
     *      Full模式(proxyBeanMethods =true,每次创建新对象都会去容器中找)
     *      Lite模式(proxyBeanMethods =false,外部多次调用时,不是去容器中找代理对象,而是每次创建一个新的对象)
     *      组件依赖
    * */
    @Configuration(proxyBeanMethods =true) // 告诉SpringBoot这是一个配置类 等同于 xml配置文件
    public class MyConfig {
    
        /**
        *  Full模式:外部无论对配置类的这个组件注册方法调用多少次获取,获取的都是之前容器中注册的单实例对象
        * */
    
        @Bean // 给容器中添加组件:以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例
        public User user01(){
            return new User("Jack", 18);
        }
    
        @Bean("tom") // 方法名,就是这个组件(bean对象在IOC容器中)的名称,自定义名称的话,直接在标签后注明
        public Pet tomcatPet(){
            return new Pet("tomcat");
        }
    }
    
  • Full模式与Lite模式

    • Full模式(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】

    • Lite模式(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】

    • 使用区别:

      当@Configuration注解修饰的配置类中,各组件没有依赖的话,就使用Lite模式,可以减少SpringBoot的加载时间,提高运行效率,因为SpringBoot总会检查这个组件是否在容器中存在;如果有组件依赖,则使用Full模式,保证各组件之间依赖调用的组件对象,是同一个对象。

  • 最佳实战

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan("com.atguigu.boot")
    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(单实例模式)
    
    
            //4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892
            MyConfig bean = run.getBean(MyConfig.class); 
            System.out.println(bean); // 配置文件类同样也是一个组件
    
            //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。
            //保持组件单实例
            User user = bean.user01();
            User user1 = bean.user01();
            System.out.println(user == user1); //true
    
            User user01 = run.getBean("user01", User.class);
            Pet tom = run.getBean("tom", Pet.class);
    
            System.out.println("用户的宠物:"+(user01.getPet() == tom)); // true,如果调成false(也就是Lite模式),此时结果是false
        }
    }
    
2、@Bean、@Component、@Controller、@Service、@Repository

​ 可以像以前一样使用

3、@ComponentScan、@Import
 * 4、@Import({User.class, DBHelper.class})
 *      给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名(如:com.atguigu.boot.bean.User)
 */
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}

@Import 高级用法

4、@Conditional

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

image (1)

当容器中有tom组件时,才会添加user01组件

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

当然,@condition注解也可以修饰类,修饰类时,条件装配成立时,才会执行

2.2 原生配置文件引入

已经有了原生配置文件,但又不想进行一个迁移操作的时候:

使用@ImportResource注解

​ 在一个配置类上使用这个注解,原生配置文件放在resources文件夹下,并使用classpath进行引入

@Configuration(proxyBeanMethods =true) // 告诉SpringBoot这是一个配置类 等同于 xml配置文件
@ImportResource("classpath:beans.xml") // 导入原生配置文件,添加到容器中
public class MyConfig {

2.3 配置绑定

如何使用Java,将读取到的properties文件中的内容,封装到JavaBean中,以供随时使用。

​ 传统方法:

public class getProperties {
     public static void main(String[] args) throws FileNotFoundException, IOException {
         Properties pps = new Properties();
         pps.load(new FileInputStream("a.properties"));
         Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
         while(enum1.hasMoreElements()) {
             String strKey = (String) enum1.nextElement();
             String strValue = pps.getProperty(strKey);
             System.out.println(strKey + "=" + strValue);
             //封装到JavaBean。
         }
     }
 }
1、@ConfigurationProperties

需要将application.properties中的某些配置属性封装成一个JavaBean对象:

  • application.properties:
server.port=8888 
mycar.brand=BYD
mycar.price=100000
  • 对properties文件中的mycar前缀的属性,进行封装
/**
 * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
 */
@Component // 为了让这个bean生效,加上注解,添加到容器中进行调用
@ConfigurationProperties(prefix = "mycar") // prefix:前缀名,限制前缀
public class Car {

    private String brand;
    private Integer price;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}
  • 测试
@RestController // ResponseBody、@Controller
public class HelloSpringBoot {

    @Autowired
    Car car;

    @RequestMapping("/car")
    public Car car(){
        return car;
    }
}

2021-12-10_215907

2、@EnableConfigurationProperties + @ConfigurationProperties

有两种方法能够将引入的类加入到容器中:

  • 第一种情况:像前文配置绑定类一样,用@Component修饰配置绑定类,加入到容器中

  • 第二种情况:往往适用于导入第三方包的类

    • 主配置类前使用@EnableConfigurationProperties
    @Configuration(proxyBeanMethods =true) // 告诉SpringBoot这是一个配置类 等同于 xml配置文件
    //@ImportResource("classpath:beans.xml")
    @EnableConfigurationProperties(Car.class)
    public class MyConfig {
    
    • 待添加到容器的类,这里指Car类,就无需@Component修饰,就能加入到容器中
    @ConfigurationProperties(prefix = "mycar") // prefix:前缀名,限制前缀
    public class Car {
    

3、自动配置原理入门

3.1 引导加载自动配置类

​ 关于@SpringBootApplication注解,进入注解所在注解文件:

​ 发现有三个合成注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}


======================
  • @SpringBootConfiguration

    这个注解又被@Configuration修饰,说明其实代表当前是一个配置类

  • @ComponentScan

    指定扫描组件的位置

  • @EnableAutoConfiguration

    进入该注解,发现其也是一个合成注解

    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {}
    
    • @AutoConfigurationPackage

      @Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件
      public @interface AutoConfigurationPackage {}
      
      //利用Registrar给容器中导入一系列组件
      //将指定的一个包下的所有组件导入进来,即MainApplication所在包下。
      
    • @Import(AutoConfigurationImportSelector.class)

      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.3.4.RELEASE.jar包里面也有META-INF/spring.factories
      

      2021-12-11_215234

      文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
      spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories
      # Auto Configure
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
      org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
      org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
      org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
      org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
      org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
      org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
      org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
      org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
      org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
      org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
      org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
      org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
      org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
      org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
      org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
      org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
      org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
      org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
      org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
      org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
      org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
      org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
      org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
      org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
      org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
      org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
      org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
      org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
      org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
      org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
      org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
      org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
      org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
      org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
      org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
      org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
      org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
      org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
      org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
      org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
      org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
      org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
      org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
      org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
      

3.2 按需开启自动配置项

虽然我们127个场景的所有自动配置启动的时候默认全部加载。:xxxxAutoConfiguration.class(自动配置类)
但当我们设置按照条件装配规则(@Conditional)时,最终会按需配置。

​ 这里以AopAutoConfiguration举例:

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(
    prefix = "spring.aop",
    name = {"auto"},
    havingValue = "true",
    matchIfMissing = true
)
public class AopAutoConfiguration {}

解读:

  • 首先这是一个@Configuration修饰的,代表这是一个配置类
  • @ConditionalOnProperty:条件装配规则,进行判断,只有满足条件时,才会配置这个类,将这个组件添加至容器
    • matchIfMissing = true:就算没有配置,也算是配置了

3.3 修改默认配置

        @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默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先。

总结:

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

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

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

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

  • 定制化配置的两个方法:

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

    • 用户去看这个组件是获取的配置文件什么值,就去修改。例如:在application.properties文件中设置配置值

      server.servlet.encoding.charset=GBK
      

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

​ 修改配置值的两种方法:

  • 第一种:查官方properties文档

  • 第二种:去org.springframework.boot:spring-boot-autoconfigure jar包中查看xxxxxAutoConfiguration:

    2021-12-11_223254

3.4 最佳实践

4、开发小技巧

4.1 Lombok

简化JavaBean开发(不一定使用)

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
            
idea中搜索安装lombok插件(使用注解就行了)
===============================简化JavaBean开发===================================
@NoArgsConstructor // 无参构造器
//@AllArgsConstructor // 全参构造器
@Data
@ToString
@EqualsAndHashCode
public class User {

    private String name;
    private Integer age;

    private Pet pet;

    public User(String name,Integer age){
        this.name = name;
        this.age = age;
    }


}

================================简化日志开发===================================
@Slf4j
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String handle01(@RequestParam("name") String name){
        
        log.info("请求进来了....");//sout会影响性能,log不影响
        
        return "Hello, Spring Boot 2!"+"你好:"+name;
    }
}

4.2 dev-tools

​ 用于热重启

​ 其实用热重载(如:tomcat的reload)也可以实现,最好用热重载

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

项目或者页面修改以后:Ctrl+F9(重新build的时候,会自动重启)

posted @ 2021-12-13 10:36  Komorebi_WH  阅读(129)  评论(0编辑  收藏  举报