小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
小编最近在写一个公司内部使用的公共组件,但是呢其他组同事在配置的时候又不能有太多的侵入性编码,所以想知道像 myabtis-plus spring boot 组件是怎么开发的,简单说如何自己实现类似 Spring Boot Starter,让Starter的使用只需要很少或者不需要进行配置,只需要在服务中引入我们的jar包即可。
代码分析
这时候其实非常感谢强大的 idea,只需要在MybatisAutoConfiguration一点就行
那么此时有两种可疑点spring.factories和 spring-autoconfigure-metadata.properties
只要大家自己去看看就知道了,关键是spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
这句话就能把我们自定义的组件引入进来
现在来验证下
准备基本代码
这是最简单的一个 Configuration
@Configuration
public class WeworkAutoConfiguration {
public WeworkAutoConfiguration() {
System.out.println("初始化啦。。。。。。");
}
}
spring.factories 文件如下
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.weworksdk.framework.config.WeworkAutoConfiguration
然后 mvn clean install
在另外一个项目中引入pom 文件引入pom,
<dependency>
<groupId>com.oo.sdk</groupId>
<artifactId>wework-sdk</artifactId>
<version>0.0.1</version>
</dependency>
启动项目就可以看到 初始化啦。。。。。。 代表 WeworkAutoConfiguration 被spring 识别并注入
只要这个类被识别到之后,我们就可以在这类中引入其他的bean
可以参考MybatisAutoConfiguration
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
if (StringUtils.hasText(this.properties.getConfigLocation())) {
factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
}
applyConfiguration(factory);
if (this.properties.getConfigurationProperties() != null) {
factory.setConfigurationProperties(this.properties.getConfigurationProperties());
}
if (!ObjectUtils.isEmpty(this.interceptors)) {
factory.setPlugins(this.interceptors);
}
if (this.databaseIdProvider != null) {
factory.setDatabaseIdProvider(this.databaseIdProvider);
}
if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
}
if (this.properties.getTypeAliasesSuperType() != null) {
factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
}
if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
}
if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
factory.setMapperLocations(this.properties.resolveMapperLocations());
}
return factory.getObject();
}
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
ExecutorType executorType = this.properties.getExecutorType();
if (executorType != null) {
return new SqlSessionTemplate(sqlSessionFactory, executorType);
} else {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
总结
这只是 spring.factories 一小部分功能,更多玩法 可以参考 官方文档