概述
Spring Boot默认会根据类路径依赖,自动配置数据源DataSource、数据库连接池即HikariCP、Apache Tomcat或Commons DBCP,并创建数据库实例。
<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>
但有时我们需要更高级别的控制,比如支持多数据源、读写分离等,就必须编程式实现DataSource配置,从而跳过自动配置过程。
编程方式配置DataSource
最简单方法是定义DataSource工厂方法,并将其放置在@Configuration注解的类中:
@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();
}
}
也可以使用application.properties外部化数据源配置:
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.Driver
然后在工厂方法中定义一些基本的DataSource属性:
@Bean
public DataSource getDataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.username("SA");
dataSourceBuilder.password("");
return dataSourceBuilder.build();
}
或通过用@ConfigurationProperties注解类,覆盖Java API中定义的属性。这样可以保持编译时和运行时之间属性设置的分离。
测试DataSource配置
整个过程归结为创建JPA实体、定义基本存储层API和测试存储层。
- 创建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
}
- 定义存储层API
我们使用的是Spring Data JPA,所以不必从头开始创建DAO实现。只需扩展CrudRepository接口即可获得存储库的CRUD实现:
@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.com"));
List<User> users = (List<User>) userRepository.findAll();
assertThat(users.size()).isEqualTo(1);
}
}
- 运行示例应用程序
运行后我们应该在控制台输出中看到存储在数据库中的用户实体列表。
@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在多数据源、主从读写分离等很常见。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15335.html