Spring Boot实战学习笔记3


title: Spring Boot实战学习笔记3
tags:Spring Boot实战
grammar_cjkRuby: true

摘要

本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.

Spring Boot实战学习笔记1

Spring Boot实战学习笔记2

Spring Boot实战学习笔记3

Spring Boot实战学习笔记4

1.Spring 基础

2.Spring 常用配置

3.Spring 高级话题

4.Spring mvc基础

5.Spring Boot基础

5.1 Spring boot概述

5.1.1 什么是spring boot

使用习惯优于配置的理念.不用或者只需要很少的spring配置.

5.1.2 Spring boot核心功能

  • 1.独立运行的Spring 项目
    支持用jar包的形式运行.
  • 2.内嵌Servlet容器
    内嵌Tomcat,jetty
  • 3.提供starter,简化maven配置.
  • 4.自动配置Spring
  • 5.准生产的应用监控
    http,ssh,telnet对运行时的项目进行监控
  • 6.无代码生产和XML配置

5.1.3 Spring boot优缺点

优点

  • 1)快速构建项目
  • 2)对主流开发框架的无配置集成
  • 3)项目可以独立运行,无须外部依赖servlet容器
  • 4)提供运行时的应用监控
  • 5)机极大的提高了开发,部署效率
  • 6)与云计算的天然集成.
    缺点
  • 1)书籍文档少
  • 2)不认可spring,可能不习惯

5.1.4 关于本书Spring boot版本

Spring boot 1.3.0

5.2 Spring boot快速搭建

5.2.1 http://start.spring.io

进入该页面能协助创建spring boot项目.

5.2.2 Spring Tool Suite

工具不错.

5.2.3 Intellij IDEA

工具口碑好

5.2.4 Spring boot CLI

下载链接
查看10.2章节.

5.2.5 maven 手工构建

5.2.6 简单演示

@SpringBootApplication :开启自动配置.
通过maven命令: mvn spring-boot:run

6.Spring Boot核心

6.1 基本配置

6.1.1 入口类和@SpringBootApplicaion

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
}
  • @EnableAutoConfiguration
    @EnableAutoConfiguration让Spring boot根据***类路径中的jar包依赖为当前项目进行自动配置***.
    Spring Boot启动类要放在groupId+arctifactID目录下.

@EnableAutoConfiguration详解

  • @SpringBootConfiguration
    在Spring Boot项目中推荐使用@SpringBootConfiguration替代@Configuration
    @EnableAutoConfiguration:启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项

  • @ComponentScan
    @ComponentScan:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。

6.1.2 关闭特定的自动配置

@SpringBootApplication(exclude={DateSourceAutoConfiguration.class})

不对 DateSourceAutoConfiguration 进行自动的配置;

6.1.3 定制Banner

1) 修改banner内容

/src/main/resources目录下创建一个banner.txt文件,然后将ASCII字符画复制进去,就能替换默认的banner了.

字符画生成地址

2)属性设置.
属性说明
${AnsiColor.BRIGHT_RED}设置控制台中输出内容的颜色
${application.version}用来获取MANIFEST.MF文件中的版本号
${spring-boot.version}Spring Boot的版本号
${application.formatted-version}格式化后的${application.version}版本信息
3)关闭banner方法1
    SpringApplication application = new SpringApplication(App.class);
    /*
     * Banner.Mode.OFF:关闭;
     * Banner.Mode.CONSOLE:控制台输出,默认方式;
     * Banner.Mode.LOG:日志输出方式;
     */
     application.setBannerMode(Banner.Mode.OFF); 
     application.run(args); 
4)关闭banner方法2

在application.proerpties进行banner的显示和关闭:

是否显示banner,可选值[true|false]

spring.main.show-banner=false

spring boot banner

6.1.4 Spring Boot的配置文件

application.properties或application.yml

//举几个例子:
server.port=9090
server.context-path=/helloboot

server:
 port: 9090
 contextPath:/helloboot
 
 
spring.redis.cluster.nodes[0]=192.168.0.1:6379  
spring.redis.cluster.nodes[1]=192.168.0.2:6379  

spring:  
   redis:  
      cluster:  
         nodes:  
            - 192.168.0.1:6379  
            - 192.168.0.2:6379  

Spring Boot application.properties或application.yml相关配置

application.properties 改成 application.yml

6.1.5 Start pom

Spring Boot application starters 下面的应用程序starters是Spring Boot在org.springframework.boot组下提供的

名称描述
spring-boot-starter核心Spring Boot starter,包括自动配置支持,日志和YAML
spring-boot-starter-actuator生产准备的特性,用于帮你监控和管理应用
spring-boot-starter-amqp对”高级消息队列协议”的支持,通过spring-rabbit实现
spring-boot-starter-aop对面向切面编程的支持,包括spring-aop和AspectJ
spring-boot-starter-batch对Spring Batch的支持,包括HSQLDB数据库
spring-boot-starter-cloud-connectors对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的连接
spring-boot-starter-data-elasticsearch对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch
spring-boot-starter-data-gemfire对GemFire分布式数据存储的支持,包括spring-data-gemfire
spring-boot-starter-data-jpa对”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate
spring-boot-starter-data-mongodb对MongoDB NOSQL数据库的支持,包括spring-data-mongodb
spring-boot-starter-data-rest对通过REST暴露Spring Data仓库的支持,通过spring-data-rest-webmvc实现
spring-boot-starter-data-solr对Apache Solr搜索平台的支持,包括spring-data-solr
spring-boot-starter-freemarker对FreeMarker模板引擎的支持
spring-boot-starter-groovy-templates对Groovy模板引擎的支持
spring-boot-starter-hateoas对基于HATEOAS的RESTful服务的支持,通过spring-hateoas实现
spring-boot-starter-hornetq对”Java消息服务API”的支持,通过HornetQ实现
spring-boot-starter-integration对普通spring-integration模块的支持
spring-boot-starter-jdbc对JDBC数据库的支持
spring-boot-starter-jersey对Jersey RESTful Web服务框架的支持
spring-boot-starter-jta-atomikos对JTA分布式事务的支持,通过Atomikos实现
spring-boot-starter-jta-bitronix对JTA分布式事务的支持,通过Bitronix实现
spring-boot-starter-mail对javax.mail的支持
spring-boot-starter-mobile对spring-mobile的支持
spring-boot-starter-mustache对Mustache模板引擎的支持
spring-boot-starter-redis对REDIS键值数据存储的支持,包括spring-redis
spring-boot-starter-security对spring-security的支持
spring-boot-starter-social-facebook对spring-social-facebook的支持
spring-boot-starter-social-linkedin对spring-social-linkedin的支持
spring-boot-starter-social-twitter对spring-social-twitter的支持
spring-boot-starter-test对常用测试依赖的支持,包括JUnit, Hamcrest和Mockito,还有spring-test模块
spring-boot-starter-thymeleaf对Thymeleaf模板引擎的支持,包括和Spring的集成
spring-boot-starter-velocity对Velocity模板引擎的支持
spring-boot-starter-web对全栈web开发的支持,包括Tomcat和spring-webmvc
spring-boot-starter-websocket对WebSocket开发的支持
spring-boot-starter-ws对Spring Web服务的支持

Spring Boot生产准备的starters

名称描述
spring-boot-starter-actuator添加生产准备特性,比如指标和监控
spring-boot-starter-remote-shell添加远程ssh

Spring Boot technical starters
可用于排除或交换具体技术方面的starters。

