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;}@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项目启动后,
- 会读取所有依赖的 jar 包下面 META-INF/spring.factories 文件,而该文件配置了自动配置类,将 spring.factories 中的配置类的全名称获取到,并且根据加载条件来加载项目所需要的类。
- 通过
反射
实例化标注了@Configuration
的 IOC容器配置类,然后汇总并加载到 IOC 容器。当收集到所有在 spring.factories 中指定的bean后,再通过@Import
注解将其导入进容器。 @ConfigurationProperties
注解会读取配置文件 application.yml 里面属性,将读到的值绑定到被注解类的属性。然后,@EnableConfigurationProperties
将属性配置类注入到 IOC 容器中,这样当项目需要配置信息的时候可以直接从容器中去取。- 至此,依赖的 jar 包中自动配置类注入成功,项目可以直接通过
@Autowired
装配使用。
springboot自动加载--自定义启动器相关推荐
- AutoCAD C# 自动加载自定义RibbonUI界面
目录 实现效果: 开发环境: 开发流程: 打开Visual Studio ,创建 .NET FrameWork 类库项目 填写项目名称 "RibbonUI",选择.NET 版本为 ...
- 如何在NCL(The NCAR Command Language )启动时自动加载自定义的函数和程序
首先任意建立一个目录存放自定义的程序,例如: $ mkdir ~/MyNCL 然后建立一个环境变量: export NCL_DEF_SCRIPTS_DIR="~/MyNCL" 然后 ...
- springboot是如何实现配置文件自动加载的呢
springboot提倡: 约定大于配置 springboot最常见的面试题: 1.springboot是如何实现自动加载配置呢? 2.如何写一个starter呢? 带着问题,我们以mybatis-s ...
- Android复习06【网络编程提高篇-安装GsonFormat、HttpUrlConnection封装、线程池、GsonFormat解析Json、自动加载下一页、自定义组件、页头页尾刷新、侧滑删除】
2020-04-07 星期二 [第8周] [考试不考...] 目 录 思维导图 安装GsonFormat插件 添加网络访问权限 GitHub---HttpUrlConnection封装 线程池 G ...
- SpringBoot项目中自动加载datasourceConfig配置导致启动失败
在自己学习搭建SpringBoot的项目中并没有使用到数据库,但在启动的时候报没有找到数据源,网上查了一下发现原因是SpringBoot项目启动时会自动加载datasourceConfig配置 经过尝 ...
- 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多
在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...
- SpringBoot启动加载过程
文章目录 1. 启动类 @SpringBootApplication 1. @Configuration 2. @EnableAutoConfiguration 3. @ComponentScan 2 ...
- PHP自动加载类—__autoload()和spl_autoload_register()
test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...
- PHP自动加载__autoload的工作机制
PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的 已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了11 ...
最新文章
- java设计模式---职责链模式
- EntityManager:seam新手必读(二)
- ABAP Netweaver, Hybris Commerce和SAP 云平台的登录认证
- Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
- Android之matrix类控制图片的旋转、缩放、移动
- ofo 银行账户冻结;12306 事件嫌疑人被捕;京东刘强东放权二把手 | 极客头条
- 商业智能BI如何推进制造业转型
- Linux 常用函数
- 使用PacketSifter从pcap中筛选有价值的信息
- 陪学网腾讯直播课堂开课啦~免费、免费、免费,重要的事情说三遍
- JAVA根据开始时间和结束时间获取天数
- SpringBoot 动态设置响应头的content-type
- 筑巢引凤 - 男人25后是蓝筹股
- %3c php 能用什么代替,Phpwind9
- 大吉大利,今晚吃鸡——跑毒篇
- 数字孪生是什么,数字孪生能干什么?一文读懂
- 作文指导百法·9.从阅读中积累素材
- SpringBoot返回值封装
- 产品经理眼中的我们程序员
- iOS WidgetUI开发遇到的问题点