springboot 自定义启动器的实现

目录
  • 创建自定义启动器
    • 0、项目总览
    • 1、创建项目,引入依赖
    • 2、创建属性配置类
    • 3、创建自动配置类
    • 4、创建自动配置属性文件
  • 使用自定义启动器
    • 1、springboot_01 项目引入自定义启动器
    • 2、配置连接池信息
    • 3、注入属性测试
  • 小结

创建自定义启动器

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 自定义启动器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot自定义启动器Starter流程详解

    目录 一.背景 二.自定义启动器 1.创建一个启动器的自动配置模块 2.创建一个启动器模块 3.在业务模块中引入启动器 一.背景 虽然Spring官方给我们提供了很多的启动器供我们使用 但有时候我们也会遇到某些特殊场景,这些启动器满足不了 这个时候就需要自定义一个启动器供我们使用 二.自定义启动器 在之前学习Spring Boot的过程中,我们已经对启动器有了一个大致的了解 Spring Boot实现某个功能,一般是引入对应场景的启动器(一般不写代码,只是声明这个启动器需要引用哪些依赖),然后这

  • SpringBoot居然有44种应用启动器,你都知道吗

    啥是应用启动器?SpringBoot集成了spring的很多模块,比如tomcat.redis等等.你用SpringBoot搭建项目,只需要在pom.xml引入相关的依赖,和在配置文件中简单的配置就可以使用相应模块了. 非常方便,spring boot集成了哪些启动器呢? SpringBoot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring-boot-starter-a

  • springboot 场景启动器使用解析

    这篇文章主要介绍了springboot 场景启动器使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 为什么springboot不需要我们去配置那么繁琐的东西? 我们直接看pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmln

  • SpringBoot自定义starter启动器的实现思路

    目录 一.引言 二. 需求说明 三. 设计思路 四. 实现步骤 1. Step1 业务定义 2. Step2 自动配置 2.1 HelloService类 2.2 HelloProperties类 2.3 HelloServiceAutoConfiguration类 3. Step3 工厂文件 4. Step4 安装 5. Step5 引入使用 5.1 在应用中添加自定义starter依赖坐标 5.2 编写配置信息 5.3 编写测试的Controller 5.4 打开浏览器输入Controlle

  • 手动构建springBoot启动器过程图解

    我们都知道可以使用SpringBoot快速的开发基于Spring框架的项目.由于围绕SpringBoot存在很多开箱即用的Starter依赖,使得我们在开发业务代码时能够非常方便的.不需要过多关注框架的配置,而只需要关注业务即可. 其实springboot的一个启动器基本上就包含两个项目,一个是spring-boot-starter,另一个是spring-boot-autoConfigure 举个Json启动器的例子,这里面包含了josn的starter和autoConfiger,因为autoC

  • springboot 自定义启动器的实现

    目录 创建自定义启动器 0.项目总览 1.创建项目,引入依赖 2.创建属性配置类 3.创建自动配置类 4.创建自动配置属性文件 使用自定义启动器 1.springboot_01 项目引入自定义启动器 2.配置连接池信息 3.注入属性测试 小结 创建自定义启动器 0.项目总览 1.创建项目,引入依赖 创建项目 spring-boot-jdbc-starter,引入依赖,pom文件如下: <?xml version="1.0" encoding="UTF-8"?&

  • springboot自定义starter启动器的具体使用实践

    目录 第一步.创建 xxx-spring-boot-starter 的spring Initializr模块 第二步.删除不需要的内容(启动类.除下面spring-boot-starter的其它依赖,maven编译插件) 第三步.写代码,对外提供一些自己写的类 第四步.在resources资源文件夹下创建一个META-INF文件夹,并创建一个spring.factories文件 第五步.将该项目发布的maven仓库,或者安装到本地仓库中让其它项目能使用的到 第六步.测试自己定义的启动器使用有效

  • springboot自定义starter实现过程图解

    这篇文章主要介绍了springboot自定义starter实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.创建一个Empty Project 2.在该工程中点击+,选择new module,新建一个maven工程 点击确定. 3.在该工程中点击+,选择new module,新建一个Spring Initializr工程 后面直接默认next,然后点击finishi. 两个都创建完毕之后点击apply,点击OK.得到如下结构: 4

  • springboot 自定义LocaleResolver实现切换语言

    我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboot中的LocaleResolver来进行简单的国际化处理,下面来通过简单Demo来简单的了解国际化. 在下面的Demo中,我用的是thymeleaf模板引擎标签的形式对国际化进行取值. 1.在pom中引入thymeleaf模板引擎 //引入thymeleaf <dependency> <groupId>org.springframework.boot&l

  • SpringBoot自定义FailureAnalyzer过程解析

    这篇文章主要介绍了SpringBoot自定义FailureAnalyzer,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 官网说明 1.1 创建自己的 FailureAnalyzer FailureAnalyzer是一种在启动时拦截 exception 并将其转换为 human-readable 消息的好方法,包含在故障分析中. Spring Boot 为 application context 相关的 exceptions,JSR-303 验

  • Springboot 自定义校验代码实例

    这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 StartWithValidation.class @Documented @Constraint(validatedBy = StartWithValidator.class ) @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface StartWithValidati

  • springboot自定义stater启动流程

    springboot启动时自动加载application.properties或者application.yml,如何定义自己的配置让springboot自动识别: 首先我们新建一个maven工程打包方式选择jar,然后引入所需的包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi

随机推荐