Springboot自定义stater
一、前言
在实际的生产环境我们往往会需要自定义一些服务API,集成到Springboot框架中使用,本文以自定义一个Connection数据库连接对象的stater为例,来揭开自定义stater的面纱。
二、自定义stater设计
1. 对于Springboot中集成第三方stater的命名规则
官方的stater命名是这样 : spring-boot-stater-xxx ,比如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第三方的stater命名是这样:xxx-spring-boot-stater,比如:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.3</version>
</dependency>
2. 结构设计
三、编码实现
1. 服务stater端编写
引入自动配置依赖
<?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.xiaozhi</groupId>
<artifactId>conn-spring-boot-stater</artifactId>
<version>1.0-SNAPSHOT</version>
<name>conn-spring-boot-stater</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<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>
<!-- 这两个依赖是Springboot自动配置的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.0.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
<build>
</build>
</project>
编写属性配置类
/**
* prefix = "jdbc.conn"代表当前类属性在application.properties配置时key的前缀,比如 url属性** 未来在application.properties文件中的配置方式为:
* jdbc.conn.url=xxxxxx
*/
@ConfigurationProperties(prefix = "jdbc.conn")
public class ConnProperties {
private String driverClassName;
private String url;
private String username;
private String password;
//此处需要提供getter/setter方法
...略
}
编写自动配置类
@Configuration
// 这里引用了上面定义的属性配置类
@EnableConfigurationProperties(ConnProperties.class)
public class ConnectionAutoConfiguration {
//采用spring的JavaConfig方式创建服务类
@Bean
public Connection conn(ConnProperties connProperties) {
Connection connection = null;
try {
Class.forName(connProperties.getDriverClassName());
connection = DriverManager.getConnection(connProperties.getUrl(), connProperties.getUsername(), connProperties.getPassword());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
编写META-INF/spring.factories : org.springframework.boot.autoconfigure.EnableAutoConfiguration这个值是固定的, Springboot应用启动时会根据这个key进行读取自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiaozhi.autoconfig.ConnectionAutoConfiguration
使用mvn install将服务打包安装。
2. 服务调用端测试
引入自定义stater依赖
<dependency>
<groupId>com.xiaozhi</groupId>
<artifactId>conn-spring-boot-stater</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
编写application.properties
jdbc.conn.driver-class-name=oracle.jdbc.OracleDriver
jdbc.conn.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.conn.username=hr
jdbc.conn.password=hr
注入使用Connection
@SpringBootTest
@RunWith(SpringRunner.class)
public class ConnTest {
@Autowired
private Connection connection;
@Test
public void testConn() {
if(connection!=null){
System.out.println("获取到Connection:"+connection);
}
}
}
本文的案例中使用到了两个重要注解:
@ConfigurationProperties 和 @EnableConfigurationProperties,这里要说的是@ConfigurationProperties这个注解在使用Spring的JavaConfig方式开发时,也可以用在带有@Bean注解的方法上,通过这种方式可以实现给一个应用中原有的属性配置类自定义配置的方式,比如多数据源的实现:
@Configuration
public class DatasourceConfiguration {
//第一个数据源
@Bean
@Primary // 优先使用这里的数据源
@ConfigurationProperties(prefix ="spring.ds.user" )
public DataSourceProperties userDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
public DataSource userDataSource() {
return userDataSourceProperties()
.initializeDataSourceBuilder().type(DruidDataSource.class).build();
}
...
//第二个数据源
@Bean
@ConfigurationProperties(prefix ="spring.ds.product" )
public DataSourceProperties productDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource productDataSource() {
return productDataSourceProperties()
.initializeDataSourceBuilder().type(DruidDataSource.class).build();
}
...
}
本文参考自Springboot原理,如有纰漏或不当之处请指出