BeanPostProcessor چیست و چه کاربردی دارد ؟
رابط کاربری BeanPostProcessor ، متدهای وابسته ای را تعیین می کند که به وسلیه آنها میتوانید دستورات برنامه نویسی مورد نظر خود را در برنامه اجرا کنید . شما همچنین می توانید یکسری منطق های کدنویسی را پس از اینکه Spring IOC Container یک شی Bean را مقدار دهی ، تنظیم و
ایجاد نمود ، تعیین و اجرا نمایید . این کار بوسیله متصل کردن یک یا چند BeanPostProcessor به برنامه انجام می شود .
شما می توانید چندین رابط کاربردی BeanPostProcessor را در برنامه تعیین نموده و ترتیب اجرای آنها را بوسیله خاصیت crder که توسط رابط ordered هر BeanPostProcessor فراهم شده است ، کنترل کنید .
هر BeanPostProcessor برروی هرنمونه ایجاد شده ازیک Bean یا object عملیات انجام میدهد . به این معنا که ابتدا Spring IOC Container ، نسخه ای از هر Bean را تولید کرده و سپس BeanPostProcessor ، عملیات و کدهای خود را برروی آن انجام می دهد .
یک Application Context ، هر شی Bean ای که در هنگام پیاده سازی رابط Bean Post Processsor تعیین میشود را شناسایی میکند .
پس این Bean هارا به عنوان Post-Processors ثبت نموده ، تا Container برنامه در هنگام ایجاد هر Bean ، به موقع فراخوانی شود .
مثال عملی :
در مثال های عملی زیر به آموزش نوشتن ، ثبت و استفاده از BeanPostProcessor درون یک Applicationtext پرداخته ایم .
برای این منظور یک پروژه جدید Spring را در محیط Eclipse ایجاد نموده و مراحل زیر را انجام دهید :
- یک پروژه جدید Spring با نام Spring Example را ایجاد نموده و سپس در زیر پوشه src یک پکیج به نام com.tahlildadeh ایجاد نمایید .
- همانطور که در درس آموزش ایجاد اولین برنامه Spring نشان دادیم ، کتابخانه های لازم جهت برنامه خود را به وسیله دکمه Add External JARs به پروژه اضافه کنید .
- در زیر مجموعه پکیج com.tahlildadeh ، کلاس های جاوا Hello World و Main App را ایجاد نمایید .
- در پوشه Src ، فایل پیکربندی اطلاعات Beans Configuration را با نام Beans.Xml ایجاد نمایید .
- در مرحله آخر نیز ، محتویات مورد نظر جهت فایل های جاوا ، فایل پیکربندی اطلاعات و سایر فایل ها را برای اجرای برنامه ایجاد نمایید .
کد زیر محتویات فایل HelloWorld.java را نشان میدهد :
package com.tutorialspoint;
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.");
}
}
مثال فوق ، یک نمونه ساده از پیاده سازی BeanPostProcessor است که در آن نام یک Bean ، قبل و بعد از ایجاد هر نسخه از شی Bean ، چا میشود . شما میتوانید کدهای سطح بالاتری را نیز به قبل و بعد از ایجاد یک Bean اضافه نمایید ، زیرا از طریق هر دو متد موجود در Post Processor
به آن Bean دسترسی کامل دارید .
کد زیر نیز محتویات فایل InitHelloWorld.java رانشان میدهد :
package com.tutorialspoint;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
}
}
همچنین کد زیر محتویات فایل اصلی پروژه یا MainApp.java را نشان میدهد . در این فایل نیاز دارید تا یک تله shutdown را که توسط registerShutdownHook() تعیین شده است را در کلاس Abstroct Application Context قرار دهید . قرار دادن این تله shutdown باعث می شود تا برنامه یک خروج مطمئن داشته و پس از اتمام کار ، با اجرای متدهای destroy تعیین شده ، منابع سیستم به طور کامل آزاد شوند .
package com.tutorialspoint;
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();
}
}
کد زیر نیز محتویات مربوط به فایل پیکربندی اطلاعات Beans.xml رانشان داده که در آن متدهای init و destroy اشیای برنامه تعیین شده اند :
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.tutorialspoint.HelloWorld"
init-method="init" destroy-method="destroy">
name="message" value="Hello World!"/>
class="com.tutorialspoint.InitHelloWorld" />
پس از اینکه فایل های اصلی برنامه و فایل پیکربندی اطلاعات را درست کردیم ، میتوانیم برنامه را اجرا نماییم . اگر همه چیز درست باشد ، برنامه بایستی خروجی زیر را تولید نماید :
BeforeInitialization : helloWorld Bean is going through init. AfterInitialization : helloWorld Your Message : Hello World! Bean will destroy now.