在我们开发的过程中,有时候为了让开发人员更好的进行业务逻辑开发,我们可能会定制开发一个个组件,并起开箱即用的效果。有玩过springboot的朋友可能知道,springboot提供了一系列的starter,这个starter很像就是可插拔的组件,它能够实现自动配置,达到开箱即用,很好的降低了使用框架时的复杂度,让开发人员更容易的使用。今天我们就演示一下如何通过自定义stater来实现一个简单的自动配置例子
这个项目包含需要自动配置的代码逻辑
1.1 pom.xml引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>com.github.lybgeek</groupId>
<artifactId>springboot-dbtemplate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>provided</scope>
</dependency>
其中spring-boot-configuration-processor这个jar,可以让我们在编写application.properties/yml会有智能提示,形如下
springboot-dbtemplate为需要自动配置的具体功能模块,具体实现可以查看
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate
1.2 编写starter自动化配置
@ConfigurationProperties(prefix = "db")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DbProperties {
/**
* if you want to use a dbTempate to operate datasouce,dbTemplateEnabled must be true,default false
*/
private boolean dbTemplateEnabled = false;
/**
* jdbc driverClassName must can not be null
*/
private String driverClassName;
/**
* datasource password must can not be null
*/
private String password;
/**
* datasource username must can not be null
*/
private String username;
/**
* datasource url must can not be null
*/
private String url;
}
@Configuration
@Slf4j
@EnableConfigurationProperties(DbProperties.class)
@ConditionalOnProperty(name="db.db-template-enabled",havingValue = "true")
public class DbTemplateAutoConfiguration {
@Autowired
private DbProperties dbProperties;
@Bean
@ConditionalOnMissingBean(value= DbTemplate.class)
public DbTemplate dbTemplate(){
DbTemplate dbTemplate = new DbTemplate(new QueryRunner(),dataSource());
return dbTemplate;
}
@Bean
@ConditionalOnMissingBean(value= DataSource.class)
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(dbProperties.getDriverClassName());
dataSource.setUrl(dbProperties.getUrl());
dataSource.setUsername(dbProperties.getUsername());
dataSource.setPassword(dbProperties.getPassword());
return dataSource;
}
}
1.3 自定义spring.factories
在src/main/resource目录下创建META-INF目录,并在目录内添加文件spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.lybgeek.autoconfigure.dbtemplate.DbTemplateAutoConfiguration
这个项目只用来做依赖导入,可以是一个空jar文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或其它类库,因此可以建一个只含pom.xml文件,不含其它内容的maven项目。其pom.xml内容形如下
<dependencies>
<dependency>
<groupId>com.github.lybgeek</groupId>
<artifactId>springboot-dbtemplate-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.lybgeek</groupId>
<artifactId>springboot-dbtemplate</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
其测试代码可查看如下链接
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate-test
当你需要实现可插拔、按需集成、开箱即用的组件,可以考虑下模仿一下springboot的starter。另外为了和整个系列的springboot实战项目名称命名统一,所有的项目名称统一都以springboot为前缀打头,因此就没按官方推荐的命名来写starter。官方推荐starter的命名方式是
官方starter都是spring-boot-starter-*,外部的自定义starter推荐使用*-spring-boot-starter
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate-autoconfigure https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate-starter