קביעת תצורה של מקור נתונים באופן פרוגרמטי באתחול האביב

1. סקירה כללית

Spring Boot משתמש באלגוריתם דעתני כדי לחפש ולהגדיר א מקור מידע. זה מאפשר לנו לקבל תצורה מלאה מקור מידע יישום כברירת מחדל.

בנוסף, Spring Boot מגדיר באופן אוטומטי מאגר חיבורים מהיר - או HikariCP, Apache Tomcat או DBCP של Commons, לפי הסדר, תלוי באילו שביל הכיתה.

בעוד אביב המגף אוטומטי מקור מידע התצורה עובדת טוב מאוד ברוב המקרים, לפעמים נצטרך שליטה גבוהה יותראז נצטרך להקים משלנו מקור מידע היישום, ומכאן שדלג על תהליך התצורה האוטומטי.

במדריך זה נלמד כיצד להגדיר מקור מידע באופן פרוגרמטי באביב אתחול.

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 במרכז מייבן.

3. קביעת תצורה של א מקור מידע מבחינה תכנותית

עכשיו, אם אנחנו עומדים באוטומט של Spring Boot מקור מידע התצורה והפעלת הפרויקט שלנו במצב הנוכחי, זה פשוט יעבוד כצפוי.

Spring Boot יעשה עבורנו את כל צנרת התשתית הכבדה. זה כולל יצירת H2 מקור מידע יישום, אשר יטופל אוטומטית על ידי HikariCP, Apache Tomcat או Commons DBCP, והגדרת מופע מסד נתונים בזיכרון.

בנוסף, אפילו לא נצטרך ליצור application.properties קובץ, מכיוון ש- Spring Boot יספק גם כמה הגדרות ברירת מחדל למסד הנתונים.

כפי שהזכרנו בעבר, לעיתים נצטרך רמה גבוהה יותר של התאמה אישית, ולכן נצטרך להגדיר באופן פרוגרמטי את שלנו מקור מידע יישום.

הדרך הפשוטה ביותר להשיג זאת היא על ידי הגדרת א מקור מידע שיטת המפעל, והצבתו בתוך כיתה המסומנת עם @תְצוּרָה ביאור:

@Configuration מחלקה ציבורית DataSourceConfig {@Bean DataSource הציבורי getDataSource () {DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create (); dataSourceBuilder.driverClassName ("org.h2.Driver"); dataSourceBuilder.url ("jdbc: h2: mem: test"); dataSourceBuilder.username ("SA"); dataSourceBuilder.password (""); להחזיר dataSourceBuilder.build (); }}

במקרה הזה, השתמשנו בנוחות DataSourceBuilder מעמד - גרסה לא שוטפת של דפוס הבונים של ג'ושוע בלוך - ליצור באופן פרוגרמטי את המנהג שלנו מקור מידע לְהִתְנַגֵד.

גישה זו ממש נחמדה מכיוון שהבונה מקל על התצורה של a מקור מידע באמצעות כמה מאפיינים נפוצים. בנוסף, הוא משתמש גם במאגר החיבורים הבסיסי.

4. החצנה מקור מידע תצורה עם application.properties קוֹבֶץ

כמובן שאפשר גם להחצין את חלקנו באופן חלקי מקור מידע תְצוּרָה. למשל, נוכל להגדיר כמה בסיסים מקור מידע נכסים בשיטת המפעל שלנו:

@Bean DataSource ציבורי getDataSource () {DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create (); dataSourceBuilder.username ("SA"); dataSourceBuilder.password (""); להחזיר dataSourceBuilder.build (); }

וציין כמה נוספים ב- application.properties קוֹבֶץ:

spring.datasource.url = jdbc: h2: mem: test spring.datasource.driver-class-name = org.h2.Driver 

המאפיינים שהוגדרו במקור חיצוני, כמו האמור לעיל application.properties קובץ או באמצעות כיתה עם הערה עם @ConfigurationProperties, יעקוף את אלה שהוגדרו ב- API של Java.

מתברר שעם גישה זו לא נשמור עוד על שלנו מקור מידע הגדרות תצורה המאוחסנות במקום אחד.

מצד שני, זה מאפשר לנו לשמור על הגדרות תצורה של זמן קומפילציה וזמן ריצה בצורה נפרדת זו מזו.

