专栏首页Linyb极客之路springboot实战之自定义自动配置

springboot实战之自定义自动配置

前言

在我们开发的过程中,有时候为了让开发人员更好的进行业务逻辑开发,我们可能会定制开发一个个组件,并起开箱即用的效果。有玩过springboot的朋友可能知道,springboot提供了一系列的starter,这个starter很像就是可插拔的组件,它能够实现自动配置,达到开箱即用,很好的降低了使用框架时的复杂度,让开发人员更容易的使用。今天我们就演示一下如何通过自定义stater来实现一个简单的自动配置例子

自定义starter

1、创建autoconfigure模块项目

这个项目包含需要自动配置的代码逻辑

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

2、另开一个项目,新建一个starter项目

这个项目只用来做依赖导入,可以是一个空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>

3、编写一个引入自定义的starter的项目测试

其测试代码可查看如下链接

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

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate-autoconfigure https://github.com/lyb-geek/springboot-learning/tree/master/springboot-dbtemplate-starter

本文分享自微信公众号 - Linyb极客之路(gh_c420b2cf6b47),作者:linyb极客之路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot实战之总结篇

    springboot实战系列暂时先更新到这边,下边是对之前springboot实战文章做一个汇总

    lyb-geek
  • springcloud hystrix dashboard使用

    lyb-geek
  • 工作流引擎之activiti会签功能实现

    在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务。这种业务需求很常见,如一个请款单,领导审批环节中,就需要...

    lyb-geek
  • 如何为一组任务确定计划,估计每个任务所需的时间?

    张树臣
  • Spring Cloud 之 Config与动态路由.

     Spring Cloud Confg 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式...

    JMCui
  • Spring Cloud Config

    /{label}/{name}-{profiles}.yml /{name}-{profiles}.yml name git的文件名称不包括后缀 profiles ...

    HUC思梦
  • mybatis的接口实现操作数据库

            测试项目结构如图所示:其中UserDao.java为一个接口,以后的userMapper.xml的配置就是围绕这个接口类展开的:       ...

    yawn
  • JVM的垃圾收集器策略

    程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存...

    大大大大大先生
  • iOS开发中利用dispatch group实现并发多任务

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • Leetcode 429. N-ary Tree Level Order Traversal

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn....

    Tyan

扫码关注云+社区

领取腾讯云代金券