آشنایی با مفهوم ارث بری در Bean ها و کاربرد آن ؟
کد تعیین یک Bean می تواند شامل اطلاعات زیادی ازجمله اطلاعات پیکربندی ، آرگومان های تابع سازنده ، مقادیر خواص های آن و ...باشد . این اطلاعات همچنین می تواند اطلاعات خاصی رادرباره Container آن مثل متد تعریف اولیه ( initialization method ) ، متدهای پیش فرض و
... نیز شامل شود .
کد تعیین یک Bean فرزند ( child ) اطلاعات پیکربندی را از کد تعیین مادر خود به ارث میبرد . البته کدهای تعیین عنصر فرزند می تواند برخی مقادیر ارث برده شده را حذف کرده و یا تغییر دهد . همچنین اطلاعات خاصی را به آن اضافه کند .
ارث بری در تعریف Spring Bean ها ، ربطی به ارث بری کلاس ها در java ندارد ، اما چهارچوب کلی کار یکی است . شما میتوانید تعریف یک Bean مادر را به عنوان الگو قرار داده و هرچند فرزند که میخواهید خصوصیت آن را به ارث ببرد ، از رویش بسازید .
در فایل های پیکربندی اطلاعت مبتنی بر XML ، مادر یک child توسط خاصیت prent آن تعیین شده و بایستی برابر با نام مادر خود باشد .
مثال عملی :
برای درک بهتر مفهوم ارث بری در Spring ، یک پروژه عملی را با انجام مراحل زیر در نرم افزار Eclipse اجرا می کنیم :
- یک پروژه جدید Spring با نام Spring Example را ایجاد نموده و سپس در زیر پوشه src یک پکیج به نام com.tahlildadeh ایجاد نمایید .
- همانطور که در درس آموزش ایجاد اولین برنامه Spring نشان دادیم ، کتابخانه های لازم جهت برنامه خود را به وسیله دکمه Add External JARs به پروژه اضافه کنید .
- در زیر مجموعه پکیج com.tahlildadeh ، کلاس های جاوا Hello World و Main App را ایجاد نمایید .
- در پوشه Src ، فایل پیکربندی اطلاعات Beans Configuration را با نام Beans.Xml ایجاد نمایید .
- در مرحله آخر نیز ، محتویات مورد نظر جهت فایل های جاوا ، فایل پیکربندی اطلاعات و سایر فایل ها را برای اجرای برنامه ایجاد نمایید .
کد زیر ، مربوط به فایل پیکربندی اطلاعات پروژه با نام Beans,xml است . در این فایل ما یک شی Bean به نام “helloWorld” را با دو خاصیت messag1 و messag2 تعریف کرده ایم . همچنین شی Bean به نام “helloIndia” را به عنوان فرزند شی “helloWorld” تعیین
کرده ایم . برای این منظور مقدار خاصیت parent عنصر فرزند را برابر با نام عنصر مادر قرار داده ایم .
همانطور که در کد مثال مشاهده می کنید ، عنصر فرزند مقدار خاصیت message2 را از مادر خود به ارث برده ، ولی خاصیت message1 را منتقل نکرده و حذف شده است . همچنین این شی یک خاصیت جدید به نام message3 برای خود تعریف کرده است .
?xml version="1.0" encoding="UTF-8"?>
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
id="helloWorld" class="com.tahlildadeh.HelloWorld">
name="message1" value="Hello World!"/>
name="message2" value="Hello Second World!"/>
id="helloIndia" class="com.tahlildadeh.HelloIndia" parent="helloWorld">
name="message1" value="Hello India!"/>
name="message3" value="Namaste India!"/>
کد زیر نیز محتویات فایل HelloWorld.java را نشان میدهد :
package com.tahlildadeh;
public class HelloWorld {
private String message1;
private String message2;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void getMessage1(){
System.out.println("World Message1 : " + message1);
}
public void getMessage2(){
System.out.println("World Message2 : " + message2);
}
}
کد زیر نیز محتویات فایل HelloIndia,java را تعیین کرده است :
package com.tahlildadeh;
public class HelloIndia {
private String message1;
private String message2;
private String message3;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void setMessage3(String message){
this.message3 = message;
}
public void getMessage1(){
System.out.println("India Message1 : " + message1);
}
public void getMessage2(){
System.out.println("India Message2 : " + message2);
}
public void getMessage3(){
System.out.println("India Message3 : " + message3);
}
}
در نهایت نیز کد زیر مربوط به فایل MainApp.java است .
package com.tahlildadeh;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.getMessage1();
objA.getMessage2();
HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
objB.getMessage1();
objB.getMessage2();
objB.getMessage3();
}
}
پس از تعیین فایل های اصلی برنامه و فایل پیکربندی اطلاعات آن ، برنامه را اجرا کرده و خروجی زیر را تولد خواهد شد :
World Message1 : Hello World! World Message2 : Hello Second World! India Message1 : Hello India! India Message2 : Hello Second World! India Message3 : Namaste India!
اگر به خروجی مثال دقت کنید متوجه می شوید که ما خاصیت message2 را به شی “helloIndia” پاس نداده ایم ، اما به علت ارث بری از مادر خود ، دارای مقدار این خاصیت می باشد .
تعیین یک فایل تعریف Bean به عنوان الگو یا Template
شما میتوانید تعریف یک Bean را به عنوان الگو تعیین کرده و با حداقل کدنویسی ، سایر عناصر فرزند مورد نظر خود را از روی آن بسازید . توجه داشته باشید که در هنگام تعیین یک Bean به عنوان عنصر مادر ( Parent ) نبایستی خاصیت class آن را مقدار دهی کرده و از طرف دیگر خاصیت abstract آن را برابر true قرار دهید . همانطور که در کد زیر نشان داده شده است :
xml version="1.0" encoding="UTF-8"?>
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
id="beanTeamplate" abstract="true">
name="message1" value="Hello World!"/>
name="message2" value="Hello Second World!"/>
name="message3" value="Namaste India!"/>
id="helloIndia" class="com.tahlildadeh.HelloIndia" parent="beanTeamplate">
name="message1" value="Hello India!"/>
name="message3" value="Namaste India!"/>
در مثال فوق ، شی Bean مادر هیچ گاه نمی تواند تولید و مقدار دهی شده و هیچ نسخه ای از آن ساخته نمی شود . به دلیل اینکه تعریف آن ناقص بوده و همچنین به عنوان یک عنصر abstract ( مطلق ) تعیین شده است . عناصر Bean ای که همانند کد فوق به صورت abstract تعیین می شوند ، فقط قادرند به عنوان یک الگو و template عمل کرده و عناصر دیگر از روی آنها ساخته شوند .