Spring Boot برای ساخت DataSource یک رویه اتوماتیک دارد که به ما کمک میکند سریعا به ابجکت DataSource دسترسی داشته باشیم علاوه بر آن Connection pool را هم بصورت پیش فرض ایجاد و تنظیماتش را ست میکند
ولی گاهی اوقات برای موارد خاص نیاز داریم که خودمان این تنظیمات را ست کنیم و تحت کنترل ما DataSource ساخته شود که در این بخش به چگونگی ساخت DataSource سفارشی از طریق کدنویسی میپردازیم
کتابخانه های مورد نیاز را به پروژه اضافه میکنیم :
<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 سفارشی با تنظیمات دلخواه راحتترین روش تعریف یک Bean@ در کلاس 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
@Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.username("SA"); dataSourceBuilder.password(""); return dataSourceBuilder.build(); }
** تنظیماتی که در application.properties یا در کلاسی که با ConfigurationProperties@ مشخص شده است، تنظیمات پیش فرض موجود در Spring Boot را Override میکند و طبیعتا در مورد DataSource ما دیگر تنظیمات پیش فرضی که Spring Boot خود اعمال میکرد نادیده گرفته میشود و این امکان را به ما میدهد که تنظیمات Compile-Time و Run-Time از یکدیگر جدا باشند
همچنین میتوانیم DataSource های مختلفی برای کاربرد های مختلف ایجاد کنیم
تست DataSource سفارشی :
ابتدا یک Entity@ میسازیم :
@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 }
سپس لایه Repository را میسازیم که عملیات CRUD را با آن انجام دهیم :
@Repository public interface UserRepository extends CrudRepository<User, Long> {}
تست کد :
@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); } }
اجرای یک نمونه از برنامه که با اجرا شدن آن باید لیست User ها را در خروجی کنسول ببینیم
@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); }; } }