Spring Boot中的@EnableAutoConfiguration原理

自动配置好像是魔术。其实,它就是将检查类路径classpath中的依赖关系,并且在某些情况下它会配置某些东西,比如当它检测到数据库驱动程序时,就会配置数据库。

  Spring Boot在启动时,它会扫描类路径,查找 位于META-INF目录中名为spring.factories的所有文件,并对其进行处理。通常,这些文件包含键org.springframework.boot.autoconfigure.EnableAutoConfiguration =,其值设置为通常@Configurtion类的列表,它会检查每个@Configurtion是否应该包含它并最终使用它。

比如我们在pom.xml中配置:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

h2是一个内存数据库,然后我们希望通过JPA使用它,再配置一下JPA:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

然后你声明一个接口类,注意是接口,不是普通类:

public interface ApplicantRepository extends JpaRepository<Applicant, Long> {

}

这样,你就可以通过下面save命令保存数据到H2中。

applicantRepository.save(applicant);

首先,Spring Boot会类路径中搜索带@Configuration注释的类,也就是说,pom.xml配置的JPA和H2这两个Jar包中带有@Configuration注释。

所以,使用@EnableAutoConfiguration就像使用@Configuration注释一样。它根据我们在@Configuration注释的配置类中定义的@Bean方法配置进行自动wire配对(依赖注入配对)。

Spring Boot对于每个找到的类,它会使用各种注释进行评估,如@Conditional,如果特定配置应该被包含,那么将其添加到Spring Context中。

@EnableAutoConfiguration还执行其他配置,包括配置/调用帮助程序组件(如Web应用程序中的嵌入式tomcat)。此机制基于类路径中可用的jar依赖项工作。jar通常通过启动器依赖项提供(前面pom.xml中JPA和H2配置的就是这两个组件的启动器starter) ,但这不是绝对的要求。这两件事(启动器和自动配置)并不依赖于彼此。

我们可以为我们自己的库使用相同的机制,即所谓的启动器Starter ,为你的lib提供了一个配置类,负责设置你的东西,并使用条件注释来决定何时应该包含它。

下面看看@Configuration具体应用:

@Configuration
public class EnabledAutoConfigExample {

   @Bean
   public MyBean myBean () {
      return new MyBean();
   }
 
}

在这个配置类里面,我们生成了两个@Bean,MyBean的实例在其他地方会需要,我们在这里准备好,以供别人通过@autowired使用它,因为配置类本身被注册为Spring容器的bean。

这段等同于:

<bean name="myBean" class="spring.example.MyBean"/>

配置类所有方法都会在多次调用时返回相同的实例(如果它们是单例作用域,这是默认作用域)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值