جلسه شماره 117رایگان

PostConstruct in Spring | انوتیشن PostConstruct در اسپرینگ

00:05:09

توضیحات جلسه

🎥 این ویدیو قسمت صد و ششم از بوت‌کمپ رایگان جاوا و پنجمین ویدیو از پلی‌لیست آموزش اسپرینگ است. 📚 در این جلسه به یکی از نیازهای رایج در برنامه‌نویسی اسپرینگ می‌پردازیم: نحوه اجرای یک کد یا متد بلافاصله پس از مقداردهی اولیه یک Bean. برای این کار از انوتیشن قدرتمند PostConstruct استفاده می‌کنیم. اگر می‌خواهید بدانید چگونه عملیات‌های Initialization را در سیکل حیات یک Bean مدیریت کنید، این ویدیو دقیقاً برای شماست. در این قسمت، قوانین مهم استفاده از این انوتیشن را بررسی می‌کنیم تا از بروز خطاهای رایج جلوگیری کنیم. در این جلسه یاد می‌گیریم: ⚙️ مفهوم و کاربرد @PostConstruct در فریم‌ورک اسپرینگ 🎯 چرا و چه زمانی باید از این انوتیشن استفاده کنیم ✅ بررسی قانون اول: نیاز به مدیریت Bean توسط اسپرینگ برای اجرای متد ⚠️ بررسی قانون دوم: الزامات امضای متد (Method Signature) و نکات مربوط به No-Args بودن 🧠 جمع‌بندی نکات کلیدی برای پیاده‌سازی صحیح این قابلیت اگر در حال یادگیری اسپرینگ هستید، درک چرخه حیات Beanها و نحوه اجرای کدهای مقداردهی اولیه از مهارت‌های ضروری است که به تمیزی و پایداری کد شما کمک می‌کند. 📌 یوتیوب: youtube.com/@farzadafi 📌 آپارات: aparat.com/farzadafi 📌 وب سایت: https://farzadafi.ir 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشته باشید می‌توانید در گروه بپرسید تا من یا مربی‌های گروه کمکتان کنیم :) 🎯 بوت‌کمپ رایگان جاوا – آموزش کاملاً پروژه‌محور برای یادگیری عمیق جاوا و ورود به بازار کار.

جزوه و مستندات

مفاهیم کلیدی

  • @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 تعریف می‌شود؛ در صورت برگرداندن مقدار، خروجی توسط کانتینر نادیده گرفته خواهد شد.