Spring @PostConstruct و @PreDestroy

عند تكوين Spring Beans باستخدام حقن الاعتماد، نرغب في بعض الأحيان في التأكد من أن كل شيء قد تم تهيئته بشكل صحيح قبل أن يبدأ فول الفول في خدمة طلبات العميل. بالمثل، عندما يتم تدمير السياق، قد نضطر إلى إغلاق بعض الموارد المستخدمة بواسطة حبة الربيع.

الربيع @PostConstruct

عندما نضيف تعليقًا للطريقة في Spring Bean بتعليق @PostConstruct، يتم تنفيذه بعد تهيئة حبة الربيع. يمكن أن يكون لدينا طريقة واحدة فقط مشار إليها بتعليق @PostConstruct. هذا التعليق هو جزء من API للتعليمات البرمجية المشتركة وهو جزء من وحدة JDK javax.annotation-api. لذا، إذا كنت تستخدم هذا التعليق في جافا 9 أو أعلى، فسيتعين عليك إضافة هذا الجر إلى مشروعك بشكل صريح. إذا كنت تستخدم Maven، فيجب إضافة الاعتماد أدناه إليه.

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.2</version>
</dependency>

إذا كنت تستخدم Java 8 أو إصدار أقل، فلن تحتاج إلى إضافة الاعتماد أعلاه.

الربيع @PreDestroy

عندما نعلّم طريقة Spring Bean بتعليق PreDestroy، فإنه يتم استدعاؤه عندما يتم إزالة مثيل البن من السياق. هذه نقطة مهمة جدًا لفهمها – إذا كان نطاق البن الربيعي “prototype” ، فليس من إدارته بالكامل بواسطة حاوية الربيع ولن يتم استدعاء طريقة PreDestroy. إذا كان هناك طريقة تسمى shutdown أو close، فسيحاول حاوية الربيع تكوينهما تلقائيًا كطرق استدعاء عندما يتم تدمير البن.

الربيع @PostConstruct و@PreDestroy مثال

هنا بن ربيعي بسيط مع طرق @PostConstruct و@PreDestroy.

package com.journaldev.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class MyBean {

	public MyBean() {
		System.out.println("MyBean instance created");
	}

	@PostConstruct
	private void init() {
		System.out.println("Verifying Resources");
	}

	@PreDestroy
	private void shutdown() {
		System.out.println("Shutdown All Resources");
	}

	public void close() {
		System.out.println("Closing All Resources");
	}
}

لاحظ أنني قمت أيضًا بتعريف طريقة close للتحقق مما إذا تم استدعاؤها عندما يتم تدمير البن الخاص بنا أم لا. هنا صنف تكوين الربيع البسيط الخاص بي.

package com.journaldev.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration {
	
    @Bean
    @Scope(value="singleton")
    public MyBean myBean() {
	return new MyBean();
    }
	
}

I don’t need to explicitly specify my bean as a singleton but I will later change its value to “prototype” and see what happens with @PostConstruct and @PreDestroy methods. Here is my main class where I am creating spring context and getting few instances of MyBean.

package com.journaldev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MySpringApp {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.register(MyConfiguration.class);
		ctx.refresh();

		MyBean mb1 = ctx.getBean(MyBean.class);
		System.out.println(mb1.hashCode());

		MyBean mb2 = ctx.getBean(MyBean.class);
		System.out.println(mb2.hashCode());

		ctx.close();
	}

}

عند تشغيل الصنف أعلاه، نحصل على الإخراج التالي.

MyBean instance created
Verifying Resources
1640296160
1640296160
Shutdown All Resources
Closing All Resources

لذا يتم استدعاء طريقة @PostConstruct بعد ت實例ة الفاصلة. عندما يتم إغلاق السياق، يتم استدعاء كل من طريقتي shutdown و close.

Spring @PostConstruct و @PreDestroy بنطاق Prototype

قم بتغيير قيمة النطاق إلى prototype في MyConfiguration وقم بتشغيل الفئة الرئيسية. ستحصل على الناتج كما هو موضح أدناه.

MyBean instance created
Verifying Resources
1640296160
MyBean instance created
Verifying Resources
1863374262

لذلك من الواضح أن حاوية Spring تقوم بتهيئة الفاصلة في كل طلب، ثم تقوم بإستدعاء طريقتها @PostConstruct ومن ثم تسليمها إلى العميل. في هذه الحالة، لا تدير Spring الفاصلة بعد ذلك، وفي هذه الحالة، يجب على العميل أداء جميع أعمال تنظيف الموارد عن طريق استدعاء طريقة PreDestroy بشكل مباشر.

ملخص

@PostConstruct و @PreDestroy والتعليقات الهامة للاستخدام مع إدارة دورة حياة حاوية Spring. يمكننا استخدامها للتحقق من أن الحاوية تم تهيئتها بشكل صحيح ثم إغلاق جميع الموارد عند إزالة الحاوية من سياق Spring.

يمكنك التحقق من كود المشروع الكامل من مستودع GitHub الخاص بنا.

Source:
https://www.digitalocean.com/community/tutorials/spring-postconstruct-predestroy