创建自定义启动器

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;}@Overridepublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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项目启动后,

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

springboot自动加载--自定义启动器相关推荐

  1. AutoCAD C# 自动加载自定义RibbonUI界面

    目录 实现效果: 开发环境: 开发流程: 打开Visual Studio ,创建 .NET FrameWork 类库项目 填写项目名称 "RibbonUI",选择.NET 版本为 ...

  2. 如何在NCL(The NCAR Command Language )启动时自动加载自定义的函数和程序

    首先任意建立一个目录存放自定义的程序,例如: $ mkdir ~/MyNCL 然后建立一个环境变量: export NCL_DEF_SCRIPTS_DIR="~/MyNCL" 然后 ...

  3. springboot是如何实现配置文件自动加载的呢

    springboot提倡: 约定大于配置 springboot最常见的面试题: 1.springboot是如何实现自动加载配置呢? 2.如何写一个starter呢? 带着问题,我们以mybatis-s ...

  4. Android复习06【网络编程提高篇-安装GsonFormat、HttpUrlConnection封装、线程池、GsonFormat解析Json、自动加载下一页、自定义组件、页头页尾刷新、侧滑删除】

    2020-04-07 星期二 [第8周] [考试不考...] 目   录 思维导图 安装GsonFormat插件 添加网络访问权限 GitHub---HttpUrlConnection封装 线程池 G ...

  5. SpringBoot项目中自动加载datasourceConfig配置导致启动失败

    在自己学习搭建SpringBoot的项目中并没有使用到数据库,但在启动的时候报没有找到数据源,网上查了一下发现原因是SpringBoot项目启动时会自动加载datasourceConfig配置 经过尝 ...

  6. 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

    在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...

  7. SpringBoot启动加载过程

    文章目录 1. 启动类 @SpringBootApplication 1. @Configuration 2. @EnableAutoConfiguration 3. @ComponentScan 2 ...

  8. PHP自动加载类—__autoload()和spl_autoload_register()

    test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...

  9. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了11 ...

最新文章

  1. java设计模式---职责链模式
  2. EntityManager:seam新手必读(二)
  3. ABAP Netweaver, Hybris Commerce和SAP 云平台的登录认证
  4. Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
  5. Android之matrix类控制图片的旋转、缩放、移动
  6. ofo 银行账户冻结;12306 事件嫌疑人被捕;京东刘强东放权二把手 | 极客头条
  7. 商业智能BI如何推进制造业转型
  8. Linux 常用函数
  9. 使用PacketSifter从pcap中筛选有价值的信息
  10. 陪学网腾讯直播课堂开课啦~免费、免费、免费,重要的事情说三遍
  11. JAVA根据开始时间和结束时间获取天数
  12. SpringBoot 动态设置响应头的content-type
  13. 筑巢引凤 - 男人25后是蓝筹股
  14. %3c php 能用什么代替,Phpwind9
  15. 大吉大利,今晚吃鸡——跑毒篇
  16. 数字孪生是什么,数字孪生能干什么?一文读懂
  17. 作文指导百法·9.从阅读中积累素材
  18. SpringBoot返回值封装
  19. 产品经理眼中的我们程序员
  20. iOS WidgetUI开发遇到的问题点

热门文章

  1. python pyhive查询hive
  2. Java面试问题汇总
  3. 乐高ev3搭建图_乐高EV3摩天轮搭建说明,适合摆在前台吸引小朋友
  4. mac 设置文件服务器,mac服务器文件夹共享权限设置
  5. WMS中RestSharp的使用
  6. CCC '19 S5 - Triangle: The Data Structure(倍增 + 滑窗最大值)
  7. 第20章 知识产权管理、第21章 法律法规和标准规范
  8. 通过反射获取属性以及属性的值
  9. Intel 网卡修改mac地址方法
  10. 让你效率爆表的网页设计PHOTOSHOP插件包