spring-boot 是如何實現自動配置的

spring-boot 實現了零配置集成組件,若是須要使用jpa,引入對應的starter,就在項目中自動配置好了。java

IOC容器中的條件Bean

spring從4.0開始支持條件bean,當判斷條件爲true時,bean的定義纔有效。linux

先看看條件bean的定義:spring

@Configuration
class MyConfiguration {

@Bean(name = "emailerService")
@Conditional(WindowsCondition.class)
public EmailService windowsEmailerService() {
    return new WindowsEmailService();
}


@Bean(name = "emailerService")
@Conditional(LinuxCondition.class)
public EmailService linuxEmailerService() {
    return new LinuxEmailService();
}

}

    上面代碼是兩個條件bean的定義,兩個bean有相同的類型,一個在Windows下有效,一個在Linux下有效。windows

class WindowsCondition implements Condition {
 
	@Override
	public boolean matches(ConditionContext context,        AnnotatedTypeMetadata metadata) {
		return context.getEnvironment().getProperty("os.name").contains("Windows");
	}
}
 
class LinuxCondition implements Condition {
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return context.getEnvironment().getProperty("os.name").contains("Linux");
	}
}
 

    在IOC加載bean定義的時候,會執行@Conditional註解指定的Condition,當Condition爲true的時候該bean纔有效,上面代碼是兩個實現了Condition接口的類,分別根據配置os.name是Windows仍是Linux判斷是否爲true。springboot

springboot中的條件bean,顧名思義

  • @ConditionalOnClass   @ConditionalOnMissingClass
  • @ConditionalOnBean @ConditionalOnMissingBean
  • @ConditionalOnProperty
  • @ConditionalOnResource
  • @ConditionalOnWebApplication and @ConditionalOnNotWebApplication
  • @ConditionalOnExpression

 

定義Java配置的bean(在指定條件下才有效)

@Configuration
@ConditionalOnBean(DataSource.class)
@ConditionalOnClass(JpaRepository.class)
@ConditionalOnMissingBean({ JpaRepositoryFactoryBean.class,
JpaRepositoryConfigExtension.class })
@ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@Import(JpaRepositoriesAutoConfigureRegistrar.class)
@AutoConfigureAfter(HibernateJpaAutoConfiguration.class)
public class JpaRepositoriesAutoConfiguration {


}

以上爲JPA的自動配置ide

  1. @ConditionalOnBean(DataSource.class):在容器中有DataSource實例的時候有效
  2. @ConditionalOnClass(JpaRepository.class):在classpath中有JpaRepository這個類的時候有效spring-boot

  3. 。。。spa

自動導入AutoConfiguration

在META-INF/spring.factories中添加配置:code

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\

spring-boot會自動掃描全部classpath下的META-INF/spring.factories,找到org.springframework.boot.autoconfigure.EnableAutoConfiguration對應的value,並導入value對應的配置。接口

相關文章
相關標籤/搜索