名称描述
spring-boot-starter-jetty导入Jetty HTTP引擎(作为Tomcat的替代)
spring-boot-starter-log4j对Log4J日志系统的支持
spring-boot-starter-logging导入Spring Boot的默认日志系统(Logback)
spring-boot-starter-tomcat导入Spring Boot的默认HTTP引擎(Tomcat)
spring-boot-starter-undertow导入Undertow HTTP引擎(作为Tomcat的替代)

spring-boot其它插件

名称描述
spring-boot-maven-pluginSpring Boot 的Maven插件(Spring Boot Maven plugin) 能够以Maven的方式为应用提供Spring Boot 的支持,即为Spring Boot应用提供了执行Maven操作的可能

springboot starter pom详解

6.1.6 支持XML配置文件

@ImportResource 应用XML
@ImportResource({“classpath:some-context.xml”,“classpath:another-context.xml”})

Java 的配置元数据 @ImportResource

6.2 外部配置

6.2.1 命令行参数配置

java -jar xx.jar
java -jar xx.jar --server.port=9090

6.2.2 常规属性配置

配置文件自动绑定到vo,属性上.

afsReqURL=http://192.168.2.80:8888/msDprAF088?

@Service
public class AfsVerifyBean  {
    @Value("${afsReqURL}")
	private String reqURL;
}

6.2.3 类型安全的配置(基于properties)

这种还是蛮实用的.

application.properties中包含:
author.name=wyf
author.age=32

package com.wisely.ch6_2_3.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "author") //1 
public class AuthorSettings {
    private String name;
    private Long age;

    public String getName() {
        return name;
    }

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

