关于java:SpringBoot学习配置文件

47次阅读

共计 18264 个字符,预计需要花费 46 分钟才能阅读完成。

一、配置文件

在应用 Spring Initializer 疾速创立 SpringBoot 我的项目时,会在 resources 目录下给咱们一个默认的 空的 全局配置文件 application.properties。配置文件的作用也正是用来批改 SpringBoot 主动配置的默认值。

配置文件名是固定的

application.properties

但咱们能够批改为

application.yml

这两个文件实质是一样的,区别只是其中的语法稍微不同。

application.yml 配置文件应用 YMAL 语言,YMAL 不是如 XML 般的标记语言,以数据为核心,更适宜作为配置文件。

YAML:

server:
  port: 8081

XML:

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

二、YAML 语法

2.1 根本语法

  • 应用缩进示意层级关系
  • 缩进时不容许应用 Tab 键,只容许应用空格。
  • 缩进的空格数目不重要,只有雷同层级的元素左侧对齐即可
  • 大小写敏感

k:(空格)v——示意一对键值对(空格必须有)。以 空格 的缩进来管制层级关系,只有是左对齐的一列数据,都是同一个层级的。

server:
    port: 8081
    path: /hello

2.2 值的写法

(1)字面量

字面量:一般的值(数字,字符串,布尔,日期)

k: v——字面间接书写

  • 字符串默认不必加上单引号或者双引号
name: zhangsan

"":双引号,不会本义字符串外面的特殊字符,特殊字符会作为自身想示意的意思

name: "zhangsan \n lisi"

输入:

zhangsan
lisi

'':单引号,会本义特殊字符,特殊字符最终只是一个一般的字符串数据

name: 'zhangsan \n lisi'

输入:

zhangsan \n lisi

(2)对象、Map(属性和值)(键值对)

k: v——在下一行来写对象的属性和值的关系(留神缩进)

friends:
    lastName: zhangsan
    age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

(3)数组(List、Set)

- 值 示意数组中的一个元素

pets:
 - cat
 - dog
 - pig

行内写法

pets: [cat,dog,pig]

三、配置文件值注入

3.1 配置文件书写

(1)yaml 配置文件

配置文件 application.yml

person:
  lastName: zhangsan
  age: 20
  boss: false
  birth: 2020/10/10
  maps: {k1: v1,k2: 15}
  lists:
    - lisi
    - wangwu
  dog:
    name: 狗狗
    age: 5

(2)properties 配置文件

或者 application.properties

person.last-name= 张三
person.age=20
person.birth=2020/10/10
person.boss=true
person.maps.k1=v1
person.maps.k2=15
person.lists=lisi,wangwu
person.dog.name= 狗狗
person.dog.age=5

解决 properties 配置文件默认 utf- 8 可能乱码问题:

3.2 属性注入

(1)@ConfigurationProperties

JavaBean:

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中。* @ConfigurationProperties:通知 SpringBoot 将本类中的所有属性和配置文件中相干的配置进行绑定。*      prefix = "person":与配置文件中 person 上面的所有属性一一映射
 *
 * 只有这个组件是容器中的组件,能力容器提供的 @ConfigurationProperties 性能。*
 */
@Component
@ConfigurationProperties(prefix = "person")
@Validated
@Data
public class Person {
    @NotNull //JSR303 数据校验
    private String LastName;
    private String age;
    private boolean boss;
    private Date birthday;

    private Map<String,Object> maps;// 简单类型封装
    private List<Object> lists;
    private Dog dog;
}

导入配置文件处理器,配置文件进行绑定就会有提醒:

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

编写测试方法:

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootConfigApplicationTests {
    @Autowired
    Person person;

    @Test
    void test01() {System.out.println(person);
    }
}

输入后果:

Person(LastName=zhangsan, age=20, boss=false, birthday=Sat Oct 10 00:00:00 CST 2020, maps={k1=v1, k2=15}, lists=[lisi, wangwu], dog=Dog(name= 狗狗, age=5))

(2)@Value

@Component
@Data
public class Person {

