spring-boot 是如何实现自动配置的

spring-boot 实现了零配置集成组件,如果需要使用jpa,引入对应的starter,就在项目中自动配置好了。

IOC容器中的条件Bean

spring从4.0开始支持条件bean,当判断条件为true时,bean的定义才有效。

先看看条件bean的定义:

@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下有效。

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中的条件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的自动配置

  1. @ConditionalOnBean(DataSource.class):在容器中有DataSource实例的时候有效
  2. @ConditionalOnClass(JpaRepository.class):在classpath中有JpaRepository这个类的时候有效

  3. 。。。

自动导入AutoConfiguration

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

# 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对应的配置。

转载于:https://my.oschina.net/u/3721968/blog/1563644

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值