آموزش مقدمات AOP در Spring

AOP در Spring
AOP در Spring

برنامه نویسی جنبه گرا (AOP) ،AOP مخفف عبارت "Aspect Oriented Programming" است که به شیوه ای از برنامه نویسی اشاره دارد که در آن برنامه نویسی به صورت کلی تر و ابسترکت تر انجام می شود و به محصول نهایی قابل توجیه است.

در AOP، به جای تکرار کد برای قابلیت هایی مانند لاگ کردن، پیدا کردن خطا و تراکنشات، از بلوک هایی که به عنوان "مشاهده کننده ها" (aspects) شناخته می شوند، استفاده می شود. این aspects مستقل از کد اصلی برنامه هستند و وظیفه آنها مدیریت قابلیت های مشترک در برنامه است.

به عنوان مثال، فرض کنید که در برنامه شما برای انجام تراکنشات باید هر بار کدی را تکرار کنید که برای شروع و پایان یک تراکنش مورد استفاده قرار می گیرد. با استفاده از AOP، شما می توانید این کد را در یک aspect ذخیره کنید و هربار که برای تراکنشات نیاز دارید، از آن استفاده کنید.

برای استفاده از AOP در Spring، می توانید از ابزارهایی مانند AspectJ و Spring AOP استفاده کنید. با استفاده از این ابزارها، می توانید کد خود را برای اجرای عملیات هایی logging، error checking، caching و… استفاده کنید.

به طور خلاصه، AOP یک روش برنامه نویسی است که به شما این امکان را می دهد که از بلوک هایی که قابلیت های مشترک را برای کد شما فراهم می آورند، استفاده کنید و در نتیجه کدتان را بهبود بخشید.

در Spring برای تعریف Aspect می توانید از انوتیشن های Spring استفاده کنید.

فرض کنید که ما یک سیستم ساده احراز هویت کاربران داریم. به طور خاص، ما یک سرویس ورود (LoginService) داریم که دو متد دارد: login و logout. حال ما می خواهیم قبل و بعد از اجرای هر دو متد، لاگ هایی را بنویسیم تا بفهمیم چه کاری در هنگام ورود و خروج از سیستم انجام شده است. این می تواند با استفاده از AOP انجام شود.

برای شروع، ما باید یک Aspect تعریف کنیم. Aspect ها در واقع قوانینی هستند که به منظور توصیف رفتاری که قرار است در قالب Advice (نظیر قرار دادن لاگ ها) در نقاط مختلف برنامه اجرا شود، تعریف می شوند.

در اینجا ما یک Aspect ساده با نام LoggingAspect ایجاد می کنیم:

@Aspe
@Componen
public class LoggingAspect {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Before(&quotexecution(* com.example.demo.service.LoginService.*(..))&quot)
    public void logBefore() {
        logger.info(&quotBefore method execution&quot);
    }

    @After(&quotexecution(* com.example.demo.service.LoginService.*(..))&quot)
    public void logAfter() {
        logger.info(&quotAfter method execution&quot);
    }
}

در اینجا، ما یک Aspect به نام LoggingAspect تعریف کرده ایم که دارای دو Advice است: logBefore و logAfter. Advice ها در واقع رفتارهایی هستند که در نقاط مختلف برنامه قابل اجرا هستند. در اینجا، Advice های ما قبل و بعد از اجرای متد های login و logout سرویس ورود را شامل می شوند.

همانطور که می بینید، ما از انوتیشن هایی مانند @Aspect و @Before و @After برای تعریف Aspect و Advice استفاده کرده ایم.

همچنین با استفاده از عبارت

execution(* com.example.demo.service.LoginService.*(..))

به Spring می گوییم که می خواهیم این Aspect و Advice ها را برای همه متهای LoginService اجرا شوند

در این کلاس از @Aspect استفاده شده است که نشان می دهد که این کلاس یک Aspect است. همچنین از @Component نیز برای تشخیص این که این کلاس یک کامپوننت Spring استفاده شده است.

همچنین در این کلاس، متدهای logBefore() و logAfter() به عنوان Advice های قبل از اجرای یک متد (Before advice) و بعد از اجرای یک متد (After advice) تعریف شده اند.

توی این مطلب یک توضیح مختصر و یک مثال ساده زدیم در مطالب بعد بیشتر به این موضوع می پردازیم :)