זה ממש טוב, מכיוון שהוא מאפשר לנו להגדיר נקודת מחייב תצורה בקלות. כך אנו יכולים לכלול שונה מקור מידע הגדרות ממקורות אחרים, מבלי לשקול מחדש את שיטות מפעל השעועית שלנו.

5. בדיקת ה- מקור מידע תְצוּרָה

בודקים את המנהג שלנו מקור מידע התצורה מאוד פשוטה. התהליך כולו מסתכם ביצירת ישות JPA, הגדרת ממשק מאגר בסיסי ובדיקת שכבת המאגר.

5.1. יצירת ישות JPA

נתחיל בהגדרת מחלקת ישות JPA לדוגמה שלנו, שתדגם משתמשים:

@Entity @Table (name = "משתמשים") משתמש בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) מזהה פרטי פרטי; שם מחרוזת פרטי; דוא"ל מחרוזת פרטי; // קונסטרוקטורים סטנדרטיים / סטרים / getters / toString}

5.2. שכבת מאגר פשוטה

בשלב הבא עלינו ליישם שכבת מאגר בסיסית, המאפשרת לנו לבצע פעולות CRUD במקרים של ה- מִשׁתַמֵשׁ מחלקת ישויות שהוגדרה לעיל.

מכיוון שאנו משתמשים ב- Spring Data JPA, איננו צריכים ליצור יישום DAO משלנו מאפס. אנחנו פשוט צריכים להאריך את מאגר Crud ממשק לקבל יישום מאגר עובד:

ממשק ציבורי @ מאגר @ UserRepository מרחיב את CrudRepository {} 

5.3. בדיקת שכבת המאגר

לבסוף, עלינו לבדוק את התצורה שלנו מוגדרת באופן תכנותי מקור מידע למעשה עובד. אנו יכולים להשיג זאת בקלות באמצעות מבחן אינטגרציה:

@RunWith (SpringRunner.class) @DataJpaTest מחלקה ציבורית UserRepositoryIntegrationTest {@Autowired UserRepository פרטי userRepository; @ מבחן ציבורי בטל כאשר CallSave_thenCorrectNumberOfUsers () {userRepository.save (משתמש חדש ("בוב", "[מוגן באמצעות דוא"ל])); משתמשים ברשימה = (רשימה) userRepository.findAll (); assertThat (users.size ()). isEqualTo (1); }}

ה UserRepositoryIntegrationTest הכיתה די מסבירה את עצמה. זה פשוט מפעיל שתיים משיטות ה- CRUD של ממשק המאגר כדי להתמיד ולמצוא ישויות.

שים לב שבלי קשר אם אנו מחליטים להגדיר את התוכנה שלנו באופן תכנותי מקור מידע יישום, או לפצל אותו לשיטת תצורת Java application.properties אנחנו צריכים לקבל חיבור מסד נתונים עובד.

5.4. הפעלת היישום לדוגמא

לבסוף, אנו יכולים להריץ את יישום ההדגמה שלנו באמצעות תקן רָאשִׁי() שיטה:

@SpringBootApplication מחלקה ציבורית יישום {public static void main (String [] args) {SpringApplication.run (Application.class, args); } ריצת CommandLineRunner הציבורית @Bean (UserRepository userRepository) זורקת Exception {return (String [] args) -> {User user1 = User new ("John", "[email protected]"); משתמש משתמש 2 = משתמש חדש ("ג'ולי", "[דוא"ל מוגן]"); userRepository.save (user1); userRepository.save (user2); userRepository.findAll (). forEach (user -> System.out.println (user);};}} 

כבר בדקנו את שכבת המאגר, כך שאנחנו בטוחים שלנו מקור מידע הוגדר בהצלחה. לפיכך, אם אנו מריצים את יישום הדוגמה, עלינו לראות בפלט המסוף שלנו את רשימת מִשׁתַמֵשׁ גופים המאוחסנים במסד הנתונים.

6. מסקנה

במדריך זה, למדנו כיצד להגדיר א מקור מידע יישום באופן תכנותי באביב אתחול.

כרגיל, כל דגימות הקוד המוצגות במדריך זה זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found