PostConstruct in Spring | انوتیشن PostConstruct در اسپرینگ
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
@PostConstruct
یک annotation استاندارد در چرخه حیات bean است که به Spring دستور میدهد متد نشانهگذاریشده را دقیقاً یکبار، بلافاصله پس از تزریق تمام وابستگیها و مقداردهی ویژگیهای bean اجرا کند.
- Bean Lifecycle
مراحل مختلف حیات یک bean در کانتینر Spring از لحظه ایجاد نمونه (Instantiation)، تزریق وابستگیها (Dependency Injection)، اجرای متدهای راهاندازی مانند @PostConstruct تا مرحله نابودی (Destruction).
- Database Seeding
فرآیند مقداردهی اولیه یا پر کردن پایگاهداده با دادههای پیشفرض و تستی در زمان راهاندازی اولیه اپلیکیشن.
- Access Level Flexibility
قابلیت انعطاف در تعیین سطح دسترسی متد @PostConstruct؛ این متد میتواند دارای سطوح دسترسی مختلف مانند public، protected یا حتی private باشد.
موارد مصاحبه ای
- متد نشانهگذاریشده با
@PostConstructدقیقاً در چه زمانی از چرخه حیاتbeanاجرا میشود؟
این متد بلافاصله پس از ساخت نمونه bean و پایان کامل فرآیند تزریق وابستگیها (Dependency Injection و مقداردهی خصوصیات) توسط کانتینر اجرا میشود.
- آیا اجرای متد
@PostConstructوابسته به وجود مقادیر برای مقداردهی است؟
خیر، حتی اگر کلاسی هیچ وابستگی یا ویژگی برای مقداردهی نداشته باشد، Spring همچنان پس از ساخت bean، متد @PostConstruct آن را یکبار اجرا میکند.
- چرا برای مقداردهیهای وابسته به
Dependency Injectionنباید ازConstructorمعمولی استفاده کرد و باید از@PostConstructاستفاده شود؟
در زمان اجرای Constructor، وابستگیهای تزریقشده با @Autowired هنوز مقداردهی نشدهاند و مقدار آنها null است. در نتیجه استفاده از آنها خطای NullPointerException ایجاد میکند؛ در حالی که در زمان اجرای @PostConstruct همه وابستگیها آماده استفاده هستند.
- سطح دسترسی (
Access Modifier) متد@PostConstructچه میتواند باشد؟
این متد میتواند هر سطح دسترسی شامل private، package-private، protected یا public داشته باشد و کانتینر از طریق مکانیزم داخلی آن را فراخوانی میکند.
سناریو کاربردی
- مقداردهی اولیه کاربران در دیتابیس هنگام راهاندازی برنامه
در محیطهای توسعه نیاز است دادههای پایه (مانند کاربر ادمین و کاربر عادی) بلافاصله پس از بالا آمدن برنامه در دیتابیس ثبت شوند:
@Component
public class DbInit {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void postConstruct() {
User admin = new User("admin", "admin password");
User normalUser = new User("user", "user password");
userRepository.save(admin, normalUser);
}
}
در این سناریو، ابتدا Spring نمونه کلاس DbInit را ساخته و وابستگی userRepository را تزریق میکند. سپس با اجرای متد postConstruct، کاربران پیشفرض بدون مشکل null بودن ریپازیتوری در پایگاهداده ذخیره میشوند.
بیشتر بدانید
- تکفراخوانی بودن متد
متد دارای انوتیشن @PostConstruct در طول چرخه حیات هر bean فقط و فقط یکبار اجرا میشود.
- عدم دریافت پارامتر ورودی
متدی که انوتیشن @PostConstruct روی آن قرار میگیرد نباید هیچ پارامتر ورودی دریافت کند (no-arg method).
- نوع بازگشتی متد
خروجی این متد معمولاً void تعریف میشود؛ در صورت برگرداندن مقدار، خروجی توسط کانتینر نادیده گرفته خواهد شد.
