结论
@EnableAutoConfiguration
作用:从classpath
中搜索所有META-INF/spring.factories
配置文件,然后将@EnableAutoConfiguration
的全路径org.springframework.boot.autoconfigure.EnableAutoConfiguration
作为key
,对应的配置项的全路径(带有@Configuration
注解的类)为value
,配置项会被注册到Spring
容器中。
@EnableAutoConfiguration
中有String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"
属性,这个属性可以配置在application.yml
中,默认为true
,即开启特性,可以配置为false
,关闭特性。
注意:如果配置类在本项目中,如果使用了@SpringBootApplication注解,那么不需要META-INF/spring.factories文件,如果仅仅使用@EnableAutoConfiguration,那么需要创建文件;如果是引用其他模块,不管用@SpringBootApplication还是@EnableAutoConfiguration,都需要META-INF/spring.factories文件。
验证结论
- 创建两个项目
A
、B
,A
引用B
- 在
B
中创建配置类 A
中有启动类,启动类上使用@EnableAutoConfiguration
- 启动观察是否报错
A 项目
// 启动类,仅使用 EnableAutoConfiguration 也可以启动
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
System.out.println(context.getBean(Runnable.class));
context.close();
}
}
// pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- B 项目 -->
<dependency>
<groupId>spring-boot</groupId>
<artifactId>boot-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
B 项目
// 配置类
@Configuration
public class RunnableConfiguration {
@Bean
public Runnable createRunnable() {
return () -> {
};
}
}
// pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
</dependencies>
运行时抛出异常
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Runnable' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090)
at com.p7.boot.enableauto.App.main(App.java:18)
为什么?
前面有讲:@EnableAutoConfiguration
的作用是从classpath
中搜索所有META-INF/spring.factories
配置文件,然后将@EnableAutoConfiguration
的全路径org.springframework.boot.autoconfigure.EnableAutoConfiguration
作为key
,对应的配置项的全路径为value
,配置项会被注册到Spring
容器中。
注意:如果配置类在本项目中,如果使用了@SpringBootApplication注解,那么不需要META-INF/spring.factories文件,如果仅仅使用@EnableAutoConfiguration,那么需要创建文件;如果是引用其他模块,不管用@SpringBootApplication还是@EnableAutoConfiguration,都需要META-INF/spring.factories文件。
解决方案
在 B
模块的resources
下创建Folder
文件夹,命名为META-INF
,创建spring.factories
文件,内容如下:
// org.springframework.boot.autoconfigure.EnableAutoConfiguration 是 @EnableAutoConfiguration 注解的全路径
// com.p7.core.RunnableConfiguration 是 B 模块的配置项
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.p7.core.RunnableConfiguration