springboot基础篇—SpringBoot 配置

SpringBoot 基础配置 阅读详情

1 配置文件

●SpringBoot 使用一个全局配置文件:

○application.yml

○application.properties

●配置文件放在 src/main/resources 目录或者 类路径/config 下。

●.yml 是 YAML 语言的文件,以数据为中心,比 JSON 、XML 等更适合做配置文件。

●全局配置文件可以对一些默认配置值进行修改。

●YAML 配置示例:

server:
  port: 8081

●XML 配置示例:

<server>
    <port>8081</port>
</server>

●properties 配置示例:

server.port=8081

2 YAML 语法

2.1 YAML 基本语法

●使用缩进表示层级关系。

●缩进时不允许使用 tab 键,只允许使用空格。

●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

●大小写敏感。

●示例:

server:
  port: 8081
  context-path: helloworld

2.2 YAML支持的三种数据结构

●对象、Map :

○键值对的集合。

# 在下有一行写对象的属性和值的关系,注意缩进
k: v

○例如:

friends:
    lastName: zhangsan
    age: 20
# 行内写法
friends: {lastName: zhangsan,age: 10}

●数组、List 、Set :

○一组按次序排列的值。

# 用-值表示数组中的一个元素
k:
 - v1
 - v2
 - v3

○例如:

pets:
  - dog
  - cat
# 行内写法
pets: [dog,cat]

●字面量(数字、字符串、布尔):

○单个的、不可再分的值。

# 字面量值直接写
# 默认情况下,字符串不用加引号
k: v

○例如:

server:
  port: 8080

3 YAML 配置文件值注入

●配置文件:

person:
  lastName: zhangsan
  age: 25
  boss: true
  birth: 1992/11/11
#  maps: {k1: v1,k2: v2}
  maps:
    k1: v1
    k2: v2
#  lists: [list1,list2]
  lists:
    - lists1
    - lists2
  dog:
    name: 小花
    age: 5
person.last-name=zhansan
person.age=15
person.birth=1991/11/11
person.boss=true
person.lists=a,b,c
person.maps.k1=v1
person.maps.k2=v2
person.dog.name=dog
person.dog.age=5

●对应的 JavaBean:

package com.sunxiaping.springboot.domain;

import java.io.Serializable;

public class Dog implements Serializable {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.sunxiaping.springboot.domain;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 *
 * @ConfigurationProperties 告诉 SpringBoot 将本类中的所有属性和属性文件中相关属性进行绑定
 * prefix = "person":配置文件中那个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能使用容器提供的 @ConfigurationProperties 功能。
 */
@ConfigurationProperties(prefix = "person")
@Component
public class Person implements Serializable {

    private String lastName;

    private Integer age;

    private Boolean boss;

    private Date birth;

    private Map<String, Object> maps;

    private List<Object> lists;

    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

●可以导入配置文件注册器,以后编写配置就有提示了:

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

3.1@ConfigurationProperties 获取值和 @Value 获取值的比较

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个一个指定配置文件中的属性

松散绑定(松散语法)

支持

不支持

SPEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

注意:

●如果我们只是在某个业务逻辑中需要获取一个配置文件中的某项值,我们就使用 @Value 注解。

●如果我们专门编写了一个 JavaBean 来和配置文件进行映射,我们就使用 @ConfigurationProperties 注解。

3.2 @PropertySource 和 @ImportSource

●@ConfigurationProperties 注解默认是从全局配置文件(application.yml 或 application.properties)中读取配置。

●@PropertySource 注解可以加载指定的配置文件,并且 @PropertySource 注解只能加载 properties 文件。

●@ImportSource 注解可以导入 Spring 的配置文件,让配置文件里面的内容生效,但是现在都是纯注解开发,无需使用此注解。

●示例:@PropertySource 注解

●person.properties

person.last-name=zhansan
person.age=15
person.birth=1991/11/11
person.boss=true
person.lists=a,b,c
person.maps.k1=v1
person.maps.k2=v2
person.dog.name=dog
person.dog.age=5

●Dog.java

package com.sunxiaping.springboot.domain;

import java.io.Serializable;

public class Dog implements Serializable {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

●Person.java

package com.sunxiaping.springboot.domain;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 *
 * @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和属性文件中相关属性进行绑定
 * prefix = "person":配置文件中那个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。
 */
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
@Component
public class Person implements Serializable {

