相较于Spring @import 加载Bean,使用SpringBoot 的SPI 机制可以更灵活的加载、配置一个Bean,于是我搜集了一下常见框架对于Spring.factories 中Bean 的配置,用来参考学习。
dubbo
DubboRelaxedBinding2AutoConfiguration
dubbo-spring-boot-autoconfigure-2.7.7.jar!/META-INF/spring.factories
@Configuration
@ConditionalOnProperty(
prefix = "dubbo",
name = {"enabled"},
matchIfMissing = true
)
@ConditionalOnClass(
name = {"org.springframework.boot.context.properties.bind.Binder"}
)
@AutoConfigureBefore({DubboRelaxedBindingAutoConfiguration.class})
public class DubboRelaxedBinding2AutoConfiguration {
……
}
DubboAutoConfiguration
dubbo-spring-boot-autoconfigure-compatible-2.7.7.jar!/META-INF/spring.factories
@ConditionalOnProperty(
prefix = "dubbo",
name = {"enabled"},
matchIfMissing = true
)
@Configuration
@AutoConfigureAfter({DubboRelaxedBindingAutoConfiguration.class})
@EnableConfigurationProperties({DubboConfigurationProperties.class})
@Import({ServiceBeanIdConflictProcessor.class})
public class DubboAutoConfiguration {
……
}
MyBatis
MybatisAutoConfiguration
mybatis-spring-boot-autoconfigure-2.1.3.jar!/META-INF/spring.factories
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
……
}
Druid
DruidDataSourceAutoConfigure
druid-spring-boot-starter-1.1.22.jar!/META-INF/spring.factories
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
......
}
DynamicDatasource
DynamicDataSourceAutoConfiguration
dynamic-datasource-spring-boot-starter-3.1.0.jar!/META-INF/spring.factories
@Slf4j
@Configuration
@AllArgsConstructor
@EnableConfigurationProperties(DynamicDataSourceProperties.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@Import(value = {DruidDynamicDataSourceConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class})
@ConditionalOnProperty(prefix = DynamicDataSourceProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
public class DynamicDataSourceAutoConfiguration {
......
}
出现频率高的几个注解
ConditionalOnProperty
@ConditionalOnProperty( prefix = "dubbo", name = {"enabled"}, matchIfMissing = true )
作用是判断一个Property属性,是否符合我们的条件,符合则让该注解修饰的类或者方法生效,否则不生效. 我们在Spring Boot中可以通过@ConditionalOnProperty来控制Configuration配置类是否生效
ConditionalOnClass/ConditionalOnSingleCandidate
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
ConditionalOnClass 表示指定class 存在时,Bean才会被创建。ConditionalOnSingleCandidate 表示指定的class 实例只有一个时,Bean才会被创建
AutoConfigureBefore/AutoConfigureAfter
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
表示指定的class 会在Bean加载之前(Before)或之后(After)被加载
EnableConfigurationProperties
@EnableConfigurationProperties({MybatisProperties.class})
用springboot开发的过程中,我们会用到 @ConfigurationProperties注解,主要是用来把properties或者yml配置文件转化为bean来使用的,而 @EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。
Import
@Import({DruidSpringAopConfiguration.class,})
加载创建指定的class,如果当前Bean 不被加载的话,Import 指定的class也不会被加载创建