       /**
    * <bean class="Person">
    *      <property name="lastName" value="字面量 /${key}从环境变量、配置文件中获取值 /#{SpEL}"></property>
    * <bean/>
    */
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")//SpEL
    private Integer age;
    @Value("true")
    private Boolean boss;
    @Value("2020/10/10")
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

输入后果:

Person(LastName= 张三, age=22, boss=true, birthday=Fri Oct 10 00:00:00 CST 1997, maps=null, lists=null, dog=null)

@Value 获取值和 @ConfigurationProperties 获取值比拟:

比拟 @ConfigurationProperties @Value
性能 批量注入配置文件中的属性 一个个指定
涣散绑定(涣散语法) 反对 不反对
SpEL 不反对 反对
JSR303 数据校验 反对 不反对
简单类型封装 反对 不反对

不管配置文件 yml 还是 properties 他们都能获取到值。

在某个业务逻辑中须要获取配置文件中的某项值——应用 @Value;专门编写了一个 JavaBean 来和配置文件进行映射——应用 @ConfigurationProperties。

3.3 @PropertySource&@ImportResource

@PropertySource:加载指定的配置文件。

例如将 person 相干配置都写进 person.properties

/**
 *
 * 只有这个组件是容器中的组件,能力容器提供的 @ConfigurationProperties 性能。*  @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值。*
 */
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;

@ImportResource:导入 Spring 的配置文件,让配置文件外面的内容失效。

Spring Boot 外面没有 Spring 的配置文件,咱们本人编写的配置文件,不能自动识别,须要通过 @ImportResource注解加载进来。

@ImportResource(locations = {"classpath:beans.xml"})

编写 Spring 的配置文件 bean.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="helloService" class="com.kai.springboot.service.HelloService"></bean>
</beans>

这样编写 bean 配置文件再导入 Spring 的配置文件让其失效的形式很麻烦,在 SpringBoot 中不举荐应用。

SpringBoot 举荐给容器中增加组件的形式,应用 全注解 的形式:

(1)配置类@Configuration——>Spring 配置文件

(2)应用 @Bean 给容器中增加组件

/**
 * @Configuration:指明以后类是一个配置类,就是来代替之前的 Spring 配置文件。*
 * 在配置文件中用 <bean><bean/> 标签增加组件
 *
 */
@Configuration
public class MyAppConfig {

    // 将办法的返回值增加到容器,容器中这个组件默认的 id 就是办法名。@Bean
    public HelloService helloService02(){System.out.println("配置类 @Bean 给容器中增加组件了...");
        return new HelloService();}
}

四、配置文件占位符

4.1 随机数

配置文件中能够应用随机数 :

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

4.2 属性配置占位符

能够在配置文件中援用后面配置过的属性(优先级后面配置过的这里都能用),如果没有能够是用 ${app.name: 默认值}来指定找不到属性时的默认值。

person.last-name= 张三 ${random.uuid}
person.age=${random.int}
person.birth=2020/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

五、Profile

Profile 是 Spring 对不同环境提供不同配置性能的反对,能够通过激活、指定参数等形式疾速切换环境。

5.1 profile 多文件模式

咱们在主配置文件编写的时候,文件名能够是 application-{profile}.properties/yml

  • application-dev.properties、application-prod.properties

默认应用 application.properties 的配置。

5.2 yml 多 profile 文档块模式

server:
  port: 8081
spring:
  profiles:
    active: default #示意未指定默认配置

---
server:
  port: 8083
spring:
  profiles: dev

---

server:
  port: 8084
spring:
  profiles: prod  #指定属于哪个环境

5.3 激活指定 profile

​ 1、在配置文件中指定

spring.profiles.active=dev

​ 2、命令行

java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

​ 能够间接在测试的时候,配置传入命令行参数spring.profiles.active=dev

​ 3、虚拟机参数

-Dspring.profiles.active=dev

六、配置文件加载地位

springboot 启动会扫描以下地位的 application.properties 或者 application.yml 文件作为 Spring boot 的默认配置文件。

– file:./config/

– file:./

– classpath:/config/

– classpath:/

优先级由高到底,高优先级配置内容 会笼罩 低优先级配置 的反复内容。

SpringBoot 会从这四个地位 全副加载 主配置文件——互补配置

== 咱们还能够通过 spring.config.location 来扭转默认的配置文件地位。==

我的项目打包好当前,咱们能够应用命令行参数的模式,启动我的项目的时候来指定配置文件的新地位,指定配置文件和默认加载的这些配置文件独特起作用造成互补配置。

java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=C:/application.properties

七、内部配置加载程序

SpringBoot 也能够从以下地位加载配置,优先级从高到低,高优先级的配置笼罩低优先级的配置,所有的配置会造成互补配置

1. 命令行参数

所有的配置都能够在命令行上进行指定,多个配置用 空格 离开:-- 配置项 = 值

java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087  --server.context-path=/abc

2. 来自 java:comp/env 的 JNDI 属性

3.Java 零碎属性(System.getProperties())

4. 操作系统环境变量

5.RandomValuePropertySource 配置的 random.* 属性值

(由 jar 包内向 jar 包内进行寻找,优先加载带 profile 配置文件)

6.jar 包内部的 application-{profile}.properties 或 application.yml(带 spring.profile)配置文件

7.jar 包外部的 application-{profile}.properties 或 application.yml(带 spring.profile)配置文件

(再来加载不带 profile 配置文件)

8.jar 包内部的 application.properties 或 application.yml(不带 spring.profile)配置文件

9.jar 包外部的 application.properties 或 application.yml(不带 spring.profile)配置文件

10.@Configuration 注解类上的 @PropertySource

11. 通过 SpringApplication.setDefaultProperties 指定的默认属性

八、主动配置原理

8.1 主动配置原理

(1)SpringBoot 启动的时候加载主配置类,开启了主动配置性能 @EnableAutoConfiguration

(2)@EnableAutoConfiguration 作用:

  • 利用 EnableAutoConfigurationImportSelector 给容器中导入一些组件,查看 selectImports() 办法的内容:

    List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes)获取候选的配置

    • SpringFactoriesLoader.loadFactoryNames()

扫描所有 jar 包类门路下 META-INF/spring.factories,把扫描到的这些文件的内容包装成 properties 对象,从 properties 中获取到 EnableAutoConfiguration.class 类(类名)对应的值,而后把他们增加在容器中。

查看 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.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 类都是容器中的一个组件,都退出到容器中,用他们来做主动配置。

(3)每一个主动配置类进行主动配置性能

  • HttpEncodingAutoConfiguration(Http 编码主动配置) 为例解释主动配置原理:
@Configuration // 示意这是一个配置类,以前编写的配置文件一样,也能够给容器中增加组件
@EnableConfigurationProperties(HttpEncodingProperties.class)  // 启动指定类的 ConfigurationProperties 性能;将配置文件中对应的值和 HttpEncodingProperties 绑定起来,并把 HttpEncodingProperties 退出到 IoC 容器中。@ConditionalOnWebApplication //Spring 底层 @Conditional 注解(Spring 注解版),依据不同的条件,如果满足指定的条件,整个配置类外面的配置就会失效,判断以后利用是否是 web 利用,如果是则以后配置类失效。@ConditionalOnClass(CharacterEncodingFilter.class) // 判断以后我的项目有没有这个类 CharacterEncodingFilter,SpringMVC 中进行乱码解决的过滤器。@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  // 判断配置文件中是否存在某个配置  spring.http.encoding.enabled,如果不存在,判断也是成立的。// 即便咱们配置文件中不配置 pring.http.encoding.enabled=true,也是默认失效的。public class HttpEncodingAutoConfiguration {
  
      // 它曾经和 SpringBoot 的配置文件映射
      private final HttpEncodingProperties properties;
  
   // 只有一个有参结构器的状况下,参数的值就会从容器中获取
      public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {this.properties = properties;}
  
    @Bean // 给容器中增加一个组件,这个组件的某些值须要从 properties 中获取。@ConditionalOnMissingBean(CharacterEncodingFilter.class) // 判断容器没有这个组件?public CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        // 配置文件书写内容,都是来自这些 properties
        // spring.http.encoding.enabled=true
        // spring.http.encoding.charset=utf-8
        // spring.http.encoding.force=true
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

依据以后不同的条件判断,决定这个配置类是否失效。一旦这个配置类失效,这个配置类就会给容器中增加各种组件,这些组件的属性是从对应的 properties 类中获取的,这些类外面的每一个属性又是和配置文件绑定的。

(4)所有在配置文件中能配置的属性都是在 xxxxProperties 类 中封装的,配置文件能配置什么就能够参照某个性能对应的这个属性类。

@ConfigurationProperties(prefix = "spring.http.encoding")  // 从配置文件中获取指定的值和 bean 的属性进行绑定。public class HttpEncodingProperties {public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
}

SpringBoot 精华

  • SpringBoot 启动会加载大量的主动配置类
  • 咱们看咱们须要的性能有没有 SpringBoot 默认写好的主动配置类
  • 咱们再来看这个主动配置类中到底配置了哪些组件(只有咱们要用的组件有,咱们就不须要再来配置了)
  • 给容器中主动配置类增加组件的时候,会从 properties 类中获取某些属性,咱们就能够在配置文件中指定这些属性的值

xxxxAutoConfigurartion:主动配置类,给容器中增加组件。

xxxxProperties:封装配置文件中相干属性。

8.2 @Conditional

@Conditional派生注解(Spring 注解版原生的 @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属性,来让控制台打印主动配置报告,这样咱们就能够很不便的晓得哪些主动配置类失效。

=========================
AUTO-CONFIGURATION REPORT
=========================


Positive matches:(主动配置类启用的)-----------------

   DispatcherServletAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)
        
    
Negative matches:(没有启动,没有匹配胜利的主动配置类)-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

   AopAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)
        

参考

视频

配置加载起源

配置文件能配置全副属性

正文完
 0