源码仓库Gitee · GitHubSpringBootApplicationSpringBootApplication表示SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类SpringBoot就运行这个类的main方法来启动应用SpringBootApplication是组合注解Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited SpringBootConfiguration EnableAutoConfiguration ComponentScan(excludeFilters { Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class), Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) }) public interface SpringBootApplication { ........ }SpringBootConfiguration表示是一个SpringBoot的配置类Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Configuration public interface SpringBootConfiguration { }ConfigurationSpring定义的注解标注在类上表示这是个配置类使用注解定义配置类来取代配置文件配置类也是容器中的一个组件Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Configuration { AliasFor( annotation Component.class ) String value() default ; }EnableAutoConfiguration开启自动配置功能AutoConfigurationPackage Import(AutoConfigurationImportSelector.class) public interface EnableAutoConfiguration { ....... }AutoConfigurationPackage自动配置包Spring的底层注解Import表示给容器导入一个组件Import(AutoConfigurationPackages.Registrar.class) public interface AutoConfigurationPackage {}Registrar.classnew PackageImports(metadata).getPackageNames().toArray(new String[0])获得注解类SpringBootApplication所在的包名把包下面的所有类都注册到Spring容器中供后续进行实例化Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0])); }AutoConfigurationImportSelector.class给容器导入组件的自动配置类并配置好这些组件有了自动配置类就免去了手动编写配置注入功能组件等操作Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationEntry autoConfigurationEntry getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes getAttributes(annotationMetadata); //获得所有组件的自动配置类包括mq的RabbitAutoConfiguration、redis的RedisAutoConfiguration等等 ListString configurations getCandidateConfigurations(annotationMetadata, attributes); configurations removeDuplicates(configurations); SetString exclusions getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations getConfigurationClassFilter().filter(configurations); fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationEntry(configurations, exclusions); } protected ListString getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { ListString configurations SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); Assert.notEmpty(configurations, No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.); return configurations; } public static final String FACTORIES_RESOURCE_LOCATION META-INF/spring.factories; //loadFactoryNames调用了loadSpringFactories(),它加载了spring.factories配置的信息根据Map键值对获取信息然后导入到容器中在spring-boot-autoconfigure-2.3.0.RELEASE.jar中定义了文件 public static ListString loadFactoryNames(Class? factoryType, Nullable ClassLoader classLoader) { String factoryTypeName factoryType.getName(); return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList()); }比如MVC的自动配置就使用了WebMvcAutoConfiguration类下面的代码就是给容器添加了视图解析器Configuration ConditionalOnWebApplication ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) ConditionalOnMissingBean(WebMvcConfigurationSupport.class) AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE 10) AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration { Bean ConditionalOnBean(View.class) ConditionalOnMissingBean public BeanNameViewResolver beanNameViewResolver() { BeanNameViewResolver resolver new BeanNameViewResolver(); resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 10); return resolver; } }Configuration表示这是一个配置类IOC会进行CGLIB代理ConditionalOnWebApplicationSpring底层Conditional注解Spring注解版根据不同的条件如果满足指定的条件整个配置类里面的配置就会生效 判断当前应用是否是web应用如果是当前配置类生效Target({ ElementType.TYPE, ElementType.METHOD }) Retention(RetentionPolicy.RUNTIME) Documented Conditional(OnWebApplicationCondition.class) public interface ConditionalOnWebApplication { }ConditionalOnClass判断当前项目有没有类Servlet服务器类DispatcherServlet前端控制器WebMvcConfigurerAdapterMVC配置适配器ConditionalOnMissingBean保证IOC容器中只有一个WebMvcConfigurationSupport类型的beanAutoConfigureOrder加载的优先级别AutoConfigureAfter在DispatcherServletAutoConfiguration, ValidationAutoConfiguration 类加载后进行装配。WebMvcAutoConfiguration中有3个内部类WebMvcAutoConfigurationAdapter、EnableWebMvcConfiguration、ResourceChainCustomizerConfiguration其中WebMvcAutoConfigurationAdapter声明在WebMvcAutoConfiguration中,是为了确保当该类不在类路径下时不会被读取到其中EabaleConfigurationProperties是将配置文件中的值和对应的Bean类进行绑定并将对应的Bean类加载到IOC容器中EnableWebMvcConfiguration配置类相当于EnableWebMvc的功能对 spring mvc 进行自动化配置比如EnableConfigurationProperties往IOC容器加载了 WebMvcProperties类该类通过ConfigurationProperties注解将配置文件和自身属性进行绑定到WebMvcProperties类中如下图application.propertis声明的spring.mvc.view.suffix就是通过ConfigurationProperties和setPrefix进行绑定到WebMvcProperties类的总结SpringBootApplication注解导入了两个类SpringBootConfiguration和EnableAutoConfiguration前者表示一个配置类后者进行自动装配其中EnableAutoConfiguration注解有两个功能AutoConfigurationPackage自动导入包将SpringBootApplication所在的包名下的所有类都注册到Spring容器中供后续进行实例化AutoConfigurationImportSelector给容器导入组件的自动配置类并配置好这些组件最终每个自动配置类通过EnableConfigurationProperties({xxx.class})导入配置类并把配置类加入到IOC容器中其中配置类的属性值配置是通过ConfigurationProperties(prefix xxx)和setXX方法将配置文件的值进行绑定ConfigurationProperties批量注入配置文件中的属性值默认从全局配置文件中获取在配置文件yml或properties定义值使用该注解给配置类赋值//application.properties //可使用$占位符定义值比如person.name张三${random.int},person.maps.k2${person.name}_v2${person.name:hello}表示person_name没有定义则使用默认值hello //结果name为张三12afa124,k2为张三12afa124_v2 person.name张三 person.age11 person.maps.k1v1 person.maps.k2v2 person.lista,b //定义配置类并加入容器中将上面的值按照键值对一一赋值 Component ConfigurationProperties(prefix person) public class Person { private String name; private Integer age; private MapString,Object maps; private ListString list; }ConfigurationProperties和Value对比ConfigurationProperties批量注入文件的属性值Value一个个指定ConfigurationProperties支持松散绑定(person.lastNameperson.last_nameperson.last-namePERSON_LAST_NAME)Value不支持ConfigurationProperties不支持SpELValue支持比如Value(#{10})ConfigurationProperties支持JSR303数据校验比如在配置类上添加Validated然后在属性上添加Email它表示属性值必须符合Email格式Value不支持同时也不支持复杂类型封装比如Map如果需要JavaBean和配置文件值进行映射使用ConfigurationProperties如果是单个值使用ValuePropertySource表示加载指定路径的配置文件PropertySource(value {classpath:person.properties})ImportResource导入Spring的配置文件让配置文件里面的内容生效比如我们写了bean.xml里面使用bean创建了一个实例但没有加入容器中ImportResource(locations {classpath:bean.xml})使用Configuration和Bean来给容器添加组件代替上面的xml文件中方式Configuration public class MyConfiguration { Bean public HelloService helloService(){ return new HelloService(); } }自动配置原理SpringBoot启动加载主配置类(SpringBootApplication)开启了自动配置功能(EnableAutoConfiguration)自动配置使用了Import(AutoConfigurationImportSelector.class)导入了组件可查看getAutoConfigurationEntry()的getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)返回的集合即候选的配置SpringFactoriesLoader.loadFactoryNames()扫描所有jar包路径下的META-INF/spring.factories把扫描到的文件的内容包装成properties对象从properties中获取到EnableAutoConfiguration.class类对应的值然后把它们添加到容器中#spring-boot-autoconfigure-2.3.0.RELEASE.jar中spring.factories的信息EnableAutoConfiguration后面每个xxxAutoConfiguration都是一个组件都加入到容器中 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\ org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\ org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\ org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\ org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\ org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\ org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration每一个自动配置类进行自动配置以HttpEncodingAutoConfiguration为例Configuration(proxyBeanMethods false)//表示这是一个配置类 EnableConfigurationProperties(ServerProperties.class)//启动指定类的ConfigurationProperties功能将配置文件中对应的值和ServerProperties绑定起来然后加入到IOC容器中 ConditionalOnWebApplication(type ConditionalOnWebApplication.Type.SERVLET)//Spring底层Conditional注解根据不同的条件如果满足指定的条件整个配置类里面的配置就会生效判断当前应用是否是web应用如果是当前配置类生效 ConditionalOnClass(CharacterEncodingFilter.class)//判断当前项目有没有这个CharacterEncodingFilter类SpringMVC中进行乱码解决的过滤器 ConditionalOnProperty(prefix server.servlet.encoding, value enabled, matchIfMissing true)//判断配置文件中是否存在某个配置server.servlet.encoding如果不存在判断也是成立的 public class HttpEncodingAutoConfiguration { private final Encoding properties;//已经和SpringBoot的配置文件映射了即ServerProperties中的Encoding对象 //只有一个有参构造器的情况下参数的值从容器中拿即EnableConfigurationProperties(ServerProperties.class) public HttpEncodingAutoConfiguration(ServerProperties properties) { this.properties properties.getServlet().getEncoding();//从ServerProperties中获取Encoding对象并进行实例化 } Bean //给容器中添加一个组件CharacterEncodingFilter ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name());//从properties中获取值并赋值 filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE)); return filter; } } //从配置文件中获取指定的值和bean的属性进行绑定所有在配置文件中能配置的属性都是在xxxProperties类中封装着配置文件能配置什么参数就参照该功能对应的属性类 ConfigurationProperties(prefix server, ignoreUnknownFields true) public class ServerProperties {}一旦这个自动配置类生效就会给容器添加各种组件Bean这些组件的属性是从对应的properties类中获取的每个properties类里面的每一个属性又是和配置文件绑定的Conditional派生注解作用在某个类上表示必须是Condition指定的条件成立才会给容器中添加组件配置类里面的内容才生效通过配置文件里面的debugtrue在控制台打印出自动配置的启动和没有启用的报告进行查看 CONDITIONS EVALUATION REPORT条件评估报告 Positive matches:(自动配置类启用的) ----------------- AopAutoConfiguration matched: - ConditionalOnProperty (spring.aop.autotrue) matched (OnPropertyCondition) ........... Negative matches:(自动配置类没有启用的) ----------------- ActiveMQAutoConfiguration: Did not match: - ConditionalOnClass did not find required class javax.jms.ConnectionFactory (OnClassCondition) ...........