📢 اجرای رویدادها با بهار: یک مثال عملی

مقدمه
تصور کنید که شما در حال توسعه یک سیستم پخش موسیقی هستید. هر زمان که کاربر سرویس را امضا کند ، ما می خواهیم چندین عمل را به صورت خودکار انجام دهیم ، مانند ارسال ایمیل خوش آمدید ، اعطای یک دوره تست رایگان و به روزرسانی وضعیت امضا.
به جای اتصال این اقدامات به طور مستقیم در جریان ثبت نام ، می توانیم از رویدادها برای حفظ کد سازمان یافته تر ، انعطاف پذیر و غیرقابل استفاده استفاده کنیم. بیایید ببینیم که چگونه بهار می تواند به ما کمک کند به طور خودکار این کار را انجام دهیم! 😃
🎯 مشکل تجارت
با ثبت یک مشترک جدید ، باید چندین عمل را انجام دهیم:
- ارسال یک ایمیل خوش آمدید
- یک دوره تست رایگان اعطا کنید
- وضعیت کاربر را به روز کنید
یک رویکرد ساده لوحانه به سادگی فراخوانی این روشها به طور مستقیم در جریان ثبت نام خواهد بود ، اما این امر باعث ایجاد اتصال قوی بین اقدامات می شود. ما یک سیستم انعطاف پذیر تر می خواهیم که بتوانیم بدون تغییر منطق اصلی ، رویدادها را اضافه یا حذف کنیم.
🛠 اجرای با رویدادها
ما از بهار برای مدیریت خودکار رویدادها و اقدامات مربوطه آنها استفاده خواهیم کرد.
تعریف کلاس 1 امضا
ما کلاس را ایجاد کردیم Assinatura
نمایندگی یک کاربر مشترک:
public class Assinatura {
private String usuario;
public Assinatura(String usuario) {
this.usuario = usuario;
}
public String getUsuario() {
return usuario;
}
}
2⃣ تعریف رابط رویداد
اول ، ما یک رابط ایجاد کردیم که قرارداد را برای کلیه رویدادهایی که باید پس از ثبت نام جدید اجرا شود ، تعریف کند:
public interface EventoNovaAssinatura {
void processa(Assinatura assinatura);
}
این رابط توسط کلیه کلاس هایی که نیاز به واکنش به یک امضا جدید دارند ، پیاده سازی می شود.
3⃣ اجرای رویدادها
اکنون ما اقدامات خاصی را که باید هنگام ایجاد امضای جدید انجام شود ، پیاده سازی می کنیم.
email ایمیل خوش آمدید
@Service
public class EmailBoasVindas implements EventoNovaAssinatura {
@Override
public void processa(Assinatura assinatura) {
System.out.println("[EMAIL] Bem-vindo, " + assinatura.getUsuario() + "! Sua assinatura foi ativada.");
}
}
🎁 آزمون رایگان اعطا کنید
@Service
public class TesteGratis implements EventoNovaAssinatura {
@Override
public void processa(Assinatura assinatura) {
System.out.println("[TESTE GRÁTIS] Usuário " + assinatura.getUsuario() + " recebeu um período de teste de 7 dias!");
}
}
✅ وضعیت امضای را به روز کنید
@Service
public class AtualizaStatus implements EventoNovaAssinatura {
@Override
public void processa(Assinatura assinatura) {
System.out.println("[STATUS] Assinatura de " + assinatura.getUsuario() + " ativada com sucesso!");
}
}
کلاس 4 که وقایع را ارکستر می کند
ما خدمتی ایجاد کردیم که به طور خودکار اجرای رویدادها را مدیریت می کند:
@Service
public class EventosNovaAssinatura {
@Autowired
private Set<EventoNovaAssinatura> eventos;
public void processa(Assinatura assinatura) {
eventos.forEach(evento -> evento.processa(assinatura));
}
}
در اینجا ، بهار به طور خودکار تمام لوبیا هایی را که پیاده سازی می کنند تزریق می کند EventoNovaAssinatura
هیچ Set
بشر این بدان معنی است که هر زمان که یک اجرای جدید اضافه کنیم ، بدون نیاز به تغییر چیزی در کد اصلی ثبت می شود! 🎉
🎯 چگونه بهار به طور خودکار وقایع را تزریق می کند؟
بهار اسکن به طور خودکار تمام کلاسهای ذکر شده با @Service
رابط EventoNovaAssinatura
بشر او تمام این موارد را در آن تزریق می کند Set
اطمینان از پردازش تمام رویدادها به درستی و بدون پیکربندی دستی.
این به دنبال کنترل اصل معکوس و به شما امکان می دهد بدون تغییر کد اصلی ، رویدادهای جدید را اضافه کنید و سیستم را مدولار تر و آسان تر کنید. ✅
گزینه های گسترش رویداد
استفاده از رویدادها به ما امکان می دهد اقدامات جدید را به سادگی اضافه کنیم. برخی از پیاده سازی های احتمالی که می توانند به جریان ما اضافه شوند:
- 📦 ادغام با پیام رسان ها: رویدادها را در RabbitMQ یا Kafka برای پردازش ناهمزمان منتشر کنید.
- 🔔 اعلان ها را فشار دهید: اعلان ها را به تلفن همراه کاربر ارسال کنید.
- 💳 اتهام خودکار: برای فعال کردن هزینه مکرر با یک سیستم پرداخت ادغام شوید.
- 📊 ثبت معیارها: داده ها را به یک سیستم نظارت ، مانند پرومتئوس ارسال کنید.
- 🛠 سفارشی سازی پیشرفته: یک گردش کار ایجاد کنید که به مدیران اجازه می دهد تا رویدادها را بصورت پویا فعال یا غیرفعال کنند.
🛠 الگوها و اصول
🔄 استاندارد ناظر
در مثال ما از ناظر پیش فرض، جایی که کلاس EventosNovaAssinatura
به عنوان یک عمل می کند موضوع که مجموعه ای از ناظران (EventoAssinaturaConfirmada
). این الگوی به شما امکان می دهد منطق اطلاع رسانی جریان اصلی را نادیده بگیرید ، و اطمینان حاصل کنید که می توان اقدامات جدید را بدون اصلاح کد موجود اضافه کرد.
این هماهنگ با اصل باز (OCP – اصل باز/بسته)، زیرا ما می توانیم بدون تغییر اجرای برنامه ، رویدادهای جدیدی را اضافه کنیم EventosNovaAssinatura
بشر فقط یک کلاس جدید ایجاد کنید که پیاده سازی کند EventoAssinaturaConfirmada
و بهار به طور خودکار آن را ضبط می کند.
🔌 کنترل معکوس و تزریق وابستگی ها
بهار باعث می شود مدیریت وابستگی خودکار با تزریق پویا همه پیاده سازی ها EventoAssinaturaConfirmada
در داخل Set
بشر این امر نیاز به فوری دستی این اشیاء را از بین می برد و مقیاس پذیری و آزمایش کد را تسهیل می کند.
این رویکرد به دنبال اصل وابستگی معکوس (اصل وارونگی وابستگی)، زیرا کلاس های سطح بالا (EventosNovaAssinatura
) به طور مستقیم به اجرای مشخص وقایع وابسته نیست ، بلکه به انتزاع (EventoAssinaturaConfirmada
).
princip اصل مسئولیت واحد (SRP – اصل مسئولیت واحد)
هر کلاس از کد ما دارد یک مسئولیت واحد:
-
EventosNovaAssinatura
: مسئول پردازش امضاها و اطلاع رسانی به وقایع. -
NotificacaoEmail
: ارسال ایمیلی برای تأیید امضای. -
GerarRelatorio
: سیستم را با گزارش جدید به روز می کند. -
Assinatura
: یک امضای وضعیت تأیید را نشان می دهد.
این طرح مدولار سازمان کد را بهبود می بخشد و تعمیر و نگهداری را تسهیل می کند زیرا هر کلاس روی یک کار واحد تمرکز می کند.
📚 نتیجه گیری
با این رویکرد ، ما یک سیستم انعطاف پذیر ، مدولار و گسترش یافته به دست آوردیم و به شما امکان می دهیم بدون تغییر کد موجود ، اعلان های جدید را اضافه کنید. استفاده از ناظر پیش فرض، ترکیب شده با تزریق وابستگی بهار، به ما کمک می کند تا یک کد هماهنگ با اصول جامد ، بهبود قابلیت آزمایش ، نگهداری و مقیاس پذیری برنامه
اگر این محتوا را دوست داشتید ، آن را با سایر توسعه دهندگان به اشتراک بگذارید و به گسترش شیوه های خوب در توسعه جاوا کمک کنید! 💡