סריקת רכיבי אביב

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

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

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

ראשית, בואו נסתכל על הגדרות ברירת המחדל.

2. @ComponentScan בלי ויכוחים

2.1. באמצעות @ComponentScan ביישום אביב

עם האביב, אנו משתמשים ב- @ComponentScan ביאור יחד עם @תְצוּרָה ביאור כדי לציין את החבילות שאנו רוצים לסרוק. @ComponentScan ללא ויכוחים אומר לאביב לסרוק את החבילה הנוכחית ואת כל חבילות המשנה שלה.

נניח שיש לנו את הדברים הבאים @תְצוּרָה ב com.baeldung.componentscan.springapp חֲבִילָה:

@Configuration @ComponentScan מחלקה ציבורית SpringComponentScanApp {פרטי סטטי ApplicationContext applicationContext; @Bean ציבורית ExampleBean exampleBean () {להחזיר את ExampleBean החדשה (); } ראשי ריק סטטי ציבורי (String [] args) {applicationContext = AnnotationConfigApplicationContext חדש (SpringComponentScanApp.class); עבור (String beanName: applicationContext.getBeanDefinitionNames ()) {System.out.println (beanName); }}}

כמו כן, נניח שיש לנו את חתול ו כֶּלֶב רכיבים ב com.baeldung.componentscan.springapp.animals חֲבִילָה:

חבילה com.baeldung.componentscan.springapp.animals; // ... @Component class class Cat {}
חבילה com.baeldung.componentscan.springapp.animals; // ... כלב מחלקה ציבורית ברכיב ציבורי {}

ולבסוף, יש לנו את ורד רכיב ב com.baeldung.componentscan.springapp.flowers חֲבִילָה:

חבילה com.baeldung.componentscan.springapp.flowers; // ... @Component public class Rose {}

התפוקה של רָאשִׁי() השיטה תכיל את כל השעועית של com.baeldung.componentscan.springapp החבילה ושל חבילות המשנה שלה:

springComponentScanApp כלב חתול עלה דוגמה שעועית

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

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

לסיום, שים לב שבדוגמה שלנו @ComponentScan שווה ל:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp")

איפה basePackages ארגומנט הוא חבילה או מערך חבילות לסריקה.

2.2. באמצעות @ComponentScan ביישום אתחול האביב

הטריק עם Spring Spring הוא שדברים רבים קורים במרומז. אנו משתמשים ב- @ SpringBootApplication ביאור, אבל זה רק שילוב של שלוש ביאורים:

@Configuration @EnableAutoConfiguration @ComponentScan

בואו ניצור מבנה דומה ב com.baeldung.componentscan.springbootapp חֲבִילָה. הפעם היישום העיקרי יהיה:

חבילה com.baeldung.componentscan.springbootapp; // ... @SpringBootApplication מחלקה ציבורית SpringBootComponentScanApp {Application static privateContext applicationContext; @Bean ציבורית ExampleBean exampleBean () {להחזיר את ExampleBean החדשה (); } ראשי ריק סטטי ציבורי (String [] args) {applicationContext = SpringApplication.run (SpringBootComponentScanApp.class, args); checkBeansPresence ("חתול", "כלב", "ורד", "דוגמא שעועית", "springBootComponentScanApp"); } checkBeansPresence ריק סטטי פרטי (מחרוזת ... שעועית) {עבור (מחרוזת שעועית: שעועית) {System.out.println ("האם" + שעועית + "ב- ApplicationContext:" + applicationContext.containsBean (שעועית)); }}}

כל שאר החבילות והשיעורים נשארים זהים, רק נעתיק אותם לסביבה com.baeldung.componentscan.springbootapp חֲבִילָה.

Spring Boot סורק חבילות בדומה לדוגמא הקודמת שלנו. בואו לבדוק את הפלט:

האם החתול נמצא ב- ApplicationContext: true האם הכלב נמצא ב- ApplicationContext: true הוא עלה ב- ApplicationContext: true Is exampleBean ביישוםContext: true Is springBootComponentScanApp ביישוםContext: true

הסיבה שאנחנו רק בודקים את השעועית לקיומה בדוגמה השנייה שלנו (בניגוד להדפסת כל השעועית), היא שהפלט יהיה גדול מדי.

זה בגלל המשתמע @EnableAutoConfiguration ביאור שגורם ל- Spring Boot ליצור שעועית רבים באופן אוטומטי, תוך הסתמכות על התלות ב pom.xml קוֹבֶץ.

3. @ComponentScan עם ויכוחים

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

3.1. @ComponentScan לחבילות ספציפיות

אנו יכולים לעשות זאת בכמה דרכים. ראשית, אנו יכולים לשנות את חבילת הבסיס:

@ComponentScan (basePackages = "com.baeldung.componentscan.springapp.animals") מחלקה ציבורית @Configuration SpringComponentScanApp {// ...}

כעת התפוקה תהיה:

springComponentScanApp כלב חתול לדוגמא שעועית

בואו נראה מה עומד מאחורי זה:

  • springComponentScanApp נוצר כיוון שהוא תצורה שהועברה כוויכוח ל- AnnotationConfigApplicationContext
  • exampleBean הוא שעועית מוגדרת בתוך התצורה
  • חתול ו כֶּלֶב נמצאים במפורט com.baeldung.componentscan.springapp.animals חֲבִילָה

כל ההתאמות האישיות המפורטות לעיל ישימות גם באביב אתחול. אנחנו יכולים להשתמש @ComponentScan ביחד עם @ SpringBootApplication והתוצאה תהיה זהה:

@SpringBootApplication @ComponentScan (basePackages = "com.baeldung.componentscan.springbootapp.animals")

3.2. @ComponentScan עם אי הכללות

דרך נוספת היא להשתמש בפילטר, המציין את התבנית שהשיעורים לא יכללו:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (type = FilterType.REGEX, pattern = "com \. Baeldung \. Componentscan \. Springapp \. פרחים \ .. *"))

אנו יכולים גם לבחור סוג מסנן אחר, כמו ההערה תומכת בכמה אפשרויות גמישות לסינון הכיתות הסרוקות:

@ComponentScan (excludeFilters = @ ComponentScan.Filter (type = FilterType.ASSIGNABLE_TYPE, value = Rose.class))

4. חבילת ברירת המחדל

עלינו להימנע מלשים את @תְצוּרָה בכיתה בחבילה המוגדרת כברירת מחדל (כלומר על ידי אי-ציון החבילה כלל). במקרה זה, אביב סורק את כל הכיתות בכל הצנצנות במסלול כיתה. זה גורם לשגיאות והיישום כנראה לא מתחיל.

5. מסקנה

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

כרגיל, הקוד השלם זמין ב- GitHub.