    private String lastName;

    private Integer age;

    private Boolean boss;

    private Date birth;

    private Map<String, Object> maps;

    private List<Object> lists;

    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

●测试:

package com.sunxiaping.springboot;

import com.sunxiaping.springboot.domain.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {

    @Autowired
    private Person person;

    @Test
    public void test() {
        System.out.println("person = " + person);
    }

}

●示例:@ImportSource 注解

●Dog.java

package com.sunxiaping.springboot.domain;

import java.io.Serializable;

public class Dog implements Serializable {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

●beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dog" class="com.sunxiaping.springboot.domain.Dog"></bean>

</beans>

●SpringBoot的启动类:

package com.sunxiaping.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ImportResource;

/**
 * 主程序,用来启动SpringBoot应用
 */
@SpringBootApplication
// @ImportResource 将Spring的配置文件导入进来
@ImportResource(value = {"classpath:beans.xml"})
public class HelloWorldApplication {

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

}

●测试:

package com.sunxiaping.springboot;

import com.sunxiaping.springboot.domain.Dog;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {
    
    @Autowired
    private Dog dog;

    @Test
    public void test() {
        System.out.println("dog = " + dog);
    }
}

4 配置文件占位符

4.1 随机数

${random.value}
${random.int}
${random.long}
${random.uuid}
...

4.2 配置文件占位符

app.name=SpringBoot
app.description=${app.name:Spring牛逼}是个牛逼的框架

●可以在配置文件中引用前面配置过的属性,如果找不到就使用默认值。

#person.last-name=zhangsan${random.uuid}
person.age=15
person.birth=1991/11/11
person.boss=true
person.lists=a,b,c
person.maps.k1=v1
person.maps.k2=v2
person.dog.name=${person.last-name:小花}
person.dog.age=5

5 profile 多环境配置

●profile 是Spring 对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方法快速切换环境。

●①多 profile 文件形式:

○格式:application-{profile}.properties。

○例如:application-dev.properites、application-test.properties。

●②多 profile 文档块:

spring:
  profiles:
    active: prod #指定激活的配置

---
# 开发环境的profile
spring:
  profiles: dev

server:
  port: 8081

---
# 部署的profile
spring:
  profiles: prod

server:
  port: 8082

●③激活方式:

○命令行:--spring.profiles.active=dev

○配置文件:spring.profiles.active=dev

○JVM参数:-Dspring.profiles.active=dev

○Junit单元测试:@ActiveProfiles(value = "dev")

6 配置文件加载位置

●SpringBoot 启动会扫描以下位置的 application.yml 或 application.properties 文件作为 SpringBoot 的默认配置文件。

○file:/config/

○file:/

○classpath:/config/

○classpath:

●以上是按照 优先级从高到低 的顺序,所有的配置文件都会被加载, 高优先级的配置内容会覆盖低优先级配置的内容 ,形成 互补配置 。

●在项目打包好以后,我们可以使用命令行:--spring.config.location=新配置文件的位置 ,这样启动项目的时候 Spring 将会加载从指定的位置加载配置文件,执行的配置文件和默认加载的这些配置文件共同起作用形成互补配置。

7 外部配置加载顺序

●SpringBoot 支持多种外部配置方式:

○① 命令行参数。

○② 来自 java:comp/env 的 JNDI 属性。

○③ Java系统属性(System.getProperties())。

○④ 操作系统环境变量。

○⑤ RandomValuePropertySource 配置的 random.* 属性值。

○⑥ jar 包外部的 application-{profile}.properties 或 application-{profile}.yml 配置文件。

○⑦ jar 包内部的 application-{profile}.properties 或 application-{profile}.yml 配置文件。

○⑧ jar 包外部的 application.properties 或 application.yml 配置文件。

○⑨ jar 包内部的 application.properties 或 application.yml 配置文件。

○⑩ @Configuration注解类上的 @PropertySource 。

○⑪ 通过 SpringApplication.setDefaultProperties 指定的默认属性。

8 自动配置原理

8.1 配置文件能配置的属性参照

●配置文件能配置的属性参照

8.2 自动配置原理

●① SpringBoot 启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 。

●② @EnableAutoConfiguration 的作用:

○利用 EnableAutoConfigurationImportSelector 给容器中导入一些组件,可以查看 selectImports 方法的内容。

public class AutoConfigurationImportSelector
        implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
        BeanFactoryAware, EnvironmentAware, Ordered {

    private static final String[] NO_IMPORTS = {};

    private static final Log logger = LogFactory
            .getLog(AutoConfigurationImportSelector.class);

    private ConfigurableListableBeanFactory beanFactory;

    private Environment environment;

    private ClassLoader beanClassLoader;

    private ResourceLoader resourceLoader;

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        try {
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                    .loadMetadata(this.beanClassLoader);
             //获取候选的配置
            AnnotationAttributes attributes = getAttributes(annotationMetadata);
            List<String> configurations = getCandidateConfigurations(annotationMetadata,
                    attributes);
            configurations = removeDuplicates(configurations);
            configurations = sort(configurations, autoConfigurationMetadata);
            Set<String> exclusions = getExclusions(annotationMetadata, attributes);
            checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = filter(configurations, autoConfigurationMetadata);
            fireAutoConfigurationImportEvents(configurations, exclusions);
            return configurations.toArray(new String[configurations.size()]);
        }
        catch (IOException ex) {
            throw new IllegalStateException(ex);
        }
    }
    //获取候选的配置
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
            AnnotationAttributes attributes) {
         //扫描所有jar包类路径下的META-INF/spring.factories,把扫描到的这些文件的内容包装成Properties对象,
         //从Properties中获取到EnableAutoConfiguration.class类名对应的值,然后把它们添加到容器中
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        Assert.notEmpty(configurations,
                "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }    
     //略
}

○将类路径下 META-INF/spring.factories 里面配置的所有 EnableAutoConfiguration 的值加入到容器中。

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.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
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.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
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.redis.RedisAutoConfiguration,\
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.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
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.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.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
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.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
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.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

○每一个这样的 xxxAutoConfiguration 类都是容器中的一个组件,都加入到容器中。然后用它们做自动配置。

●③ 每一个自动配置类进行自动配置功能。

●④ 以 HttpEncodingAutoConfiguration( Http 编码自动配置)为例解释自动配置原理:

○其部分源码如下:

@Configuration //这是一个配置类,类似于xml时代的application.xml,可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class) //启用指定类的ConfigurationProperties功能,将配置文件中对应的值和HttpEncodingProperties绑定起来,并把HttpEncodingProperties加入到IOC容器中
@ConditionalOnWebApplication //Spring底层@Conditional注解,根据不同条件,如果满足指定的条件,整个配置类里面的配置就会生效。 @ConditionalOnWebApplication判断当前应用是否是web应用,如果是,当前配置类生效。
@ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目中有没有CharacterEncodingFilter这个类,CharacterEncodingFilter是SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) //判断配置文件中是否存在某个配置spring.http.encoding.enabled,如果不存在,判断也是成立的。
//即使我们配置文件中不配置spring.http.encoding.enabled=true,也是默认生效的
public class HttpEncodingAutoConfiguration {
    
