כיצד להשתמש ב- Factory FactoryBean?

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

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

ובמילים פשוטות, אנו יכולים לבנות שעועית מפעל על ידי יישום org.springframework.beans.factory.FactoryBean מִמְשָׁק.

2. יסודות פולי המפעל

2.1. יישום א FactoryBean

בואו נסתכל על FactoryBean ממשק ראשון:

ממשק ציבורי FactoryBean {T getObject () זורק חריג; Class getObjectType (); בוליאני isSingleton (); }

בואו נדון בשלוש השיטות:

  • getObject () - מחזיר אובייקט המיוצר על ידי המפעל, וזה האובייקט שישמש את מיכל האביב
  • getObjectType () - מחזיר את סוג האובייקט שזו FactoryBean מייצר
  • isSingleton () - מציין אם האובייקט שיוצר על ידי זה FactoryBean הוא יחיד

עכשיו, בואו נשתמש בדוגמה FactoryBean. אנו ניישם א ToolFactory שמייצר חפצים מהסוג כְּלִי:

כלי מחלקה ציבורית {id int מזהה פרטי; // קונסטרוקציות סטנדרטיות, קבוצות וקובעות}

ה ToolFactory עצמה:

מחלקה ציבורית ToolFactory מיישמת את FactoryBean {private int factoryId; private int toolId; @Override כלי ציבורי getObject () זורק חריג {להחזיר כלי חדש (toolId); } @Override מחלקה ציבורית getObjectType () {return Tool.class; } @Override בוליאני ציבורי isSingleton () {return false; } // קובעי סטנדרטים וגטרים}

כפי שאנו רואים, ToolFactory הוא FactoryBean, שיכול לייצר כְּלִי חפצים.

2.2. להשתמש FactoryBean עם תצורה מבוססת XML

בואו נסתכל כיצד להשתמש ב ToolFactory.

נתחיל בבניית כלי עם תצורה מבוססת XML - מפעל שעועית-קפיץ-ctx.xml:

לאחר מכן נוכל לבדוק אם כְּלִי אובייקט מוזרק כהלכה:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (מיקומים = {"classpath: factorybean-spring-ctx.xml"}) בכיתה ציבורית FactoryBeanXmlConfigTest {@ כלי כלי פרטי פרטי; @Test הריקני מבחן testConstructWorkerByXml () {assertThat (tool.getId (), equalTo (1)); }}

תוצאת הבדיקה מראה שאנחנו מצליחים להזריק את אובייקט הכלי המיוצר על ידי ה- ToolFactory עם המאפיינים שהגדרנו ב- מפעל שעועית-קפיץ-ctx.xml.

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

למרות שמיכל האביב משתמש ב FactoryBeanשל getObject () ערך ההחזר של השיטה כשעועית, אתה יכול גם להשתמש ב FactoryBean את עצמה.

כדי לגשת ל FactoryBean, אתה רק צריך להוסיף "&" לפני שם השעועית.

בואו ננסה להשיג את שעועית המפעל ואת שלה מפעל מזהה תכונה:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-spring-ctx.xml"}) ציבורי פרטי FactoryBeanXmlConfigTest {@Resource (name = "& tool") ToolFactory toolFactory פרטי; @Test הריקני מבחן testConstructWorkerByXml () {assertThat (toolFactory.getFactoryId (), equalTo (9090)); }}

2.3. להשתמש FactoryBean עם תצורה מבוססת Java

להשתמש FactoryBean עם תצורה מבוססת Java שונה במקצת עם תצורה מבוססת XML, אתה צריך להתקשר ל- FactoryBeanשל getObject () שיטה במפורש.

בואו להמיר את הדוגמה בסעיף המשנה הקודם לדוגמת תצורה מבוססת Java:

@Configuration מחלקה ציבורית FactoryBeanAppConfig {@Bean (name = "tool") ציבור ToolFactory toolFactory () {ToolFactory מפעל = ToolFactory חדש (); factory.setFactoryId (7070); factory.setToolId (2); מפעל החזרה; } @Bean Tool Tool tool () זורק Exception {return toolFactory (). GetObject (); }}

לאחר מכן, אנו בודקים אם ה- כְּלִי אובייקט מוזרק כהלכה:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (class = FactoryBeanAppConfig.class) מחלקה ציבורית FactoryBeanJavaConfigTest {@ כלי כלי פרטי פרטי; @Resource (name = "& tool") ToolFactory toolFactory פרטי; @Test מבטל הריק @ TestConstructWorkerByJava () {assertThat (tool.getId (), equalTo (2)); assertThat (toolFactory.getFactoryId (), equalTo (7070)); }}

תוצאת הבדיקה מראה את האפקט הדומה למבחן התצורה הקודם מבוסס XML.

3. דרכים לאתחול

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

אתה יכול להשיג זאת על ידי יישום ה- אתחול שעועית ממשק או שימוש @PostConstruct ביאור.

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

4. תקציר מפעל שעועית

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

בואו ליישם א SingleToolFactory ו NonSingleToolFactory כדי להראות כיצד להשתמש תקציר מפעל שעועית הן לסינגלטון והן לסוג אב-טיפוס:

המעמד הציבורי SingleToolFactory מרחיב את AbstractFactoryBean {private int factoryId; private int toolId; @Override ציבורי בכיתה getObjectType () {Return Tool.class; } כלי מוגן @Override createInstance () זורק חריג {להחזיר כלי חדש (toolId); } // קובעי סטנדרטים וגטרים}

ועכשיו יישום ה- nonsingleton:

מחלקה ציבורית NonSingleToolFactory מרחיב את AbstractFactoryBean {private int factoryId; privateInt toolId; ציבורי NonSingleToolFactory () {setSingleton (שקר); } @Override מחלקה ציבורית getObjectType () {return Tool.class; } כלי מוגן @Override createInstance () זורק חריג {להחזיר כלי חדש (toolId); } // קובעי סטנדרטים וגטרים}

כמו כן, תצורת ה- XML ​​עבור שעועית המפעל הבאה:

עכשיו אנחנו יכולים לבדוק אם ה- עוֹבֵד תכונות האובייקטים מוזרקות כפי שאנו מצפים:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-abstract-spring-ctx.xml"}) בכלי ציבורי בכיתה פרטית AbstractFactoryBeanTest {@Resource (name = "singleTool") כלי כלי פרטי 1; כלי כלי פרטי 2 @ name (name = "singleTool"); כלי כלי פרטי @ @ Resource (name = "nonSingleTool") 3; כלי כלי פרטי @ name (name = "nonSingleTool") 4; @Test הריקני מבחן testSingleToolFactory () {assertThat (tool1.getId (), equalTo (1)); assertTrue (tool1 == tool2); } @Test בטל ציבורי testNonSingleToolFactory () {assertThat (tool3.getId (), equalTo (2)); assertThat (tool4.getId (), equalTo (2)); assertTrue (tool3! = tool4); }}

כפי שאנו רואים מהבדיקות, ה- SingleToolFactory מייצר אובייקט יחיד, ואת NonSingleToolFactory מייצר אובייקט אב טיפוס.

שים לב שאין צורך להגדיר נכס סינגלטון ב- SingleToolFactory כי ב תקציר מפעל, ערך ברירת המחדל של מאפיין singleton הוא נָכוֹן.

5. מסקנה

באמצעות א FactoryBean יכול להיות נוהג טוב לתמצת לוגיקת בנייה מורכבת או להקל על הגדרת אובייקטים הניתנים להגדרה מאוד באביב.

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

כמו תמיד, המקור השלם הסתיים ב- GitHub.


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