SpringBoot的@EnableAutoConfiguration注解的深入分析

结论

    @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文件。

验证结论

  1. 创建两个项目ABA引用B
  2. B中创建配置类
  3. A中有启动类,启动类上使用@EnableAutoConfiguration
  4. 启动观察是否报错
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

猜你喜欢

转载自blog.csdn.net/qq_30038111/article/details/80200371
今日推荐