    public Long getAge() {
        return age;
    }

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

6.3 日志配置

支持java util logging,log4j,log4j2,logback,默认logback.
logback详解

6.4 Profile配置

spring.profiles.active=dev

//tomcat中的配置方法
export  JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.d
efaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -Dspring.profiles.active=sit-vc"
export JAVA_HOME JAVA_BIN PATH CLASSPATH JAVA_OPTS
$CATALINA_HOME/bin/startup.sh -config $CATALINA_BASE/conf/server.xml

实战

6.5 Spring Boot运行原理

spring-boot-autoconfigure-1.3.0.x.jar中包含所有所有的自动配置.
自动配置有如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pC2aJZ8u-1583250357857)(https://raw.githubusercontent.com/bobshute/public/master/imgs/book/JavaEE%E5%BC%80%E5%8F%91%E7%9A%84%E9%A2%A0%E8%A6%86%E8%80%85SpringBoot%E5%AE%9E%E6%88%98/spring-boot-autoconfigure/org.springframework.boot.autoconfigure.png)]

启动时控制台会有显示开启的配置和关闭的日志,日志如下




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


Positive matches:
-----------------

  AopAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.context.annotation.EnableAspectJAutoProxy,org.aspectj.lang.annotation.Aspect,org.aspectj.lang.reflect.Advice (OnClassCondition)
     - matched (OnPropertyCondition)

  AopAutoConfiguration.JdkDynamicAutoProxyConfiguration matched
     - matched (OnPropertyCondition)

  AuditAutoConfiguration.AuditEventRepositoryConfiguration matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourceAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)

  DataSourceAutoConfiguration.DataSourceInitializerConfiguration matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourceAutoConfiguration.JdbcTemplateConfiguration matched
     - existing auto database detected (DataSourceAutoConfiguration.DataSourceAvailableCondition)

  DataSourceAutoConfiguration.JdbcTemplateConfiguration#jdbcTemplate matched
     - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourceAutoConfiguration.JdbcTemplateConfiguration#namedParameterJdbcTemplate matched
     - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourceAutoConfiguration.NonEmbeddedConfiguration matched
     - supported DataSource class found (DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition)
     - @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration matched
     - @ConditionalOnClass classes found: org.apache.tomcat.jdbc.pool.DataSource (OnClassCondition)

  DataSourceTransactionManagerAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)

  DataSourceTransactionManagerAutoConfiguration#transactionManager matched
     - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [dataSource] @ConditionalOnMissingBean (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found no beans (OnBeanCondition)

  DataSourceTransactionManagerAutoConfiguration.TransactionManagementConfiguration matched
     - @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) found no beans (OnBeanCondition)

  DispatcherServletAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.web.servlet.DispatcherServlet (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.ServletRegistration (OnClassCondition)
     - no ServletRegistrationBean found (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition)

  EmbeddedServletContainerAutoConfiguration matched
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  EmbeddedServletContainerAutoConfiguration.EmbeddedTomcat matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.apache.catalina.startup.Tomcat (OnClassCondition)
     - @ConditionalOnMissingBean (types: org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; SearchStrategy: current) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#autoConfigurationReportEndpoint matched
     - @ConditionalOnBean (types: org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; SearchStrategy: all) found the following [autoConfigurationReport] @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.AutoConfigurationReportEndpoint; SearchStrategy: current) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#beansEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.BeansEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#configurationPropertiesReportEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.ConfigurationPropertiesReportEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#dumpEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.DumpEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#environmentEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#healthEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.HealthEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#infoEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.InfoEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#metricsEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.MetricsEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#shutdownEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.ShutdownEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration#traceEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.TraceEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointAutoConfiguration.RequestMappingEndpointConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.web.servlet.handler.AbstractHandlerMethodMapping (OnClassCondition)

  EndpointAutoConfiguration.RequestMappingEndpointConfiguration#requestMappingEndpoint matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.RequestMappingEndpoint; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointMBeanExportAutoConfiguration matched
     - JMX Endpoints (EndpointMBeanExportAutoConfiguration.JmxEnabledCondition)

  EndpointWebMvcAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  EndpointWebMvcAutoConfiguration.EndpointWebMvcConfiguration matched
     - Management context (EndpointWebMvcAutoConfiguration.OnManagementMvcCondition)

  EndpointWebMvcManagementContextConfiguration#endpointHandlerMapping matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointWebMvcManagementContextConfiguration#environmentMvcEndpoint matched
     - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; SearchStrategy: all) found the following [environmentEndpoint] (OnBeanCondition)
     - All endpoints are enabled by default (OnEnabledEndpointCondition)

  EndpointWebMvcManagementContextConfiguration#healthMvcEndpoint matched
     - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.HealthEndpoint; SearchStrategy: all) found the following [healthEndpoint] (OnBeanCondition)
     - All endpoints are enabled by default (OnEnabledEndpointCondition)

  EndpointWebMvcManagementContextConfiguration#logfileMvcEndpoint matched
     - Found logging.path: logs (EndpointWebMvcManagementContextConfiguration.LogFileCondition)
     - All endpoints are enabled by default (OnEnabledEndpointCondition)

  EndpointWebMvcManagementContextConfiguration#metricsMvcEndpoint matched
     - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.MetricsEndpoint; SearchStrategy: all) found the following [metricsEndpoint] (OnBeanCondition)
     - All endpoints are enabled by default (OnEnabledEndpointCondition)

  EndpointWebMvcManagementContextConfiguration#mvcEndpoints matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.mvc.MvcEndpoints; SearchStrategy: all) found no beans (OnBeanCondition)

  EndpointWebMvcManagementContextConfiguration#shutdownMvcEndpoint matched
     - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.ShutdownEndpoint; SearchStrategy: all) found the following [shutdownEndpoint] (OnBeanCondition)
     - The endpoint shutdown is enabled (OnEnabledEndpointCondition)

  ErrorMvcAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  ErrorMvcAutoConfiguration#basicErrorController matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.ErrorController; SearchStrategy: current) found no beans (OnBeanCondition)

  ErrorMvcAutoConfiguration#errorAttributes matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.ErrorAttributes; SearchStrategy: current) found no beans (OnBeanCondition)

  ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration matched
     - No error template view detected (ErrorMvcAutoConfiguration.ErrorTemplateMissingCondition)
     - matched (OnPropertyCondition)

  ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#beanNameViewResolver matched
     - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found no beans (OnBeanCondition)

  ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#defaultErrorView matched
     - @ConditionalOnMissingBean (names: error; SearchStrategy: all) found no beans (OnBeanCondition)

  GenericCacheConfiguration matched
     - Automatic cache type (CacheCondition)

  GuavaCacheConfiguration matched
     - @ConditionalOnClass classes found: com.google.common.cache.CacheBuilder,org.springframework.cache.guava.GuavaCacheManager (OnClassCondition)
     - Automatic cache type (CacheCondition)

  HealthIndicatorAutoConfiguration#healthAggregator matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthAggregator; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate (OnClassCondition)
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [dataSource] (OnBeanCondition)

  HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration#dbHealthIndicator matched
     - @ConditionalOnMissingBean (names: dbHealthIndicator; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.DiskSpaceHealthIndicatorConfiguration matched
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)

  HealthIndicatorAutoConfiguration.DiskSpaceHealthIndicatorConfiguration#diskSpaceHealthIndicator matched
     - @ConditionalOnMissingBean (names: diskSpaceHealthIndicator; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.RabbitHealthIndicatorConfiguration matched
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.springframework.amqp.rabbit.core.RabbitTemplate; SearchStrategy: all) found the following [rabbitTemplate] (OnBeanCondition)

  HealthIndicatorAutoConfiguration.RabbitHealthIndicatorConfiguration#rabbitHealthIndicator matched
     - @ConditionalOnMissingBean (names: rabbitHealthIndicator; SearchStrategy: all) found no beans (OnBeanCondition)

  HttpEncodingAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.web.filter.CharacterEncodingFilter (OnClassCondition)
     - matched (OnPropertyCondition)

  HttpEncodingAutoConfiguration#characterEncodingFilter matched
     - @ConditionalOnMissingBean (types: org.springframework.web.filter.CharacterEncodingFilter; SearchStrategy: all) found no beans (OnBeanCondition)

  HttpMessageConvertersAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.http.converter.HttpMessageConverter (OnClassCondition)

  HttpMessageConvertersAutoConfiguration#messageConverters matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.HttpMessageConverters; SearchStrategy: all) found no beans (OnBeanCondition)

  HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.http.converter.StringHttpMessageConverter (OnClassCondition)

  HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration#stringHttpMessageConverter matched
     - @ConditionalOnMissingBean (types: org.springframework.http.converter.StringHttpMessageConverter; SearchStrategy: all) found no beans (OnBeanCondition)

  JacksonAutoConfiguration matched
     - @ConditionalOnClass classes found: com.fasterxml.jackson.databind.ObjectMapper (OnClassCondition)

  JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration matched
     - @ConditionalOnClass classes found: com.fasterxml.jackson.databind.ObjectMapper,org.springframework.http.converter.json.Jackson2ObjectMapperBuilder (OnClassCondition)

  JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration#jacksonObjectMapperBuilder matched
     - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) found no beans (OnBeanCondition)

  JacksonAutoConfiguration.JacksonObjectMapperConfiguration matched
     - @ConditionalOnClass classes found: com.fasterxml.jackson.databind.ObjectMapper,org.springframework.http.converter.json.Jackson2ObjectMapperBuilder (OnClassCondition)

  JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper matched
     - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found no beans (OnBeanCondition)

  JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration matched
     - @ConditionalOnClass classes found: com.fasterxml.jackson.databind.ObjectMapper (OnClassCondition)
     - matched (OnPropertyCondition)
     - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found the following [jacksonObjectMapper] (OnBeanCondition)

  JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration#mappingJackson2HttpMessageConverter matched
     - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; SearchStrategy: all) found no beans (OnBeanCondition)

  JmxAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.jmx.export.MBeanExporter (OnClassCondition)
     - matched (OnPropertyCondition)

  JmxAutoConfiguration#mbeanExporter matched
     - @ConditionalOnMissingBean (types: org.springframework.jmx.export.MBeanExporter; SearchStrategy: current) found no beans (OnBeanCondition)

  JmxAutoConfiguration#mbeanServer matched
     - @ConditionalOnMissingBean (types: javax.management.MBeanServer; SearchStrategy: all) found no beans (OnBeanCondition)

  JmxAutoConfiguration#objectNamingStrategy matched
     - @ConditionalOnMissingBean (types: org.springframework.jmx.export.naming.ObjectNamingStrategy; SearchStrategy: current) found no beans (OnBeanCondition)

  ManagementServerPropertiesAutoConfiguration#managementServerProperties matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.autoconfigure.ManagementServerProperties; SearchStrategy: all) found no beans (OnBeanCondition)

  MetricExportAutoConfiguration matched
     - matched (OnPropertyCondition)

  MetricExportAutoConfiguration#metricWritersMetricExporter matched
     - @ConditionalOnMissingBean (names: metricWritersMetricExporter; SearchStrategy: all) found no beans (OnBeanCondition)

  MetricExportAutoConfiguration.MetricExportPropertiesConfiguration#metricExportProperties matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.export.MetricExportProperties; SearchStrategy: all) found no beans (OnBeanCondition)

  MetricFilterAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,javax.servlet.ServletRegistration,org.springframework.web.filter.OncePerRequestFilter,org.springframework.web.servlet.HandlerMapping (OnClassCondition)
     - matched (OnPropertyCondition)
     - @ConditionalOnBean (types: org.springframework.boot.actuate.metrics.CounterService,org.springframework.boot.actuate.metrics.GaugeService; SearchStrategy: all) found the following [dropwizardMetricServices, dropwizardMetricServices] (OnBeanCondition)

  MetricRepositoryAutoConfiguration.LegacyMetricRepositoryConfiguration matched
     - Required JVM version older than 1.8 found 1.7 (OnJavaCondition)
     - @ConditionalOnMissingBean (names: actuatorMetricRepository; SearchStrategy: all) found no beans (OnBeanCondition)

  MetricsDropwizardAutoConfiguration matched
     - @ConditionalOnClass classes found: com.codahale.metrics.MetricRegistry (OnClassCondition)

  MetricsDropwizardAutoConfiguration#dropwizardMetricServices matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.dropwizard.DropwizardMetricServices,org.springframework.boot.actuate.metrics.CounterService,org.springframework.boot.actuate.metrics.GaugeService; SearchStrategy: all) found no beans (OnBeanCondition)

  MultipartAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.multipart.support.StandardServletMultipartResolver,javax.servlet.MultipartConfigElement (OnClassCondition)
     - matched (OnPropertyCondition)

  MultipartAutoConfiguration#multipartConfigElement matched
     - @ConditionalOnMissingBean (types: javax.servlet.MultipartConfigElement; SearchStrategy: all) found no beans (OnBeanCondition)

  MultipartAutoConfiguration#multipartResolver matched
     - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) found no beans (OnBeanCondition)

  MybatisAutoConfiguration matched
     - @ConditionalOnClass classes found: org.apache.ibatis.session.SqlSessionFactory,org.mybatis.spring.SqlSessionFactoryBean (OnClassCondition)
     - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [dataSource] (OnBeanCondition)

  MybatisAutoConfiguration#sqlSessionFactory matched
     - @ConditionalOnMissingBean (types: org.apache.ibatis.session.SqlSessionFactory; SearchStrategy: all) found no beans (OnBeanCondition)

  MybatisAutoConfiguration#sqlSessionTemplate matched
     - @ConditionalOnMissingBean (types: org.mybatis.spring.SqlSessionTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  MybatisAutoConfiguration.MapperScannerRegistrarNotFoundConfiguration matched
     - @ConditionalOnMissingBean (types: org.mybatis.spring.mapper.MapperFactoryBean; SearchStrategy: all) found no beans (OnBeanCondition)

  NoOpCacheConfiguration matched
     - Automatic cache type (CacheCondition)

  PersistenceExceptionTranslationAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor (OnClassCondition)

  PersistenceExceptionTranslationAutoConfiguration#persistenceExceptionTranslationPostProcessor matched
     - @ConditionalOnMissingBean (types: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; SearchStrategy: all) found no beans (OnBeanCondition)
     - matched (OnPropertyCondition)

  PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched
     - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) found no beans (OnBeanCondition)

  PublicMetricsAutoConfiguration.DataSourceMetricsConfiguration matched
     - @ConditionalOnClass classes found: javax.sql.DataSource (OnClassCondition)
     - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [dataSource] (OnBeanCondition)

  PublicMetricsAutoConfiguration.DataSourceMetricsConfiguration#dataSourcePublicMetrics matched
     - @ConditionalOnBean (types: org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider; SearchStrategy: all) found the following [tomcatPoolDataSourceMetadataProvider] @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics; SearchStrategy: all) found no beans (OnBeanCondition)

  PublicMetricsAutoConfiguration.TomcatMetricsConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.apache.catalina.startup.Tomcat (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  PublicMetricsAutoConfiguration.TomcatMetricsConfiguration#tomcatPublicMetrics matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.TomcatPublicMetrics; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAnnotationDrivenConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.amqp.rabbit.annotation.EnableRabbit (OnClassCondition)

  RabbitAnnotationDrivenConfiguration#rabbitListenerContainerFactory matched
     - @ConditionalOnMissingBean (names: rabbitListenerContainerFactory; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAnnotationDrivenConfiguration.EnableRabbitConfiguration matched
     - @ConditionalOnMissingBean (names: org.springframework.amqp.rabbit.config.internalRabbitListenerAnnotationProcessor; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.amqp.rabbit.core.RabbitTemplate,com.rabbitmq.client.Channel (OnClassCondition)

  RabbitAutoConfiguration#amqpAdmin matched
     - matched (OnPropertyCondition)
     - @ConditionalOnMissingBean (types: org.springframework.amqp.core.AmqpAdmin; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAutoConfiguration#rabbitTemplate matched
     - @ConditionalOnMissingBean (types: org.springframework.amqp.rabbit.core.RabbitTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAutoConfiguration.MessagingTemplateConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.amqp.rabbit.core.RabbitMessagingTemplate (OnClassCondition)
     - @ConditionalOnMissingBean (types: org.springframework.amqp.rabbit.core.RabbitMessagingTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  RabbitAutoConfiguration.RabbitConnectionFactoryCreator matched
     - @ConditionalOnMissingBean (types: org.springframework.amqp.rabbit.connection.ConnectionFactory; SearchStrategy: all) found no beans (OnBeanCondition)

  RedisCacheConfiguration matched
     - Automatic cache type (CacheCondition)

  RedisClusterConfig matched
     - @ConditionalOnClass classes found: redis.clients.jedis.JedisCluster (OnClassCondition)

  RestTemplateAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.web.client.RestTemplate,org.apache.http.client.HttpClient (OnClassCondition)

  RestTemplateAutoConfiguration#getRestTemplate matched
     - @ConditionalOnMissingBean (types: org.springframework.web.client.RestTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  ServerPropertiesAutoConfiguration matched
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  ServerPropertiesAutoConfiguration#serverProperties matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.ServerProperties; SearchStrategy: current) found no beans (OnBeanCondition)

  SimpleCacheConfiguration matched
     - Automatic cache type (CacheCondition)

  TraceRepositoryAutoConfiguration#traceRepository matched
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.trace.TraceRepository; SearchStrategy: all) found no beans (OnBeanCondition)

  TraceWebFilterAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet,javax.servlet.ServletRegistration (OnClassCondition)

  TransactionAutoConfiguration matched
     - @ConditionalOnClass classes found: org.springframework.transaction.support.TransactionTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)
     - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a primary candidate amongst the following [transactionManager] (OnBeanCondition)

  TransactionAutoConfiguration#transactionTemplate matched
     - @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,org.springframework.web.servlet.DispatcherServlet,org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)
     - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration#hiddenHttpMethodFilter matched
     - @ConditionalOnMissingBean (types: org.springframework.web.filter.HiddenHttpMethodFilter; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration#httpPutFormContentFilter matched
     - @ConditionalOnMissingBean (types: org.springframework.web.filter.HttpPutFormContentFilter; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver matched
     - @ConditionalOnBean (types: org.springframework.web.servlet.View; SearchStrategy: all) found the following [error] (OnBeanCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched
     - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched
     - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched
     - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found the following [beanNameViewResolver, mvcViewResolver, defaultViewResolver] @ConditionalOnMissingBean (names: viewResolver; types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) found no beans (OnBeanCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter.FaviconConfiguration matched
     - matched (OnPropertyCondition)

  WebSocketAutoConfiguration matched
     - @ConditionalOnClass classes found: javax.servlet.Servlet,javax.websocket.server.ServerContainer (OnClassCondition)
     - found web application StandardServletEnvironment (OnWebApplicationCondition)

  WebSocketAutoConfiguration.TomcatWebSocketConfiguration matched
     - @ConditionalOnClass classes found: org.apache.catalina.startup.Tomcat,org.apache.tomcat.websocket.server.WsSci (OnClassCondition)

  WebSocketAutoConfiguration.TomcatWebSocketConfiguration#websocketContainerCustomizer matched
     - @ConditionalOnMissingBean (names: websocketContainerCustomizer; SearchStrategy: all) found no beans (OnBeanCondition)


Negative matches:
-----------------

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

  AopAutoConfiguration.CglibAutoProxyConfiguration did not match
     - @ConditionalOnProperty missing required properties spring.aop.proxy-target-class  (OnPropertyCondition)

  ArtemisAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.jms.ConnectionFactory,org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory (OnClassCondition)

  AuditAutoConfiguration#authenticationAuditListener did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.authentication.event.AbstractAuthenticationEvent (OnClassCondition)

  AuditAutoConfiguration#authorizationAuditListener did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.access.event.AbstractAuthorizationEvent (OnClassCondition)

  BatchAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.batch.core.launch.JobLauncher (OnClassCondition)

  CacheAutoConfiguration did not match
     - @ConditionalOnClass classes found: org.springframework.cache.CacheManager (OnClassCondition)
     - @ConditionalOnBean (types: org.springframework.cache.interceptor.CacheAspectSupport; SearchStrategy: all) found no beans (OnBeanCondition)

  CacheAutoConfiguration.CacheManagerJpaDependencyConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean (OnClassCondition)
     - Ancestor 'org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration did not match
     - @ConditionalOnBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) found no beans (OnBeanCondition)

  CacheStatisticsAutoConfiguration.ConcurrentMapCacheStatisticsConfiguration did not match
     - @ConditionalOnClass classes found: org.springframework.cache.concurrent.ConcurrentMapCache (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.EhCacheCacheStatisticsProviderConfiguration did not match
     - required @ConditionalOnClass classes not found: net.sf.ehcache.Ehcache (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.GuavaCacheStatisticsConfiguration did not match
     - @ConditionalOnClass classes found: com.google.common.cache.Cache,org.springframework.cache.guava.GuavaCache (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.HazelcastCacheStatisticsConfiguration did not match
     - required @ConditionalOnClass classes not found: com.hazelcast.core.IMap,com.hazelcast.spring.cache.HazelcastCache (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.InfinispanCacheStatisticsProviderConfiguration did not match
     - required @ConditionalOnClass classes not found: org.infinispan.spring.provider.SpringCache (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.JCacheCacheStatisticsProviderConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.cache.Caching (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CacheStatisticsAutoConfiguration.NoOpCacheStatisticsConfiguration did not match
     - @ConditionalOnClass classes found: org.springframework.cache.support.NoOpCacheManager (OnClassCondition)
     - Ancestor 'org.springframework.boot.actuate.autoconfigure.CacheStatisticsAutoConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)

  CassandraAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.datastax.driver.core.Cluster (OnClassCondition)

  CassandraDataAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.datastax.driver.core.Cluster,org.springframework.data.cassandra.core.CassandraAdminOperations (OnClassCondition)

  CassandraRepositoriesAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.datastax.driver.core.Session,org.springframework.data.cassandra.repository.CassandraRepository (OnClassCondition)

  CloudAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.cloud.config.java.CloudScanConfiguration (OnClassCondition)

  CrshAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.crsh.plugin.PluginLifeCycle (OnClassCondition)

  DataSourceAutoConfiguration.EmbeddedConfiguration did not match
     - existing non-embedded database detected (DataSourceAutoConfiguration.EmbeddedDataSourceCondition)

  DataSourceAutoConfiguration.TomcatDataSourceJmxConfiguration did not match
     - @ConditionalOnClass classes found: org.apache.tomcat.jdbc.pool.DataSourceProxy (OnClassCondition)
     - existing auto database detected (DataSourceAutoConfiguration.DataSourceAvailableCondition)
     - @ConditionalOnProperty missing required properties spring.datasource.jmx-enabled  (OnPropertyCondition)

  DataSourcePoolMetadataProvidersConfiguration.CommonsDbcpPoolDataSourceMetadataProviderConfiguration did not match
     - required @ConditionalOnClass classes not found: org.apache.commons.dbcp.BasicDataSource (OnClassCondition)

  DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration did not match
     - required @ConditionalOnClass classes not found: com.zaxxer.hikari.HikariDataSource (OnClassCondition)

  DeviceDelegatingViewResolverAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.mobile.device.view.LiteDeviceDelegatingViewResolver (OnClassCondition)

  DeviceResolverAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.mobile.device.DeviceResolverHandlerInterceptor,org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver (OnClassCondition)

  DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver did not match
     - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) found no beans (OnBeanCondition)

  EhCacheCacheConfiguration did not match
     - required @ConditionalOnClass classes not found: net.sf.ehcache.Cache (OnClassCondition)

  ElasticsearchAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.elasticsearch.client.Client,org.springframework.data.elasticsearch.client.TransportClientFactoryBean,org.springframework.data.elasticsearch.client.NodeClientFactoryBean (OnClassCondition)

  ElasticsearchDataAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.elasticsearch.client.Client,org.springframework.data.elasticsearch.core.ElasticsearchTemplate (OnClassCondition)

  ElasticsearchRepositoriesAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.elasticsearch.client.Client,org.springframework.data.elasticsearch.repository.ElasticsearchRepository (OnClassCondition)

  EmbeddedMongoAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.mongodb.Mongo,de.flapdoodle.embed.mongo.MongodStarter (OnClassCondition)

  EmbeddedServletContainerAutoConfiguration.EmbeddedJetty did not match
     - required @ConditionalOnClass classes not found: org.eclipse.jetty.server.Server,org.eclipse.jetty.util.Loader,org.eclipse.jetty.webapp.WebAppContext (OnClassCondition)

  EmbeddedServletContainerAutoConfiguration.EmbeddedUndertow did not match
     - required @ConditionalOnClass classes not found: io.undertow.Undertow,org.xnio.SslClientAuthMode (OnClassCondition)

  EncryptAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.jasypt.encryption.StringEncryptor (OnClassCondition)

  EndpointAutoConfiguration.FlywayEndpointConfiguration did not match
     - required @ConditionalOnClass classes not found: org.flywaydb.core.Flyway (OnClassCondition)

  EndpointAutoConfiguration.LiquibaseEndpointConfiguration did not match
     - required @ConditionalOnClass classes not found: liquibase.integration.spring.SpringLiquibase (OnClassCondition)

  EndpointMBeanExportAutoConfiguration#mbeanServer did not match
     - @ConditionalOnMissingBean (types: javax.management.MBeanServer; SearchStrategy: all) found the following [mbeanServer] (OnBeanCondition)

  EndpointWebMvcHypermediaManagementContextConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.hateoas.Link (OnClassCondition)

  FacebookAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.social.config.annotation.SocialConfigurerAdapter,org.springframework.social.facebook.connect.FacebookConnectionFactory (OnClassCondition)

  FallbackWebSecurityAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.config.annotation.web.configuration.EnableWebSecurity (OnClassCondition)

  FlywayAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.flywaydb.core.Flyway (OnClassCondition)

  FreeMarkerAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: freemarker.template.Configuration (OnClassCondition)

  GroovyTemplateAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: groovy.text.markup.MarkupTemplateEngine (OnClassCondition)

  GsonAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.google.gson.Gson (OnClassCondition)

  GsonHttpMessageConvertersConfiguration did not match
     - required @ConditionalOnClass classes not found: com.google.gson.Gson (OnClassCondition)

  H2ConsoleAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.h2.server.web.WebServlet (OnClassCondition)

  HazelcastAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.hazelcast.core.HazelcastInstance (OnClassCondition)

  HazelcastCacheConfiguration did not match
     - required @ConditionalOnClass classes not found: com.hazelcast.core.HazelcastInstance,com.hazelcast.spring.cache.HazelcastCacheManager (OnClassCondition)

  HazelcastJpaDependencyAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.hazelcast.core.HazelcastInstance,org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean (OnClassCondition)

  HealthIndicatorAutoConfiguration#applicationHealthIndicator did not match
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.health.HealthIndicator; SearchStrategy: all) found the following [rabbitHealthIndicator, dbHealthIndicator, diskSpaceHealthIndicator] (OnBeanCondition)

  HealthIndicatorAutoConfiguration.CassandraHealthIndicatorConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.data.cassandra.core.CassandraOperations,com.datastax.driver.core.Cluster (OnClassCondition)

  HealthIndicatorAutoConfiguration.ElasticsearchHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.elasticsearch.client.Client; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.JmsHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.MailHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.springframework.mail.javamail.JavaMailSenderImpl; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.MongoHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.springframework.data.mongodb.core.MongoTemplate; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.RedisHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.springframework.data.redis.connection.RedisConnectionFactory; SearchStrategy: all) found no beans (OnBeanCondition)

  HealthIndicatorAutoConfiguration.SolrHealthIndicatorConfiguration did not match
     - All default health indicators are enabled by default (OnEnabledHealthIndicatorCondition)
     - @ConditionalOnBean (types: org.apache.solr.client.solrj.SolrServer; SearchStrategy: all) found no beans (OnBeanCondition)

  HibernateJpaAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,javax.persistence.EntityManager (OnClassCondition)

  HornetQAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.jms.ConnectionFactory,org.hornetq.api.jms.HornetQJMSClient (OnClassCondition)

  HypermediaAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.hateoas.Resource,org.springframework.plugin.core.Plugin (OnClassCondition)

  InfinispanCacheConfiguration did not match
     - required @ConditionalOnClass classes not found: org.infinispan.spring.provider.SpringEmbeddedCacheManager (OnClassCondition)

  IntegrationAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.integration.config.EnableIntegration (OnClassCondition)

  JCacheCacheConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.cache.Caching (OnClassCondition)

  JacksonAutoConfiguration.JodaDateTimeJacksonConfiguration did not match
     - required @ConditionalOnClass classes not found: org.joda.time.DateTime,com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer,com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat (OnClassCondition)

  JacksonAutoConfiguration.ParameterNamesModuleConfiguration did not match
     - required @ConditionalOnClass classes not found: com.fasterxml.jackson.module.paramnames.ParameterNamesModule (OnClassCondition)

  JacksonHttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration did not match
     - required @ConditionalOnClass classes not found: com.fasterxml.jackson.dataformat.xml.XmlMapper (OnClassCondition)

  JerseyAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.glassfish.jersey.server.spring.SpringComponentProvider (OnClassCondition)

  JmsAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.jms.core.JmsTemplate (OnClassCondition)

  JndiConnectionFactoryAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.jms.core.JmsTemplate (OnClassCondition)

  JndiDataSourceAutoConfiguration did not match
     - @ConditionalOnClass classes found: javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)
     - @ConditionalOnProperty missing required properties spring.datasource.jndi-name  (OnPropertyCondition)

  JolokiaAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.jolokia.http.AgentServlet (OnClassCondition)

  JooqAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.jooq.DSLContext (OnClassCondition)

  JpaRepositoriesAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.data.jpa.repository.JpaRepository (OnClassCondition)

  JtaAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.transaction.Transaction (OnClassCondition)

  LinkedInAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.social.config.annotation.SocialConfigurerAdapter,org.springframework.social.linkedin.connect.LinkedInConnectionFactory (OnClassCondition)

  LiquibaseAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: liquibase.integration.spring.SpringLiquibase (OnClassCondition)

  MailSenderAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.mail.internet.MimeMessage (OnClassCondition)

  MailSenderValidatorAutoConfiguration did not match
     - @ConditionalOnProperty missing required properties spring.mail.test-connection  (OnPropertyCondition)

  ManagementServerPropertiesAutoConfiguration#securityProperties did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.config.annotation.web.configuration.EnableWebSecurity (OnClassCondition)

  ManagementServerPropertiesAutoConfiguration#serverProperties did not match
     - found web application StandardServletEnvironment (OnWebApplicationCondition)
     - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.ServerProperties; SearchStrategy: all) found the following [serverProperties] (OnBeanCondition)

  ManagementWebSecurityAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.config.annotation.web.configuration.EnableWebSecurity (OnClassCondition)

  MessageSourceAutoConfiguration did not match
     - No bundle found for spring.messages.basename: messages (MessageSourceAutoConfiguration.ResourceBundleCondition)

  MetricExportAutoConfiguration#statsdMetricWriter did not match
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.statsd.StatsdMetricWriter; SearchStrategy: all) found no beans (OnBeanCondition)
     - @ConditionalOnProperty missing required properties spring.metrics.export.statsd.host  (OnPropertyCondition)

  MetricRepositoryAutoConfiguration.FastMetricServicesConfiguration did not match
     - Required JVM version 1.8 or newer found 1.7 (OnJavaCondition)

  MetricRepositoryAutoConfiguration.LegacyMetricServicesConfiguration did not match
     - Required JVM version older than 1.8 found 1.7 (OnJavaCondition)
     - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.metrics.GaugeService; SearchStrategy: all) found the following [dropwizardMetricServices] (OnBeanCondition)

  MetricsChannelAutoConfiguration did not match
     - @ConditionalOnClass classes found: org.springframework.messaging.MessageChannel (OnClassCondition)
     - @ConditionalOnBean (names: metricsChannel; SearchStrategy: all) found no beans (OnBeanCondition)

  MetricsDropwizardAutoConfiguration#metricRegistry did not match
     - @ConditionalOnMissingBean (types: com.codahale.metrics.MetricRegistry; SearchStrategy: all) found the following [getMetricRegistry] (OnBeanCondition)

  MongoAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.mongodb.MongoClient (OnClassCondition)

  MongoDataAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.mongodb.Mongo,org.springframework.data.mongodb.core.MongoTemplate (OnClassCondition)

  MongoRepositoriesAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.mongodb.Mongo,org.springframework.data.mongodb.repository.MongoRepository (OnClassCondition)

  MustacheAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.samskivert.mustache.Mustache (OnClassCondition)

  OAuth2AutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.oauth2.common.OAuth2AccessToken (OnClassCondition)

  PublicMetricsAutoConfiguration#richGaugePublicMetrics did not match
     - @ConditionalOnBean (types: org.springframework.boot.actuate.metrics.rich.RichGaugeReader; SearchStrategy: all) found no beans (OnBeanCondition)

  PublicMetricsAutoConfiguration.CacheStatisticsConfiguration did not match
     - @ConditionalOnClass classes found: org.springframework.cache.CacheManager (OnClassCondition)
     - @ConditionalOnBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) found no beans (OnBeanCondition)

  PublicMetricsAutoConfiguration.IntegrationMetricsConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.integration.monitor.IntegrationMBeanExporter (OnClassCondition)

  ReactorAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: reactor.spring.context.config.EnableReactor,reactor.Environment (OnClassCondition)

  RedisAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.data.redis.connection.jedis.JedisConnection,org.springframework.data.redis.core.RedisOperations (OnClassCondition)

  RepositoryRestMvcAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration (OnClassCondition)

  SecurityAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.authentication.AuthenticationManager,org.springframework.security.config.annotation.authentication.configurers.GlobalAuthenticationConfigurerAdapter (OnClassCondition)

  SecurityFilterAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer (OnClassCondition)

  SendGridAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: com.sendgrid.SendGrid (OnClassCondition)

  SessionAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.session.Session (OnClassCondition)

  SitePreferenceAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor,org.springframework.mobile.device.site.SitePreferenceHandlerMethodArgumentResolver (OnClassCondition)

  SocialWebAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.social.connect.web.ConnectController,org.springframework.social.config.annotation.SocialConfigurerAdapter (OnClassCondition)

  SolrAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.apache.solr.client.solrj.impl.HttpSolrServer,org.apache.solr.client.solrj.impl.CloudSolrServer,org.apache.solr.common.cloud.HashPartitioner (OnClassCondition)

  SolrRepositoriesAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.apache.solr.client.solrj.SolrServer,org.springframework.data.solr.repository.SolrRepository (OnClassCondition)

  SpringApplicationAdminJmxAutoConfiguration did not match
     - @ConditionalOnProperty missing required properties spring.application.admin.enabled  (OnPropertyCondition)

  SpringDataWebAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.data.web.PageableHandlerMethodArgumentResolver (OnClassCondition)

  ThymeleafAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.thymeleaf.spring4.SpringTemplateEngine (OnClassCondition)

  TwitterAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.social.config.annotation.SocialConfigurerAdapter,org.springframework.social.twitter.connect.TwitterConnectionFactory (OnClassCondition)

  VelocityAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.apache.velocity.app.VelocityEngine (OnClassCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#dateFormatter did not match
     - @ConditionalOnProperty missing required properties spring.mvc.date-format  (OnPropertyCondition)

  WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#localeResolver did not match
     - @ConditionalOnMissingBean (types: org.springframework.web.servlet.LocaleResolver; SearchStrategy: all) found no beans (OnBeanCondition)
     - @ConditionalOnProperty missing required properties spring.mvc.locale  (OnPropertyCondition)

  WebSocketAutoConfiguration.JettyWebSocketConfiguration did not match
     - required @ConditionalOnClass classes not found: org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer (OnClassCondition)

  WebSocketAutoConfiguration.UndertowWebSocketConfiguration did not match
     - required @ConditionalOnClass classes not found: io.undertow.websockets.jsr.Bootstrap (OnClassCondition)

  WebSocketMessagingAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer (OnClassCondition)

  XADataSourceAutoConfiguration did not match
     - required @ConditionalOnClass classes not found: javax.transaction.TransactionManager (OnClassCondition)


Exclusions:
-----------

   None


Unconditional classes:
----------------------

  org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration

  org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.AuditAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration

  org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration

  org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration



2017-07-03 22:57:31.994

启动日志附件

6.5.1 自动配置运行原理

6.5.1.1 加载spring.factories配置

Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器。

org.springframework.boot.SpringApplication.java

public class SpringApplication {	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initialize(Object[] sources) {
		if (sources != null && sources.length > 0) {
			this.sources.addAll(Arrays.asList(sources));
		}
		this.webEnvironment = deduceWebEnvironment();
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		this.mainApplicationClass = deduceMainApplicationClass();
	}

	private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type) {
		return getSpringFactoriesInstances(type, new Class<?>[] {});
	}


	private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,
			Class<?>[] parameterTypes, Object... args) {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		// Use names and ensure unique to protect against duplicates
		Set<String> names = new LinkedHashSet<String>(
				SpringFactoriesLoader.loadFactoryNames(type, classLoader));
		List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
				classLoader, args, names);
		AnnotationAwareOrderComparator.sort(instances);
		return instances;
	}
}

org.springframework.core.io.support.SpringFactoriesLoader.java;

public abstract class SpringFactoriesLoader {

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

	public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
		String factoryClassName = factoryClass.getName();
		try {
			Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
					ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
			List<String> result = new ArrayList<String>();
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
				String factoryClassNames = properties.getProperty(factoryClassName);
				result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
			}
			return result;
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
					"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
	}


}
6.5.1.2 EnableAutoConfiguration配置生效

在6.1.1 中的
@SpringBootApplication中有一个核心注解为@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};
}

