springboot?自定義啟動器的實現(xiàn)
創(chuàng)建自定義啟動器
0、項目總覽

1、創(chuàng)建項目,引入依賴
創(chuàng)建項目 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>
啟動器支持多種數(shù)據(jù)源,例如:C3P0和Druid,根據(jù)配置的type進行選擇。此處我們引用兩個連接池依賴,一個是C3P0,一個是Druid。
2、創(chuàng)建屬性配置類
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、創(chuàng)建自動配置類
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 數(shù)據(jù)源。 - 如果配置文件中配置了
spring.jdbc.datasource.type=druid,使用 druid 數(shù)據(jù)源。
此處使用條件選擇實現(xiàn),@ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid") 根據(jù)配置文件中的 type 值進行條件選擇創(chuàng)建不同的 DataSource。
4、創(chuàng)建自動配置屬性文件
在resource文件夾下面新建 META-INF/spring.factories
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.shwen.autoconfig.DataSourceAutoConfiguration
注意要執(zhí)行 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 指定需要創(chuàng)建的數(shù)據(jù)源,此處指定數(shù)據(jù)源為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,打印結(jié)果:

小結(jié)
通過編寫自定義啟動器,我們更加理解springboot自動配置原理。springboot項目啟動后,
- 會讀取所有依賴的 jar 包下面 META-INF/spring.factories 文件,而該文件配置了自動配置類,將 spring.factories 中的配置類的全名稱獲取到,并且根據(jù)加載條件來加載項目所需要的類。
- 通過
反射實例化標注了@Configuration的 IOC容器配置類,然后匯總并加載到 IOC 容器。當收集到所有在 spring.factories 中指定的bean后,再通過@Import注解將其導入進容器。 @ConfigurationProperties注解會讀取配置文件 application.yml 里面屬性,將讀到的值綁定到被注解類的屬性。然后,@EnableConfigurationProperties將屬性配置類注入到 IOC 容器中,這樣當項目需要配置信息的時候可以直接從容器中去取。- 至此,依賴的 jar 包中自動配置類注入成功,項目可以直接通過
@Autowired裝配使用。
到此這篇關于springboot 自定義啟動器的實現(xiàn)的文章就介紹到這了,更多相關springboot 自定義啟動器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題
這篇文章主要介紹了詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
淺談Java finally語句到底是在return之前還是之后執(zhí)行(必看篇)
下面小編就為大家?guī)硪黄獪\談Java finally語句到底是在return之前還是之后執(zhí)行(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
mybatis-plus分頁查詢?nèi)N方法小結(jié)
本文主要介紹了mybatis-plus分頁查詢?nèi)N方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05

