Springboot学习笔记(基础篇)

基础

Spring Boot基础篇笔记,涵盖核心技术刚开头的部分,包括yaml文件语法格式,以及配置文件相关知识。
更全面的笔记请参考文章底部分享连接。

1、自动装配原理

1.1 依赖管理

  • 父项目做依赖管理

    pom.xml 文件中可以看到整个springboot项目的maven依赖的是一个springboot的依赖

    <parent>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>
    
    <!-- spring-boot-starter-parent 的父依赖为 -->
    <parent>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>
    

​ 在 spring-boot-dependencies 中几乎依赖了所有开发中常用的依赖版本号,并且自动版本仲裁机制

​ 所谓版本仲裁机制就是说在父依赖中规定好了每一个依赖的 version ,如果在引入的时候直接添加 标签去更改,可能造成版本冲突。

  • 开发导入starter场景启动器

    springboot中所有的starter都是以 spring-boot-starter-* 方式,所以如果要使用自定义starter不要以这样的命名开头

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

    SpringBoot所有支持的场景在 Developing with Spring Boot ,让然也可以自定义starter,官方推荐命名格式为 xxxx-spring-boot-starter

    所有场景启动器最底层的依赖都是 (我这里以当前最新稳定版为例)

    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.3.7.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    
  • 无须关注依赖之间的版本号,自动版本仲裁

    引入默认依赖都可以不写版本号,但是如果引入非仲裁的jar,要写版本号

  • 可以修改版本号

    如果想自定义版本号,可以先进入dependencies中查看当前版本,然后当前项目中重写配置版本号,重写版本号以后再次引入父依赖中的依赖时会自动使用当前项目中配置好的版本号

    <!-- 在当前maven中使用自定义属性,springboot会自动读取当前文件的配置,标签名为dependencies中的版本命名方式 -->
    <proterties>
    	<mysql.version>5.1.43</mysql.version>
    </proterties>
    

1.2 自动配置

  • 自动配好Tomcat

    • 引入Tomcat依赖
    • 配置Tomcat
  • 自动配好SpringMVC

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

    • SpringBoot帮我们配置好的所有Web开发的常见场景
  • 默认的包结构

    • 主程序所在的包以及其下面的所有子包里面的组件都会被默认扫描进来
    • 无需以前的包扫描配置
    • 如果想要改变扫描路径需要在 @SpringBootApplication(scanBasePackages = "com.zzc") 中指定扫描路径,或者使用 @ComponentScan 指定扫描路径
    @SpringBootApplication
    相当于
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan("com.xxx.xxx") 与主程序基本扫描路径相同
    
  • 各种配置拥有默认值

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

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

2、容器功能

2.1 组件添加

1、@Configuration

  • 基本使用
  • Full模式与Lite模式
    • 示例
    • 最佳实战
      • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
      • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

MyConfig.java 配置类代码


/**
 * 1.配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单例的
 * 2.配置类本身也是组件
 * 3.proxyBeanMethods:代理bean的方法 分为以下两种模式:
 * Full(proxyBeanMethods = true)
 * Lite(proxyBeanMethods = false)
 * 轻量级模式是为了解决组件依赖问题,组件依赖即在User对象中还有子对象时可能产生的问题
 */
@Configuration(proxyBeanMethods = true) // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     */
    @Bean // 给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值就是在容器中的实例
    public User user01() {
        return new User("zhangsan", 19);
    }

    @Bean(name = "user02") // 也可以不使用方法名,使用自定义名称
    public User sssss() {
        return new User("lisi", 22);
    }
}

SpringBoot主启动类代码

/*
* @SpringBootApplication开启了Spring的组件扫描和springboot的自动配置功能
相当于将以下三个注解组合在了一起
(1)@Configuration:表名该类使用基于Java的配置,将此类作为配置类
(2)@ComponentScan:启用注解扫描
(3)@EnableAutoConfiguration:开启springboot的自动配置功能
* */
@SpringBootApplication //exlucde必须有,数据源注入异常
//扫描mapper下的所有mapper类,也可以只使用@Mapper来表示mapper类
@MapperScan("com.zzc.mapper")
public class HelloworldApplication {
    public static void main(String[] args) {
        // 返回我们IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(HelloworldApplication.class, args);
        // 查看容器里面的组件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String beanName : beanDefinitionNames) {
            System.out.println(beanName);
        }
        // 从容器中获取组件
        User user01 = run.getBean("user01", User.class);
        User user02 = run.getBean("user02", User.class);
        System.out.println((user01 == user02)); // true SpringBoot中组件默认以单例模式存在

