spring 组件应用(二)spring.factories 文件带你写自己的spring 框架组件

324 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

小编最近在写一个公司内部使用的公共组件,但是呢其他组同事在配置的时候又不能有太多的侵入性编码,所以想知道像 myabtis-plus spring boot 组件是怎么开发的,简单说如何自己实现类似 Spring Boot Starter,让Starter的使用只需要很少或者不需要进行配置,只需要在服务中引入我们的jar包即可。

代码分析

这时候其实非常感谢强大的 idea,只需要在MybatisAutoConfiguration一点就行

image.png

那么此时有两种可疑点spring.factoriesspring-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 一小部分功能,更多玩法 可以参考 官方文档