spring-boot 實現了零配置集成組件,若是須要使用jpa,引入對應的starter,就在項目中自動配置好了。java
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
@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
@ConditionalOnClass(JpaRepository.class):在classpath中有JpaRepository這個類的時候有效spring-boot
。。。spa
在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對應的配置。接口