服务器之家

服务器之家 > 正文

SpringBoot使用编程方式配置DataSource的方法

时间:2021-07-13 11:35     来源/作者:qianmoQ

spring boot使用固定算法来扫描和配置datasource。这使我们可以在默认情况下轻松获得完全配置的datasource实现。

spring boot还会按顺序快速的自动配置连接池(hikaricp, apache tomcat或commons dbcp),具体取决于路径中的哪些类。

虽然spring boot的datasource自动配置在大多数情况下运行良好,但有时我们需要更高级别的控制,因此我们必须设置自己的datasource实现,因此忽略自动配置过程。

maven依赖

总体而言,以编程方式创建datasource实现非常简单。

为了学习如何实现这一目标,我们将实现一个简单的存储库层,它将对某些jpa实体执行crud操作。

我们来看看我们的演示项目的依赖项:

?
1
2
3
4
5
6
7
8
9
10
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<dependency>
  <groupid>com.h2database</groupid>
  <artifactid>h2</artifactid>
  <version>2.4.1</version>
  <scope>runtime</scope>
</dependency>

我们将使用内存中的h2数据库实例来运行存储库层。通过这样做,我们将能够测试以编程方式配置的datasource,而无需执行昂贵的数据库操作。

让我们确保在maven central上查看最新版本的spring-boot-starter-data-jpa。

配置datasource

如果我们坚持使用spring boot的datasource自动配置并以当前状态运行我们的项目,程序将按预期工作。

spring boot将为我们完成所有重型基础设施管道。这包括创建h2 datasource实现,该实现将由hikaricp,apache tomcat或commons dbcp自动处理,并设置内存数据库实例。

此外,我们甚至不需要创建application.properties文件,因为spring boot也会提供一些默认的数据库设置。

正如我们之前提到的,有时我们需要更高级别的自定义,因此我们必须以编程方式配置我们自己的datasource实现。

实现此目的的最简单方法是定义datasource工厂方法,并将其放在使用@configuration注解的类中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@configuration
public class datasourceconfig {
   
  @bean
  public datasource getdatasource() {
    datasourcebuilder datasourcebuilder = datasourcebuilder.create();
    datasourcebuilder.driverclassname("org.h2.driver");
    datasourcebuilder.url("jdbc:h2:mem:test");
    datasourcebuilder.username("sa");
    datasourcebuilder.password("");
    return datasourcebuilder.build();
  }
}

在这种情况下,我们使用方便的datasourcebuilder类 - 一个简洁的joshua bloch构建器模式 - 以编程方式创建我们的自定义datasource对象。

这种方法非常好,因为构建器可以使用一些常用属性轻松配置datasource。此外,它还可以使用底层连接池。

使用application.properties文件外部化datasource配置

当然,也可以部分外部化我们的datasource配置。例如,我们可以在工厂方法中定义一些基本的datasource属性:

?
1
2
3
4
5
6
7
@bean
public datasource getdatasource() {
  datasourcebuilder datasourcebuilder = datasourcebuilder.create();
  datasourcebuilder.username("sa");
  datasourcebuilder.password("");
  return datasourcebuilder.build();
}

并在application.properties文件中指定一些额外的配置:

?
1
2
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.driver

在外部源中定义的属性(例如上面的application.properties文件或通过使用@configurationproperties注解的类)将覆盖java api中定义的属性。

很明显,通过这种方法,我们不再将datasource配置设置保存在一个地方。

另一方面,它允许我们保持编译时和运行时配置彼此并很好地分离。

这非常好,因为它允许我们轻松设置绑定点。这样我们可以从其他来源包含不同的datasource,而无需重构我们的bean工厂方法。

测试datasource配置
测试我们的自定义datasource配置非常简单。整个过程归结为创建jpa实体,定义基本存储库接口以及测试存储库层。

  • 创建jpa实体

让我们开始定义我们的示例jpa实体类,它将为用户建模:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@entity
@table(name = "users")
public class user {
   
  @id
  @generatedvalue(strategy = generationtype.auto)
  private long id;
  private string name;
  private string email;
 
  // standard constructors / setters / getters / tostring
   
}
  • 存储库层

我们需要实现一个基本的存储库层,它允许我们对上面定义的user实体类的实例执行crud操作。

由于我们使用的是spring data jpa,因此我们不必从头开始创建自己的dao实现。我们只需要扩展crudrepository接口获得一个工作的存储库实现:

?
1
2
@repository
public interface userrepository extends crudrepository<user, long> {}
  • 测试存储库层

最后,我们需要检查我们的编程配置的datasource是否实际工作。我们可以通过集成测试轻松完成此任务:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@runwith(springrunner.class)
@datajpatest
public class userrepositoryintegrationtest {
   
  @autowired
  private userrepository userrepository;
  
  @test
  public void whencalledsave_thencorrectnumberofusers() {
    userrepository.save(new user("bob", "bob@domain.com"));
    list<user> users = (list<user>) userrepository.findall();
     
    assertthat(users.size()).isequalto(1);
  
}

userrepositoryintegrationtest类是测试用例。它只是运行两个存储库接口的crud方法来持久化并查找实体。

请注意,无论我们是否决定以编程方式配置datasource实现,或将其拆分为java配置方法和application.properties文件,我们都应该始终获得有效的数据库连接。

  • 运行示例应用程序

最后,我们可以使用标准的main()方法运行我们的演示应用程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@springbootapplication
public class application {
 
  public static void main(string[] args) {
    springapplication.run(application.class, args);
  }
 
  @bean
  public commandlinerunner run(userrepository userrepository) throws exception {
    return (string[] args) -> {
      user user1 = new user("john", "john@domain.com");
      user user2 = new user("julie", "julie@domain.com");
      userrepository.save(user1);
      userrepository.save(user2);
      userrepository.findall().foreach(user -> system.out.println(user);
    };
  }
}

我们已经测试了存储库层,因此我们确信我们的datasource已经成功配置。因此,如果我们运行示例应用程序,我们应该在控制台输出中看到存储在数据库中的user实体列表。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000018045674

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部