SpringBoot使⽤编程⽅式配置DataSource
Spring Boot使⽤固定算法来扫描和配置。这使我们可以在默认情况下轻松获得完全配置的DataSource实现。
Spring Boot还会按顺序快速的⾃动配置连接池(HikariCP, Apache Tomcat或Commons DBCP),具体取决于路径中的哪些类。
虽然Spring Boot的DataSource⾃动配置在⼤多数情况下运⾏良好,但有时我们需要更⾼级别的控制,因此我们必须设置⾃⼰的DataSource实现,因此忽略⾃动配置过程。
Maven依赖
总体⽽⾔,以编程⽅式创建DataSource实现⾮常简单。
为了学习如何实现这⼀⽬标,我们将实现⼀个简单的存储库层,它将对某些JPA实体执⾏CRUD操作。
我们来看看我们的演⽰项⽬的依赖项:
<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>
复制代码
我们将使⽤内存中的实例来运⾏存储库层。通过这样做,我们将能够测试以编程⽅式配置的DataSour
ce,⽽⽆需执⾏昂贵的数据库操作。让我们确保在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
public class DataSourceConfig {
@Bean
public DataSource getDataSource() {
DataSourceBuilder dataSourceBuilder = ate();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:mem:test");
dataSourceBuilder.username("SA");
dataSourceBuilder.password("");
return dataSourceBuilder.build();
}
}
复制代码
在这种情况下,我们使⽤⽅便的类 - ⼀个简洁的模式 - 以编程⽅式创建我们的⾃定义DataSource对象。
这种⽅法⾮常好,因为构建器可以使⽤⼀些常⽤属性轻松配置DataSource。此外,它还可以使⽤底层连接池。
使⽤application.properties⽂件外部化DataSource配置
当然,也可以部分外部化我们的DataSource配置。例如,我们可以在⼯⼚⽅法中定义⼀些基本的DataSource属性:
@Bean
public DataSource getDataSource() {
DataSourceBuilder dataSourceBuilder = ate();
dataSourceBuilder.username("SA");
dataSourceBuilder.password("");
return dataSourceBuilder.build();
}
复制代码
并在application.properties⽂件中指定⼀些额外的配置:
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.Driver
复制代码
在外部源中定义的属性(例如上⾯的application.properties⽂件或通过使⽤注解的类)将覆盖Java API中定义的属性。
很明显,通过这种⽅法,我们不再将DataSource配置设置保存在⼀个地⽅。
另⼀⽅⾯,它允许我们保持编译时和运⾏时配置彼此并很好地分离。
这⾮常好,因为它允许我们轻松设置绑定点。这样我们可以从其他来源包含不同的DataSource,⽽⽆需重构我们的bean⼯⼚⽅法。测试DataSource配置
测试我们的⾃定义DataSource配置⾮常简单。整个过程归结为创建JPA实体,定义基本存储库接⼝以及测试存储库层。
创建JPA实体
让我们开始定义我们的⽰例JPA实体类,它将为⽤户建模:
@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实现。我们只需要扩展获得⼀个⼯作的存储库实现:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {}
复制代码
测试存储库层
最后,我们需要检查我们的编程配置的DataSource是否实际⼯作。我们可以通过集成测试轻松完成此任务:
@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryIntegrationTest {
@Autowired
private UserRepository userRepository;
@Test
public void whenCalledSave_thenCorrectNumberOfUsers() {
userRepository.save(new User("Bob", "bob@domain"));
List<User> users = (List<User>) userRepository.findAll();
assertThat(users.size()).isEqualTo(1);
}
}
复制代码
UserRepositoryIntegrationTest类是测试⽤例。它只是运⾏两个存储库接⼝的CRUD⽅法来持久化并查实体。
请注意,⽆论我们是否决定以编程⽅式配置DataSource实现,或将其拆分为Java配置⽅法和application.properties⽂件,我们都应该始终获得有效的数据库连接。
运⾏⽰例应⽤程序
最后,我们可以使⽤标准的main()⽅法运⾏我们的演⽰应⽤程序:
@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");
springboot推荐算法User user2 = new User("Julie", "julie@domain");
userRepository.save(user1);
userRepository.save(user2);
userRepository.findAll().forEach(user -> System.out.println(user);
};
}
}
复制代码
我们已经测试了存储库层,因此我们确信我们的DataSource已经成功配置。因此,如果我们运⾏⽰例应⽤程序,我们应该在控制台输出中看到存储在数据库中的User实体列表。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论