    //properties已经和SpringBoot的配置文件映射了
    private final HttpEncodingProperties properties;
    
    //只有一个有参构造器的情况下,参数的值就会从容器中拿
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }
    
    @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class)
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }
    //略
}

○根据当前不同的条件判断,决定这个配置类是否生效。一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的 properties 类中获取的,而这些 properties 类里面的每一个属性又是和配置文件绑定的。

●⑤ 所有在配置文件中能配置的属性都是在 xxxProperties 类中封装的着。配置文件能配置什么就可以参照某个功能对应的这个属性类。

○HttpEncodingProperties 的部分源码如下:

  @ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和Bean的属性进行绑定
  public class HttpEncodingProperties {
  
      public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
  
      /**
       * Charset of HTTP requests and responses. Added to the "Content-Type" header if not
       * set explicitly.
       */
      private Charset charset = DEFAULT_CHARSET;
  
      /**
       * Force the encoding to the configured charset on HTTP requests and responses.
       */
      private Boolean force;
  
      /**
       * Force the encoding to the configured charset on HTTP requests. Defaults to true
       * when "force" has not been specified.
       */
      private Boolean forceRequest;
      //略   
  }

总结:

●① SpringBoot 启动会加载大量的自动配置类。

●② 我们需要查看需要的功能有没有 SpringBoot 默认写好的配置类。

●③ 我们需要查看自动配置类中到底配置了那些组件(只要我们要用的组件有,我们就不需要再来配置了)。

●④ 给容器自动配置类添加组件的时候,会从 properties 类中获取某些属性,我们就可以在配置文件中指定这些属性的值。

8.3 @Conditional 注解及其衍生注解

●@Conditional 注解的作用:必须是 @Conditional 指定的条件成立,才给容器中添加组件,配置项里面的所有内容才生效。

@Conditional扩展注解

作用(判断是否满足当前指定条件)

@ConditionalOnJava

系统的java版本是否符合要求

@ConditionalOnBean

容器中存在指定Bean;

@ConditionalOnMissingBean

容器中不存在指定Bean;

@ConditionalOnExpression

满足SpEL表达式指定

@ConditionalOnClass

系统中有指定的类

@ConditionalOnMissingClass

系统中没有指定的类

@ConditionalOnSingleCandidate

容器中只有一个指定的Bean,或者这个Bean是首选Bean

@ConditionalOnProperty

系统中指定的属性是否有指定的值

@ConditionalOnResource

类路径下是否存在指定资源文件

@ConditionalOnWebApplication

当前是web环境

@ConditionalOnNotWebApplication

当前不是web环境

@ConditionalOnJndi

JNDI存在指定项

●自动配置类必须在一定的条件下才能生效,那么我们怎么知道哪些自动配置类生效?

●我们可以启用 debug=true 属性来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效。

#开启 SpringBoot 的 debug 模式
debug: true

若有收获,就点个赞吧

Springboot多模块配置详细教程+源码案例+所遇到的坑 这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》 阅读详情

相关推荐

Springboot改造之配置--Dubbo配置篇

接上一篇,api模块很简单,就是对外提供接口,所以就不做介绍了,下面讲一下Sprintboot 中对dubbo的配置。 dubbo的配置在 core 模块,首先来看一下在项目中的位置: 左侧选中的三行就是dubbo主要的配置,resources下是 dubbo-provider.xml 和 dubbo-consumer.xml , 用于提供服务、引用服务,文件的内容如下: dubbo-...

u010473656的专栏 4774

SpringBoot_基础配置

SpringBoot_基础配置一、@Spring BootApplication二、定制banner三、Web容器配置四、Properties配置 一、@Spring BootApplication @SpringBootApplications注解是添加在项目启动类上的,@SpringBootApplication实际上是一个组合注解,定义如下: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inh

qq_43070052的博客 4498

springboot的各种配置

1.AOP配置 <!-- AOP的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> package com.qf.HomeWork.aop; impor

qq_53374893的博客 3045

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

Kaptcha 是Google的⼀个⾼度可配置的实⽤验证码⽣成⼯具. 代码:⽹上有很多⼈甚⾄公司基于Google的kaptcha进⾏了⼆次开发. 我们选择⼀个直接适配SpringBoot的开源项⽬由于作者的⽂档写的不是很全, 下⾯简单介绍下插件的使⽤原理验证码可以客⼾端⽣成, 也可以服务器⽣成. 对于普通的字符验证码, 后端通常分两部分.⼀是⽣成验证码内容, 根据验证码内容和⼲扰项等, ⽣成图⽚, 返回给客⼾端。

蓝天it(让亿万孩子在蓝天下共享优质教育) 1637

SpringBoot配置篇

配置文件 SpringBoot使用两种全局配置文件 application.properties application.yml 配置文件放在src/main/resources目录或者类路径/config下 .yml是YAML语言文件,以数据为中心,比JSON、XML更适合做配置文件 全局配置文件可以对一些默认配置进行修改 properties server.port=8080 yml s...

程序员劝退师的博客 404

sqoop抽取mysql的数据到hive表里面,字段内容被自动截取,导致字段不全的问题解决

今天央视重新转播NBA,写篇博客纪念一下这个重要的日子,湖人的表现就呵呵了!!!! 强行转到博客的主题来 mysql的字段属性:该字段能存下的值比如:“山东” `province` varchar(3) NOT NULL COMMENT '省份' 用sqoop sqoop import --connect "jdbc:mysql://xxxxxx:3306/xxxxxx?tinyInt1isBit=false&zeroDateTimeBehavior=convertToNull..

放肆桀骜 963

Spring Boot 复习 - 入门与基础配置篇

这一系列将从最基础,对 Spring Boot 进行复习。这一篇将复习 Spring Boot 入门级别的基础知识。(参考《Spring Boot+Vue 全栈开发实战》) 1. Hello, Spring Boot! 添加依赖 虽然平常使用官网、开发工具或 Maven 模版直接生成依赖文件即可,但还是可以从头复习一下这个过程。可以添加 spring-boot-starter-parent 作为 parent,这样方便了所有需要引用的 spring-boot 依赖,有利于依赖管理。 <parent.

weixin_44246503的博客 210

vfsglobal预约系统登录问题全解析(by quqi99)

本文全面解析VFS Global预约系统登录常见问题,包括IP限制、验证码验证失败及账号自动删除等。提供详细的解决方案,如DNS配置、浏览器设置及邮箱选择建议,帮助用户顺利完成签证预约。特别针对中国用户遇到的IP限制问题,给出了实用技巧。

gamma的博客 1340

Springboot基础篇-基础配置

springboot配置

weixin_52972575的博客 959

【电力系统】高压直流输电VSC-HVDC,四个变流站联合输电 / 交直流混合并网系统

本文研究了一种基于电压源型换流器(VSC)的高压直流输电(HVDC)系统,该系统通过四个变流站实现联合输电并接入交直流混合电网。文章介绍了系统的结构、工作原理以及控制策略,分析了交直流混合并网的特性,并通过仿真验证了系统的性能。结果表明,该系统具有良好的稳定性和灵活性,能够有效实现多点供电和功率协调。

2401_84610415的博客 2239

别再盲调PID了!手把手教你用VOFA+实时可视化电机速度曲线(附STM32F4源码)

本文详细介绍了如何使用VOFA+工具实现PID参数的可视化调试,帮助开发者从盲调转向精准调优。通过实时可视化电机速度曲线,结合STM32F4源码示例,展示了如何高效调试Kp、Ki、Kd参数,解决响应慢、超调等常见问题,大幅提升电机控制系统的性能。

weixin_28366475的博客 128

SpringBoot SpringBoot 基础篇 2 SpringBoot 基础配置 2.2 属性配置

SpringBoot SpringBoot 基础篇 2 SpringBoot 基础配置 2.2 属性配置

代码改变世界 643

从零到一:用MSC Nastran Patran搞定悬臂翼颤振分析(附完整模型文件)

本文详细介绍了使用MSC Nastran和Patran进行悬臂翼颤振分析的完整流程,从几何建模、网格划分到模态分析和颤振求解。通过具体案例讲解关键参数设置和操作技巧,帮助工程师掌握气动弹性分析的核心方法,并附赠完整模型文件供实践参考。

weixin_42563415的博客 439

springboot篇】二. springboot配置详解

基于【springboot篇】一. idea搭建springboot项目 SpringBoot配置 1 创建Bean 1.1 定义Bean package com.wpj.bean; import lombok.*; /** * ClassName: User * Description: * * @author JieKaMi * @version 1.0 * @date: 20...

TheNew_One的博客 471

SAP-MM:SAP MM(物料管理)模块 的系统化学习计划

SAP MM模块的系统化学习计划

baidu_35680696的博客 1547

0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models

去噪扩散概率模型。本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。1、扩散过程:如上图所示,扩散过程为从右到左X0→XTX0​→XT​的过程,表示对图片逐渐加噪,且Xt1X_{t+1}Xt1​是在XtX_{t}Xt​加躁得到的,其只受XtX_{t}Xt​的影响,因此扩散过程是一个马尔科夫过程。X0X_0。

zik的博客 2397

【SpringBoot新手篇】SpringBoot配置文件详情

SpringBoot配置文件详情1. Spring Boot的默认配置1.1 配置文件1.2 YAML语法1.2.1 基本语法1.2.2 值的写法2. 配置文件值注入3. @Value获取值和@ConfigurationProperties获取值比较4. 配置文件注入值数据校验5. @PropertySource&@ImportResource&@Bean5.1 获取Spring容器6. 配置文件占位符6.1 随机数6.2 占位符获取之前配置的值,如果没有可以是用:指定默认值7. Profi

输入技术、输出想法 4649

PCL 三维重建 泊松曲面重建算法

本文介绍了基于泊松曲面重建算法的三维重建过程。泊松重建是一种利用点云数据生成三维表面的算法,它基于点云的法线估计和泊松方程的求解,能够生成光滑且连续的曲面模型。该方法适用于复杂形状和细节的表面重建。

纵马踏花向自由 1089

【基础篇】三、SpringBoot基础配置

查看启动日志,发现tomcat的context path变了,这个数据怎么进去的?就是用封装对象的方式+@ConfigurationProperties注解去拿的。当然这个时候你访问地址也就得变了:/访问不通了。

llg___的博客 456

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【SpringBoot新手篇】SpringBoot 自动配置原理

SpringBoot 自动配置原理常用配置自动配置原理 配置文件到底能写什么?怎么写? 常用配置 这里指的配置主要是application.yml或者application.properties修改默认属性的文件 server.port=9090 # 服务端口号 server.tomcat.uri-encoding=UTF-8 #以Tomcat为web容器时的字符编码 spring.data.mongodb.uri=mongodb://localhost:27017/mydb #mongodb连接 s

输入技术、输出想法 1041

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot基础篇-SpringBoot配置文件

SpringBoot配置文件 1、配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的; •application.properties •application.yml 配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; YAML(YAML Ain’t Markup Language): ​YAML A Markup L...

ljlj8888的博客 202

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

服务端之Java的SpringBoot运维实用篇、多环境开发、高级配置、打包、运行、日志

服务端之Java的SpringBoot运维实用篇、多环境开发、高级配置、打包、运行、日志

优快云博客主页地址:https://mengjian.blog.youkuaiyun.com/ 902

SpringBoot基础篇三(基础配置)

SpringBoot基础篇三(基础配置) 使用什么技术就配置什么,如果不清楚可配置什么的可以访问官方文档Application Properties:Common Application Properties (spring.io) 模块复制 复制一个创建过的模块,修改一个名称备用【以后就复制这个】 输出多余的文件配置 只需要留下src和pom.xml两个 修改pom.xml配置中的<artifactId>springboot_0x_xxxxxxxxxxxxxxxx</

我要记录学习博客 650

SpringBoot SpringBoot 基础篇 2 SpringBoot 基础配置 2.3 配置文件类型

SpringBoot SpringBoot 基础篇 2 SpringBoot 基础配置 2.3 配置文件类型

代码改变世界 470

SpringBoot基础篇配置信息之如何读取配置信息

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 SpringBoot极大的减少了配置,开一个新项目时,完全可以做到什么配置都不加,就可以直接跑,简单方便的同时,就带来了一个问题 怎么知道这些默认的配置是什么? 如果要修改默认配置怎么办? 如何添加自定义的配置? 如何读取这些配置? I. 配置信息读取 首先创建一个SpringBoot项目,这一块就直接省略掉,下面直奔主题,...

小灰灰blog的专栏 8422

SpringBoot基础篇配置信息之配置刷新

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 配置的刷新,从第一篇就提出了这个问题,但是一直都没有说到,那么配置加载完毕之后能否在主动刷新呢? 如果对SpringCloud有了解的话,会直到有个配置中心的微服务,专门就是来做配置远程拉取,当然也支持刷新了,这是否意味着可以支持刷新呢,如果支持该怎么做? I. 配置动态刷新 本篇将介绍并演示如何实现配置信息的刷新,但不会涉及...

小灰灰blog的专栏 9209
上一篇: Synchronized总结&锁优化
下一篇: 必须掌握的iOS技术|网络|推送与数据处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值