而EnableAutoConfiguration的关键功能为@Import注解导入EnableAutoConfigurationImportSelector的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描META-INF/spring.factories文件中的jar包,而spring-boot-autoconfigure-1.lvlv 3.0.x.jar中就有spring.factories.

//摘取核心代码

package org.springframework.core.io.support

public abstract class SpringFactoriesLoader {
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
		String factoryClassName = factoryClass.getName();
		try {
			Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
					ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
			List<String> result = new ArrayList<String>();
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
				String factoryClassNames = properties.getProperty(factoryClassName);
				result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
			}
			return result;
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
					"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
	}
	}

***spring.factories***在spring-boot-autoconfigure\META-INF\目录下

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# 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.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
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.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
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.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
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.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
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.jms.hornetq.HornetQAutoConfiguration,\
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.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.velocity.VelocityAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
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.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration

# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.velocity.VelocityTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider

6.5.2 核心注解

打开spring.factories中的任意一个AutoConfiguration文件,一般都有下面的条件注解,在spring-boot-autoconfigure-1.3.0.x.jar的org.springframework.boot.autoconfigure.condition包下,条件注解如下.

名称说明备注
@ConditionalOnBean当容器里存在指定的Bean的条件下
@ConditionalOnClass当前类路径下存在指定的类的条件下
@ConditionalOnExpression基于SpEL表达式作为判断条件
@ConditionalOnJava基于JVM版本作为判断条件
@ConditionalOnJndi在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean当容器里没有指定的Bean的条件下
@ConditionalOnMissingClassConditionalOnMissingClass
@ConditionalOnNotWebApplication当前项目不是web项目的条件下
@ConditionalOnProperty指定的属性是否有指定的值的条件下
@ConditionalOnResource类路径下是否有指定的值
@ConditionalOnSingleCandidate指定Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication当前项目是Web项目的条件下

