آشنایی با چرخه حیات یک Bean در Spring
چرخه حیات یک Spring Bean بسیار ساده و قابل فهم است . هنگامی که یک Bean ، ایجاد می شود چند مرحله مقدار دهی اولیه برای آن لازم است تا به یک وضعیت با ثبات برسد . از طرف دیگر ، هنگامی که به یک Bean دیگر نیازی نداریم و بایستی از Container حذف شود ،چند مرحله عملیات
پاکسازی بایستی انجام شود . رابط کاربری org.springframework.beans.factory.InitializingBean یک متد تنها به صورت زیر را تعیین کرده است : بنابراین شما می توانید رابط کاربری فوق را به برنامه خود اضافه کرده و درون آن ، تمامی کدهایی که میخواهید در مرحله مقدار دهی اولیه و ایجاد یک Bean رخ دهد را در تابع afterpropertiesSet() همانند مثال زیر بنویسید : در فایل های پیکربندی اطلاعات مبتنی بر XML ، شما میتوانید از خاصیت init-method برای تعیین نام یک تابع برای اجرا در مقداردهی اولیه استفاده کنید . این تابع نه خروجی داشته ( Void ) و نه آرگومان دریافت می کند . مثل کد زیر : همچنین نحوه تعریف کلاس آن نیز به صورت زیر است : رابطه کاربری +آدرس یک متد تنها را به صورت زیر تعیین کرده است : بنابراین شما می توانید رابطه کاربری فوق را به برنامه خود اضافه کرده و درون آن ، کارهایی که میخواهید در زمان ازبین رفتن یک Bean رخ دهد را در تابع destroy() به صورت زیر قراردهید : در فایل های پیکربندی اطلاعات مبتنی بر XML ، شما میتوانید از خاصیت destroy-method برای اجرا در هنگام تخریب کد شی Bean استفاده کنید . این تابع نه خروجی داشته (Void است ) و نه آرگومانی دریافت می کند . همانند کد زیر : همچنین نحوه تعریف کلاس آن نیز به صورت زیر است : اگر شما درحال استفاده از Spring IOC Container در یک محیط غیر وب ، مثل یک نرم افزار سطح بالای تحت کلاینت هستید ، میتوانید به وسیله JVM یک تله برای خاموش شدن برنامه خود تعیین کنید . کد زیر نیز مربوط به فایل MainApp. java می باشد . در این کد نیاز دارید تا یک تله Shutdown را به نام registershutdownHook() به کلاس AbstractApplicationContent اضافه کنید . این تله که درواقع یک متد destroy () است ، در هنگام ازبین رفتن هرشی رخ داده
و کلیه عملیاتهای تعیین شده برای تخریب شی را انجام داده منابع سیستم ( حافظه ، کش و... ) را آزاد می کند : کد زیر نیز مربوط به فایل پیکربندی اطلاعات Bean.Xml است که در آن متدهای مربوط به destroy تعیین شده اند : پس از ایجاد فایل های اصلی برنامه و فایل پیکربندی اطلاعات ، میتوانید پروژه را اجرا نمایید . اگر همه چیز درست باشد ، برنامه خروجی زیر را تولید خواهد کرد : اگر در برنامه خود تعداد زیادی Bean با متدهای initialization و destroy با نام مشابه دارید ، لازم نیست تا برای هر Bean متدهای init-method و destroy-method را بنویسید .
بنابراین ، از زمان ایجاد تا نابود شدن یک Bean ، مجموعه ای از فعالیت ها در پشت صفحه برنامه رخ میدهد . اما در این درس ، ما فقط دو رویداد ( Callback method ) مهمی که در هنگام ایجاد و ازبین رفتن یک Bean لازم و ضروری هستند را بررسی و تشریح میکنیم .
برای تعیین یک اجرا و پایان جهت هر Bean ، درهنگام تعریف
رویدادهای مقداردهی اولیه ( Initialization Callback )
void afterPropertiesSet() throws Exception;
public class ExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
id="exampleBean"
class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
}
رویدادهای تخریب شی ( Pestruction Callback ) :
void destroy() throws Exception;
public class ExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work
}
}
id="exampleBean"
class="examples.ExampleBean" destroy-method="destroy"/>
public class ExampleBean {
public void destroy() {
// do some destruction work
}
}
انجام کار فوق باعث اجرای یک Shutdown بسیار خوب در سیستم شده و تمامی رویدادهای مرتبط با عملیات تخریب اشیای Bean یا ( destroy ) را به درستی اجرا می کند . بنابراین کلید منابع سیستم به طور صحیح آزاد می شوند .
توصیه ما به شما این است که حدامکان از توابع DisposableBean و Initialization در برنامه های خود استفاده نکنید . به جای آنها از XML بهره بگیرید ، زیرا انعطاف پذیری بهتری در نام دهی به متدهای برنامه شما دارد .
مثال عملی : با ارایه یک مثال عملی در محیط کاری برنامه Eclipse ، مطالب آموزشی فوق رادر عمل بررسی خواهیم کرد . برای این منظور ، مراحل زیر را انجام دهید :
package com.tahlildadeh;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
public void init(){
System.out.println("Bean is going through init.");
}
public void destroy(){
System.out.println("Bean will destroy now.");
}
}
package com.tahlildadeh;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
}
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"
init-method="init" destroy-method="destroy">
name="message" value="Hello World!"/>
Bean is going through init.
Your Message : Hello World!
Bean will destroy now.
متدهای مقداردهی اولیه و تخریب پیش فرض برنامه
به جای این کار میتوانید از قابلیت ویژه چهارچوب Spring برای تعیین متدهای پیش فرض تولید اولیه و تخریب Bean ها استفاده کنید . این متدها درصورتی که یک Bean ، متدهای از پیش تعیین شده نداشته باشد ، برآن اعمال میشوند . برای این منظور بایستی از متدهای default-init-method و
default-destroy-method در المنت
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"
default-init-method="init"
default-destroy-method="destroy">
id="..." class="...">