1. ภาพรวม
ฤดูใบไม้ผลิ Boot ใช้อัลกอริทึมดื้อดึงเพื่อสแกนหาและกำหนดค่าแหล่งข้อมูล สิ่งนี้ช่วยให้เรารับการใช้งานDataSource ที่กำหนดค่าไว้อย่างสมบูรณ์ตามค่าเริ่มต้นได้อย่างง่ายดาย
นอกจากนี้ Spring Boot จะกำหนดค่าพูลการเชื่อมต่อที่รวดเร็วทันใจโดยอัตโนมัติไม่ว่าจะเป็น HikariCP, Apache Tomcat หรือ Commons DBCP ตามลำดับนั้นขึ้นอยู่กับว่าจะอยู่บนพา ธ คลาสใด
แม้ว่าการกำหนดค่าแหล่งข้อมูลอัตโนมัติของ Spring Boot จะทำงานได้ดีในกรณีส่วนใหญ่ แต่บางครั้งเราก็ต้องการการควบคุมในระดับที่สูงขึ้นดังนั้นเราจะต้องตั้งค่าการใช้งานDataSourceของเราเองดังนั้นจึงข้ามขั้นตอนการกำหนดค่าอัตโนมัติไป
ในการกวดวิชานี้เราจะได้เรียนรู้วิธีการกำหนดค่าแหล่งข้อมูลโปรแกรมในฤดูใบไม้ผลิ Boot
2. การพึ่งพา Maven
การสร้างแหล่งข้อมูลการดำเนินงานโปรแกรมตรงไปตรงมาโดยรวม
หากต้องการเรียนรู้วิธีดำเนินการให้สำเร็จเราจะใช้เลเยอร์พื้นที่เก็บข้อมูลแบบธรรมดาซึ่งจะดำเนินการ CRUD กับเอนทิตี JPA บางส่วน
ลองดูการอ้างอิงของโครงการสาธิตของเรา:
org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 2.4.1 runtime
ดังที่แสดงไว้ด้านบนเราจะใช้อินสแตนซ์ฐานข้อมูล H2 ในหน่วยความจำเพื่อใช้ชั้นที่เก็บข้อมูล ในการดำเนินการดังกล่าวเราจะสามารถทดสอบแหล่งข้อมูลที่กำหนดค่าทางโปรแกรมได้โดยไม่ต้องเสียค่าใช้จ่ายในการดำเนินการฐานข้อมูลที่มีราคาแพง
นอกจากนี้อย่าลืมตรวจสอบเวอร์ชันล่าสุดของspring-boot-starter-data-jpaบน Maven Central
3. การกำหนดค่าแหล่งข้อมูลโดยใช้โปรแกรม
ตอนนี้ถ้าเรายึดติดกับการกำหนดค่าแหล่งข้อมูลอัตโนมัติของ Spring Boot และเรียกใช้โครงการของเราในสถานะปัจจุบันมันก็จะทำงานได้ตามที่คาดไว้
Spring Boot จะทำระบบประปาโครงสร้างพื้นฐานหนักทั้งหมดให้เรา ซึ่งรวมถึงการสร้างการใช้งาน H2 DataSourceซึ่งจะจัดการโดยอัตโนมัติโดย HikariCP, Apache Tomcat หรือ Commons DBCP และการตั้งค่าอินสแตนซ์ฐานข้อมูลในหน่วยความจำ
นอกจากนี้เราไม่จำเป็นต้องสร้างไฟล์application.properties ด้วยซ้ำเนื่องจาก Spring Boot จะให้การตั้งค่าฐานข้อมูลเริ่มต้นบางอย่างด้วย
ดังที่เราได้กล่าวไปแล้วในบางครั้งเราจำเป็นต้องมีการปรับแต่งในระดับที่สูงขึ้นดังนั้นเราจึงต้องกำหนดค่าการใช้งาน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(); } }
ในกรณีนี้เราใช้คลาสDataSourceBuilder ที่สะดวกซึ่งเป็นรูปแบบตัวสร้างของ Joshua Bloch เวอร์ชันที่ไม่คล่องแคล่วเพื่อสร้างวัตถุDataSource ที่กำหนดเองโดยใช้โปรแกรม
แนวทางนี้ดีมากเพราะตัวสร้างทำให้ง่ายต่อการกำหนดค่าDataSourceโดยใช้คุณสมบัติทั่วไปบางอย่าง นอกจากนี้ยังใช้พูลการเชื่อมต่อพื้นฐานด้วย
4. การกำหนดค่าคอนฟิกแหล่งข้อมูลภายนอกด้วยไฟล์application.properties
แน่นอนว่ายังสามารถภายนอกการกำหนดค่าDataSourceของเราได้บางส่วน ตัวอย่างเช่นเราสามารถกำหนดคุณสมบัติพื้นฐานของแหล่งข้อมูลในวิธีการของโรงงานของเรา:
@Bean public DataSource getDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); 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ด้านบนหรือผ่านคลาสที่ใส่คำอธิบายประกอบด้วย@ConfigurationPropertiesจะแทนที่คุณสมบัติที่กำหนดใน Java API
เห็นได้ชัดว่าด้วยแนวทางนี้เราจะไม่เก็บการตั้งค่าการกำหนดค่าแหล่งข้อมูลของเราไว้ในที่เดียวอีกต่อไป
ในทางกลับกันมันช่วยให้เราสามารถเก็บการตั้งค่าคอนฟิกเวลาคอมไพล์และรันไทม์แยกออกจากกันได้
นี่เป็นสิ่งที่ดีมากเพราะช่วยให้เรากำหนดจุดเชื่อมต่อการกำหนดค่าได้อย่างง่ายดาย ด้วยวิธีนี้เราสามารถรวมการตั้งค่าแหล่งข้อมูลที่แตกต่างกันจากแหล่งอื่น ๆ โดยไม่ต้องปรับเปลี่ยนวิธีการโรงงานถั่วของเรา
5. การทดสอบการกำหนดค่าแหล่งข้อมูล
การทดสอบการกำหนดค่าDataSource ที่กำหนดเองของเรานั้นง่ายมาก กระบวนการทั้งหมดเพียงแค่สร้างเอนทิตี JPA กำหนดอินเทอร์เฟซที่เก็บพื้นฐานและทดสอบเลเยอร์ที่เก็บ
5.1. การสร้างเอนทิตี 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 }
5.2. เลเยอร์ที่เก็บอย่างง่าย
ต่อไปเราต้องใช้เลเยอร์ที่เก็บพื้นฐานซึ่งช่วยให้เราดำเนินการ CRUD กับอินสแตนซ์ของคลาสเอนทิตีผู้ใช้ที่กำหนดไว้ข้างต้น
เนื่องจากเราใช้ Spring Data JPA เราจึงไม่จำเป็นต้องสร้างการใช้งาน DAO ของเราเองตั้งแต่ต้น เราต้องขยายอินเทอร์เฟซCrudRepositoryเพื่อให้ใช้งานที่เก็บได้:
@Repository public interface UserRepository extends CrudRepository {}
5.3. การทดสอบ Repository Layer
สุดท้ายนี้เราต้องตรวจสอบว่าDataSource ที่กำหนดค่าโดยโปรแกรมของเราใช้งานได้จริง เราสามารถทำได้อย่างง่ายดายด้วยการทดสอบการรวม:
@RunWith(SpringRunner.class) @DataJpaTest public class UserRepositoryIntegrationTest { @Autowired private UserRepository userRepository; @Test public void whenCalledSave_thenCorrectNumberOfUsers() { userRepository.save(new User("Bob", "[email protected]")); List users = (List) userRepository.findAll(); assertThat(users.size()).isEqualTo(1); } }
UserRepositoryIntegrationTestชั้นสวยอธิบายตนเอง เพียงแค่ฝึกสองวิธี CRUD ของอินเทอร์เฟซที่เก็บข้อมูลเพื่อคงอยู่และค้นหาเอนทิตี
Notice that regardless of whether we decide to programmatically configure our DataSource implementation, or split it into a Java config method and the application.properties file, we should always get a working database connection.
5.4. Running the Sample Application
Finally, we can run our demo application using a standard main() method:
@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", "[email protected]"); User user2 = new User("Julie", "[email protected]"); userRepository.save(user1); userRepository.save(user2); userRepository.findAll().forEach(user -> System.out.println(user); }; } }
We already tested the repository layer, so we're sure that our DataSource has been configured successfully. Thus, if we run the sample application, we should see in our console output the list of User entities stored in the database.
6. Conclusion
ในการกวดวิชานี้เราได้เรียนรู้วิธีการกำหนดค่าแหล่งข้อมูลการดำเนินงานโปรแกรมในฤดูใบไม้ผลิ Boot
ตามปกติตัวอย่างโค้ดทั้งหมดที่แสดงในบทช่วยสอนนี้มีอยู่ใน GitHub