ConditionalOnWebApplication 源码如下:

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnWebApplicationCondition.class)
public @interface ConditionalOnWebApplication {
}

其中@Conditional是OnWebApplicationCondition.class
***OnWebApplicationCondition***源码如下

@Order(Ordered.HIGHEST_PRECEDENCE + 20)
class OnWebApplicationCondition extends SpringBootCondition {

	private static final String WEB_CONTEXT_CLASS = "org.springframework.web.context."
			+ "support.GenericWebApplicationContext";

	@Override
	public ConditionOutcome getMatchOutcome(ConditionContext context,
			AnnotatedTypeMetadata metadata) {
		boolean webApplicationRequired = metadata
				.isAnnotated(ConditionalOnWebApplication.class.getName());
		ConditionOutcome webApplication = isWebApplication(context, metadata);

		if (webApplicationRequired && !webApplication.isMatch()) {
			return ConditionOutcome.noMatch(webApplication.getMessage());
		}

		if (!webApplicationRequired && webApplication.isMatch()) {
			return ConditionOutcome.noMatch(webApplication.getMessage());
		}

		return ConditionOutcome.match(webApplication.getMessage());
	}

	private ConditionOutcome isWebApplication(ConditionContext context,
			AnnotatedTypeMetadata metadata) {

		if (!ClassUtils.isPresent(WEB_CONTEXT_CLASS, context.getClassLoader())) {
			return ConditionOutcome.noMatch("web application classes not found");
		}

		if (context.getBeanFactory() != null) {
			String[] scopes = context.getBeanFactory().getRegisteredScopeNames();
			if (ObjectUtils.containsElement(scopes, "session")) {
				return ConditionOutcome.match("found web application 'session' scope");
			}
		}

		if (context.getEnvironment() instanceof StandardServletEnvironment) {
			return ConditionOutcome
					.match("found web application StandardServletEnvironment");
		}

		if (context.getResourceLoader() instanceof WebApplicationContext) {
			return ConditionOutcome.match("found web application WebApplicationContext");
		}

		return ConditionOutcome.noMatch("not a web application");
	}

}