        // 如果@Configuration(proxyBeanMethods = true)则获取到的bean就是代理对象调用方法,SpringBoot总会检查这个组件是否在容器中存在
        // 也就是说要保证组件单实例,如果没有则调用方法去创建
        // 如果为false则不是单实例
        MyConfig bean = run.getBean(MyConfig.class);
        User user03 = bean.user01();
        User user04 = bean.user01();
        System.out.println(user03 == user04);
    }
}

2、@Bean、@Component、@Controller、@Service、@Repository

​ 这些在SpringMVC中的注解都可以使用,只要它们都在与主启动文件同级的目录下(基础扫描路径)

3、@ComponentScan、@Import

​ @Import注解参数中接收一个数组,可以自动为容器导入多个组件(调用无参构造函数创建对象),要使用反射.class方式作为参数类型,默认导入的组件名称为全类名,例如com.zzc.server.pojo.User

4、@Conditional

​ 条件装配:满足Conditional指定的条件,则进行组件注入,在IDEA中使用 双击Shift键,搜索@Conditional后使用快捷键 Ctrl+h 打开继承树,可以发现有很多基于@Conditional注解的派生注解。

image-20210823110827980

​ 比如说使用@ConditionalOnBean(name = "xxx"),如果使用在方法上,则代表如果容器中有xxx名称的组件,该注解所在的方法上才会自动注入方法名(默认)的组件,如果@ConditionalOnBean用在类上,则代表只有容器中有xxx的组件时,该类中所有的@Bean标注的方法才会注入组件,否则都不生效。

2.2 原生配置文件引入

1、@ImportResource

​ 可以指定原生Spring中.xml的格式去注入对象,比如 @ImportResource("classpath:beans.xml") ,classpath类路径相当于/resources/

2.3 属性值绑定

1、@ConfigurationProperties

2、@EnableConfigurationProperties + @ConfigurationProperties

​ 格式为:@EnableConfigurationProperties(User.class)

​ 该注解:1.开启User配置绑定功能 2.将User这个组件自动注册到容器中

3、@Component + @ConfigurationProperties

​ 在java中

@Component
@ConfigurationProperties(prefix = "mycar")
public class xxx{
    private String brand;
    private String price;
}

​ 在配置文件中

mycar.brand=BYD
mycar.price=100000

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 {......}

1、@SpringBootConfiguration

  • @Configuration代表当前是一个配置类

2、@ComponentScan

  • 扫描哪些包,Spring注解

3、@EnableAutoConfiguration (核心)

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

​ 3.1、@AutoConfigurationPackage 自动配置包

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

// 利用Registrar给容器中导入一系列组件
// 将指定的一个包下的所有组件导入进来?核心启动类所在的包下,因为合成注解中相当于直接挂在了主启动类中

​ 3.2、@Import(AutoConfigurationImportSelector.class)

// 1.利用 getAutoConfigurationEntry(annotationMetadata); 给容器中批量导入一些组件
// 2.利用 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取所有需要导入的容器中的配置类(组件)
// 3.利用工厂加载 (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList()); 得到所有的组件
// 4.从META-INF/spring.factories位置来加载一个文件
// 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.4.1.jar 包里面也有META-INF/spring.factories

image-20210823141828643

spring-boot-autoconfigure-2.4.1./META-INF/spring.factories

相当于SpringBoot在配置文件中写死了,一启动就要给容器中加载的所有配置类
# 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.Neo4jReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
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.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.neo4j.Neo4jAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
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个场景的所有自动配置启动的时候默认全部加载,但是最终会按需配置<127(如果算上别的bean,可能大于127)
// 在每一个jar包中的装配中可以看到大量的@Conditional...类似的注解,因为使用了按需装配,所以在没有引入相应的包之前,按需装配导入多余的组件

3.3 定制化修改自动配置

