springboot 自定义启动器的实现

 更新时间:2023年02月01日 15:20:17   作者:不会叫的狼  
本文主要介绍了springboot 自定义启动器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

创建自定义启动器

0、项目总览

1、创建项目,引入依赖

创建项目 spring-boot-jdbc-starter,引入依赖,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.shwen</groupId>
  <artifactId>spring-boot-jdbc-starter</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>spring-boot-jdbc-starter</name>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <!--引入spring‐boot‐starter;所有starter的基本配置-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!--自动配置连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>

    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

</project>

启动器支持多种数据源,例如:C3P0和Druid,根据配置的type进行选择。此处我们引用两个连接池依赖,一个是C3P0,一个是Druid。

2、创建属性配置类

package com.shwen.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.jdbc.datasource")
public class DataSourceProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "DataSourceProperties{" +
                "driverClassName='" + driverClassName + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

属性配置类注入 application.yml 文件中的配置信息。

3、创建自动配置类

package com.shwen.autoconfig;

import ...
import javax.sql.DataSource;

@SpringBootConfiguration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    @Autowired
    private DataSourceProperties dataSourceProperties ;

    @Bean
    @ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid")
    public DataSource createDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
        dataSource.setUrl(dataSourceProperties.getUrl());
        dataSource.setUsername(dataSourceProperties.getUsername());
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }

    @Bean
    @ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "c3p0")
    public DataSource createC3P0DataSource() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(dataSourceProperties.getDriverClassName());
        dataSource.setJdbcUrl(dataSourceProperties.getUrl());
        dataSource.setUser(dataSourceProperties.getUsername());
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }
}
  • 如果配置文件中配置了spring.jdbc.datasource.type=c3p0,使用 c3p0 数据源。
  • 如果配置文件中配置了spring.jdbc.datasource.type=druid,使用 druid 数据源。

此处使用条件选择实现,@ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid") 根据配置文件中的 type 值进行条件选择创建不同的 DataSource

4、创建自动配置属性文件

resource文件夹下面新建 META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.shwen.autoconfig.DataSourceAutoConfiguration

注意要执行 install ,安装项目。

使用自定义启动器

1、springboot_01 项目引入自定义启动器

pom文件:

<dependency>
  <groupId>com.shwen</groupId>
  <artifactId>spring-boot-jdbc-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

2、配置连接池信息

application.yml

配置文件配置 type 指定需要创建的数据源,此处指定数据源为druid,并且配置连接属性信息。

3、注入属性测试

@RestController
public class HelloController {

    @Autowired
    private DataSource dataSource;

    @RequestMapping(path = "/hello2")
    public String sayHello2() throws SQLException {
        System.out.println(dataSource.getClass());
        
        DruidDataSource dds = (DruidDataSource) dataSource;
        System.out.println(dds.getPassword());
        return "hello spring boot";
    }
}

注入DataSource,查看连接池属性。

访问 http://127.0.0.1:8080/hello2,打印结果:

小结

通过编写自定义启动器,我们更加理解springboot自动配置原理。springboot项目启动后,

  • 会读取所有依赖的 jar 包下面 META-INF/spring.factories 文件,而该文件配置了自动配置类,将 spring.factories 中的配置类的全名称获取到,并且根据加载条件来加载项目所需要的类。
  • 通过反射实例化标注了@Configuration的 IOC容器配置类,然后汇总并加载到 IOC 容器。当收集到所有在 spring.factories 中指定的bean后,再通过@Import注解将其导入进容器。
  • @ConfigurationProperties注解会读取配置文件 application.yml 里面属性,将读到的值绑定到被注解类的属性。然后,@EnableConfigurationProperties将属性配置类注入到 IOC 容器中,这样当项目需要配置信息的时候可以直接从容器中去取。
  • 至此,依赖的 jar 包中自动配置类注入成功,项目可以直接通过@Autowired装配使用。

到此这篇关于springboot 自定义启动器的实现的文章就介绍到这了,更多相关springboot 自定义启动器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解jeefast和Mybatis实现二级联动的问题

    详解jeefast和Mybatis实现二级联动的问题

    这篇文章主要介绍了详解jeefast和Mybatis实现二级联动的问题,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringMVC上传图片代码实例

    SpringMVC上传图片代码实例

    这篇文章主要介绍了SpringMVC上传图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java如何用递归方法求阶乘

    java如何用递归方法求阶乘

    这篇文章主要介绍了java 用递归方法求阶乘的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Feign 日期格式转换错误的问题

    Feign 日期格式转换错误的问题

    这篇文章主要介绍了Feign 日期格式转换错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 一个JAVA小项目--Web应用自动生成Word

    一个JAVA小项目--Web应用自动生成Word

    前段时间接到一个Web应用自动生成Word的需求,现整理了下一些关键步骤拿来分享一下。
    2014-05-05
  • Java实现权重随机算法详解

    Java实现权重随机算法详解

    平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的。本文就详细来介绍如何实现,感兴趣的可以了解一下
    2021-07-07
  • Java如何实现双向链表功能

    Java如何实现双向链表功能

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表
    2021-11-11
  • mybatis-plus分页查询三种方法小结

    mybatis-plus分页查询三种方法小结

    本文主要介绍了mybatis-plus分页查询三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 基于Java接口回调详解

    基于Java接口回调详解

    这篇文章主要介绍了Java接口回调详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论