有方法isWebApplication和getMatchOutcome.
isWebApplication是判断是否为webApplication.
getMatchOutcome 实现是abstract class SpringBootCondition的getMatchOutcome.
matches是实现了接口Condition的boolean matches,
SpringBootCondition中matches有调用了自身的getMatchOutcome方法.
捋捋核心原理1-关于Condition:
1.顶级接口 public interface Condition,方法matches
2.抽象类 abstract class SpringBootCondition,实现matches,同时调用自己的抽象方法 getMatchOutcome
3.具体类 class OnWebApplicationCondition extends SpringBootCondition,继承的同时重写getMatchOutcome,里面有判断.最终实现了被顶级接口matches是实现了接口Condition的boolean的matches判断现象…

class OnWebApplicationCondition extends SpringBootCondition{}

//摘选部分代码
public abstract class SpringBootCondition implements Condition {

    @Override
	public final boolean matches(ConditionContext context,
			AnnotatedTypeMetadata metadata) {
		String classOrMethodName = getClassOrMethodName(metadata);
		try {
			ConditionOutcome outcome = getMatchOutcome(context, metadata);
			logOutcome(classOrMethodName, outcome);
			recordEvaluation(context, classOrMethodName, outcome);
			return outcome.isMatch();
		}
		catch (NoClassDefFoundError ex) {
			throw new IllegalStateException("Could not evaluate condition on "
					+ classOrMethodName + " due to internal class not found. "
					+ "This can happen if you are @ComponentScanning a "
					+ "springframework package (e.g. if you put a @ComponentScan "
					+ "in the default package by mistake)", ex);
		}
		catch (RuntimeException ex) {
			throw new IllegalStateException(
					"Error processing condition on " + getName(metadata), ex);
		}
	}
	