​ 在这个SpringMVC的文件上传解析器自动配置类中

 @Bean(name = {"multipartResolver"})
 @ConditionalOnMissingBean({MultipartResolver.class}) // 容器中没有这个类型组件
 public StandardServletMultipartResolver multipartResolver() { // 容器中没有这个名字
    StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
    return multipartResolver;
 }
// 这样返回自己的操作时非常巧妙的,当用于自定义了视图解析器以后,名字不是标准的multipartResolver时,SpringBoot会从容器

​ SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了,则以用户的配置优先

@Bean
@ConditionalOnMissingBean // 用户优先大量依赖于这个注解,如果没有则配置,有则不配置(用户优先)
public CharacterEncodingFilter characterEncodingFilter(){}

​ 总结:

  • SpringBoot先加载所有的自动配置类 xxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能都有了
  • 定制化配置
    • 用户自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件是什么值就去修改

xxxxAutoConfiguration--->组件--->xxxProperties里面取值---->application.properties

3.4 最佳实践

  • 引入场景依赖
  • 查看自动配置了哪些
  • 是否需要修改
    • 自己分析,引入场景对应的自动配置一般都生效了
    • 配置文件中 debug=true 开启调试模式后会在控制台中打印出各种信息,Negative(不生效)、Positive(生效)
  • 是否需要修改
    • 参照文档修改配置项
    • 自定义加入或者替换组件
      • @Bean、@Component......
    • 自定义器 xxxCustomizer
    • ......

4、开发小技巧

​ 开发技巧,请自行查找文档

4.1 Lombok

4.2 dev-tools (热重启)

​ 导入依赖以后直接 ctrl + F9 ,即重新构建项目就会热重启,不改变不重启,如果真正意义上的热更新(动态替换)需要使用JRebel,一个付费的热更新项目。

4.3 Spring Initailizr(项目初始化)

​ 由于项目的创建需要从Spring官网来下载,速度可能比较慢。也可以还源使用阿里云的初始化。

SpringBoot2核心技术

1、配置文件

1.1、properties

​ 同以前的properties用法

1.2、yaml

​ 非常适合用来做以数据为中心的配置文件

1.2.2、基本语法

  • key: value; kv之间有一个空格!
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#' 表示注释
  • 表示字符串可以使用双引号或者不加引号,如果使用单引号则会对字符串进行转义

1.2.3、数据类型

  • 字面量:单个的、不可再分的值。date、boolean、string、number、null

    key: value
    
  • 对象:键值对的集合。map、hash、set、object

    # 行内写法
    key: {k1:v1,k2:v2,k3:v3}
    # 常规写法
    key:
      k1: v1
      k2: v2
      k3: v3
    
  • 数组:一组按次序排列的值。array、list、queue

    # 行内写法
    key: [v1,v2,v3]
    # 常规写法
    k:
      - v1
      - v2
      - v3
    

1.2.4 代码实例

​ 创建Person.java

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String[] interests;
    private List<String> animal;
    private Map<String, Object> scores;
    private Set<Double> salarys;
    private Map<String, List<Pet>> allPets;

}

​ application.yaml

person:
  userName: zhangsan
  boss: true
  birth: 2019/12/9
  age: 18
  interests:
    - 足球
    - 篮球
    - 乒乓球
  animal: [ 阿猫,阿狗 ]
  scores:
    english:
      first: 20
      second: 40
      third: 87
    math: [ 123,111,98 ]
  salarys:
    - 9999.98
    - 19231.22
  allPets:
    sick:
      - { name: tom,weight: 29.3 }
      - name: mydog
        weight: 12.37
    health: [ { name: mario,weight: 47 } ]
  pet:
    name: 这是一只狗
    weight: 22.13

​ HelloController.java

@RestController
public class HelloController{
    @Autowired
    private Person person;
    
    @GetMapping("/")
    public Person person(){
        return person;
    }
}

​ 访问 "/" 后提示json信息

image-20210823170028707

2、Web开发

......原版详细的笔记请参考尚硅谷大神的笔记

01、Spring与SpringBoot · 语雀 (yuque.com)

posted @ 2021-08-23 17:11  小甄的全栈梦  阅读(201)  评论(0编辑  收藏  举报