	public abstract ConditionOutcome getMatchOutcome(ConditionContext context,
			AnnotatedTypeMetadata metadata);
}


public interface Condition {
	/**
	 * Determine if the condition matches.
	 * @param context the condition context
	 * @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}
	 * or {@link org.springframework.core.type.MethodMetadata method} being checked.
	 * @return {@code true} if the condition matches and the component can be registered
	 * or {@code false} to veto registration.
	 */
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

Spring @Conditional注解的使用

Spring Boot自动配置详解(有例子),自己模拟写一个

6.5.3 实例分析

分析一个简单的SpringBoot内置的自动配置功能:http编码配置.

@ConfigurationProperties(prefix = "spring.http.encoding")//application.properties和配置的前缀是spring.http.encoding 
public class HttpEncodingProperties {

    //默认配置UTF-8,如果要修改用配置 spring.http.encoding.Charset=GBK
	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); //默认配置是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.
	 */
	 //设置forceEncoding 默认true,如果要修改用配置 spring.http.encoding.force=false
	private boolean force = true;

	public Charset getCharset() {
		return this.charset;
	}
	public void setCharset(Charset charset) {
		this.charset = charset;
	}
	public boolean isForce() {
		return this.force;
	}
	public void setForce(boolean force) {
		this.force = force;
	}
}



@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)//对上面配置类HttpEncodingProperties.开启属性注入,通过EnableConfigurationProperties,使用@Autowired注入.
@ConditionalOnClass(CharacterEncodingFilter.class)//当CharacterEncodingFilter在类路径的条件下
//当设置spring.http.encoding=enabled的情况下,如果么有设置则默认true.
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
	@Autowired
	private HttpEncodingProperties httpEncodingProperties;
	@Bean//使用java配置的方式配置CharacterEncodingFilter这Bean
	@ConditionalOnMissingBean(CharacterEncodingFilter.class)//当容器中没有的时候则新建这个Bean
	public CharacterEncodingFilter characterEncodingFilter() {
		CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
		filter.setEncoding(this.httpEncodingProperties.getCharset().name());
		filter.setForceEncoding(this.httpEncodingProperties.isForce());
		return filter;
	}
}

捋捋核心原理2-自动配置
有配置参数属性Bean-HttpEncodingProperties.java,有使用的配置前缀名称及配置属性名称
然后有一个配置Bean-HttpEncodingAutoConfiguration.java,这个里面用到了配置参数属性类,但是里面会用到捋捋核心原理1中的各种Condition.
核心原理总理解:
@SpringBootApplication–核心注解–>@EnableAutoConfiguration---->@Import(EnableAutoConfigurationImportSelector.class)–使用–>
SpringFactoriesLoader.loadFactoryNames–方法来扫描–>META-INF/spring.factories(spring-boot-autoconfigure-1.3.0.x.jar中,记录有哪些自动配置)–关于配置,举例HttpEncoding–>参数配置HttpEncodingProperties,自动配置HttpEncodingAutoConfiguration(spring…factories有记录,被loadFactoryNames扫走)---->HttpEncodingAutoConfiguration用Condition来判断参数配置值来启用符合条件的功能.

还有一点注意理解 想查看某个自动配置有哪些配置属性,到其对应的Properties.java累中查看即可!!
比如说spring-boot-autoconfigure-1.3.0.RELEASE解压后META-INF目录下有spring.factories,里面有Redis相关的自动配置类:springorg.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.打开该源码

//节选源码
@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties
public class RedisAutoConfiguration {

	@Bean(name = "org.springframework.autoconfigure.redis.RedisProperties")
	@ConditionalOnMissingBean
	public RedisProperties redisProperties() {
		return new RedisProperties();
	}

里面提到:RedisProperties,查看就知道配置有database,host,password,port,timeout,pool等



package org.springframework.boot.autoconfigure.data.redis;

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

 
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {

	/**
	 * Database index used by the connection factory.
	 */
	private int database = 0;

	/**
	 * Redis server host.
	 */
	private String host = "localhost";

	/**
	 * Login password of the redis server.
	 */
	private String password;

	/**
	 * Redis server port.
	 */
	private int port = 6379;

	/**
	 * Connection timeout in milliseconds.
	 */
	private int timeout;

	private Pool pool;

	private Sentinel sentinel;

	public int getDatabase() {
		return this.database;
	}

	public void setDatabase(int database) {
		this.database = database;
	}

	public String getHost() {
		return this.host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int getPort() {
		return this.port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	public int getTimeout() {
		return this.timeout;
	}

	public Sentinel getSentinel() {
		return this.sentinel;
	}

	public void setSentinel(Sentinel sentinel) {
		this.sentinel = sentinel;
	}

	public Pool getPool() {
		return this.pool;
	}

	public void setPool(Pool pool) {
		this.pool = pool;
	}

	/**
	 * Pool properties.
	 */
	public static class Pool {

		/**
		 * Max number of "idle" connections in the pool. Use a negative value to indicate
		 * an unlimited number of idle connections.
		 */
		private int maxIdle = 8;

		/**
		 * Target for the minimum number of idle connections to maintain in the pool. This
		 * setting only has an effect if it is positive.
		 */
		private int minIdle = 0;

		/**
		 * Max number of connections that can be allocated by the pool at a given time.
		 * Use a negative value for no limit.
		 */
		private int maxActive = 8;

		/**
		 * Maximum amount of time (in milliseconds) a connection allocation should block
		 * before throwing an exception when the pool is exhausted. Use a negative value
		 * to block indefinitely.
		 */
		private int maxWait = -1;

		public int getMaxIdle() {
			return this.maxIdle;
		}

		public void setMaxIdle(int maxIdle) {
			this.maxIdle = maxIdle;
		}

		public int getMinIdle() {
			return this.minIdle;
		}

		public void setMinIdle(int minIdle) {
			this.minIdle = minIdle;
		}

		public int getMaxActive() {
			return this.maxActive;
		}

		public void setMaxActive(int maxActive) {
			this.maxActive = maxActive;
		}

		public int getMaxWait() {
			return this.maxWait;
		}

		public void setMaxWait(int maxWait) {
			this.maxWait = maxWait;
		}
	}

	/**
	 * Redis sentinel properties.
	 */
	public static class Sentinel {

		/**
		 * Name of Redis server.
		 */
		private String master;

		/**
		 * Comma-separated list of host:port pairs.
		 */
		private String nodes;

		public String getMaster() {
			return this.master;
		}

		public void setMaster(String master) {
			this.master = master;
		}

		public String getNodes() {
			return this.nodes;
		}

		public void setNodes(String nodes) {
			this.nodes = nodes;
		}
	}
}

6.5.4 实战

自己写一个starter pom例子

//源码代码附件中没有,书中有,或者参考网上例子.
HelloServiceProperties.java
HelloService.java
HelloServiceAutoConfiguration.java
在spring.factories中追加配置文件.

Spring Boot自动配置详解(有例子),作者模拟写了一个

7.Spring Boot的Web开发

8.Spring Boot的数据访问

9.Spring Boot的企业级开发

10.Spring Boot开发部署与测试

11.Spring 应用监控

Spring Boot有四大神器,分别是auto-configuration、starters、cli、actuator

12.分布式系统开发

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值