فریمورک اسپرینگ

آنچه در این صفحه می خوانید:

معرفی فریمورک اسپرینگ (Spring MVC)

Spring یک فریمورک کاربردی جهت کنترل کانتینر برای پلتفرم جاوا است. ویژگی های اصلی این فریمورک توسط هر برنامه جاوا قابل استفاده است، اما افزونه هایی برای ساخت برنامه های وب در بالای پلتفرم Java EE وجود دارد. اگرچه این فریمورک هیچ مدل برنامه نویسی خاصی را تحمیل نمی کند، اما در جامعه جاوا بعنوان یک برنامه افزودنی یا حتی جایگزینی برای مدل Enterprise JavaBeans محبوبیت پیدا کرده است. Spring MVC در ساخت برنامه های وب انعطاف پذیر همکاری می کند. الگوی طراحی Model-View-Controller در تفکیک منطق تجارت، منطق View و منطق کنترل کمک می کند. مدل ها وظیفه رمزگذاری داده های برنامه را دارند. View با کمک شی مدل رسپانسیو را به کاربر می دهند. کنترل کننده ها وظیفه دریافت درخواست از کاربر و تماس با سرویس back-end را دارند. شکل زیر جریان درخواست ها را در فریمورک Spring MVC نشان می دهد.

اسپرینگ دیسپچر

فریمورک اسپرینگ در اطراف DispatcherServlet طراحی شده است که کلیه درخواست ها و پاسخ های HTTP را کنترل می کند. هنگامی که یک درخواست به فریمورک Spring MVC ارسال می شود، دنباله ای از وقایع اتفاق می افتد، شامل:

  • DispatcherServlet ابتدا درخواست را دریافت می کند.
  • DispatcherServlet با HandlerMapping مشاوره می کند و کنترل کننده مرتبط با درخواست را فراخوانی می کند.
  • Controller با فراخوانی متد های سرویس مناسب، درخواست را پردازش می کند و یک شی ModelAndView را به DispatcherServlet باز می گرداند. شی ModelAndView شامل داده های مدل و نام View است.
  • DispatcherServlet نام View را به یک ViewResolver می فرستد تا View واقعی را برای استعلام پیدا کند.
  • حال، DispatcherServlet شی مدل را به Viewش منتقل می کند تا نتیجه را نمایش دهد.
  • View با کمک داده های مدل نتیجه را به کاربر باز می گرداند.

ویژگی های فریمورک اسپرینگ (Spring MVC)

AutoConfiguration

ممکن است قبلاً با برنامه های وب جاوا مبتنی بر Spring کار کرده باشید، که به یک پایگاه داده رابطه ای وصل می شود، به عنوان مثال برای یک پایگاه داده در حافظه مانند H2، همانطور که می دانید، باید JdbcTemplate را به عنوان bean اعلام کنید و همچنین باید پیکربندی DataSource را انجام دهید، که این بستگی به الگوی JDBC دارد.در یک برنامه مدرن اسپرینگ که از پیکربندی مبتنی بر جاوا استفاده می کند، باید دو روش زیر را در کلاس پیکربندی خود اضافه کنید:

@Bean

public JdbcTemplate jdbcTempalte(DateSource ds){
   return new JdbcTempalte(ds);
}

@Bean
public DataSource dataSource(){
  return new EmbeddedDatabaseBuilder()
     .setType(EmbeddedDatabaseType.H2)
     .addScripts('ddl.sql', 'data.sql')
     .build();
}

این واقعاً برای کسی که پیش از این توسعه Spring را انجام داده، پیچیده نیست، اما اگر تازه کار را شروع کرده اید، می تواند ساعت ها و روزها طول بکشد تا این موضوع را کشف کند. اما مهمتر از همه، این تکه کد است که البته این کد منحصر به فرد نیست و هر برنامه Spring که با JDBC کار می کند به آن احتیاج دارد. این جایی است که روش AutoConfiguration وارد صحنه می شود. این حضور کلاس خاصی را در Classpath تشخیص می دهد و سپس بطور خودکار آن را برای شما پیکربندی می کند. به عنوان مثال، اگر الگوی JDBC را به کلاس و H2.jar خود اضافه کرده اید، آنگاه Spring Boot می تواند به طور خودکار یک پایگاه داده حافظه را برای شما و یک الگوی JDBC تنظیم کند، که آماده استفاده است. برای استفاده از الگوی JDBC در لایه DAO نیازی به نوشتن کد بالا ندارید.

این فقط یک مثال است. تنظیمات خودکار Spring Boot بیش از 200+ تصمیم گیری از این قبیل را انجام می دهد و با بررسی وابستگی های JAR، بسیاری از عملکردها را پیکربندی می کند. به عنوان مثال، اگر Spring-mvc.jar موجود باشد، می تواند بطور خودکار DispatcherServlet ،InteriorViewResolver و غیره را پیکربندی کند. اگر JPA و Hibernate حضور داشته باشند، می تواند آن را پیکربندی کند و اگر Spring-Security.jar دارید، حتی می توانید امنیت اولیه را برای محافظت از برنامه خود پیکربندی کنید.

ویژگی تنظیمات خودکار به طور پیش فرض غیرفعال است و شما باید آن را با استفاده ازEnableAutoConfiguration یا حاشیه نویسی SpringBootApplication در کلاس تنظیمات خود فعال کنید. به طور خلاصه، ویژگی پیکربندی خودکار Spring Boot باعث صرفه جویی در کار زیادی می شود و زمان توسعه را کاهش می دهد و توصیه می شود هر زمان که از Boot Spring استفاده می کنید از پیکربندی خودکار استفاده کنید.

Starter POMs

در حالی که AutoConfiguration درد پیکربندی ویژگی های مشترک را کاهش می دهد، POM های Starter با پیدا کردن و اضافه کردن وابستگی های متداول در پروژه شما، دردمندی را از بین می برند. برای ساختن یک برنامه ساده REST مبتنی بر MVC که از جکسون پشتیبانی می کند و آن را در یک کانتینر تعبیه شده اجرا می کنید، حداقل به وابستگی های زیر نیاز دارید:

  • spring-core.jar
  • spring-web.jar
  • spring-webmvc.jar
  • jackson-databind.jar
  • tomcat-embed-core.jar
  • tomcat-embed-el.jar
  • tomcat-embed-logging-juil.jar

با استفاده از POM های Spring Boot Starter یا ویژگی وابستگی starter، می توانید همه این موارد را فقط با افزودن وابستگی Spring-boot-starter-web در pom.xml خود دریافت کنید. بنابراین به جای اضافه کردن تمام این وابستگی ها و نگرانی در مورد نسخه سازگار آنها، فقط کافی است یکی از آنها را اضافه کنید. همچنین شما اطمینان بیشتری خواهید داشت که نسخه های آزمایش شده از کتابخانه ها استفاده می شوند و در آینده هیچ گونه ناسازگاری وجود نخواهد داشت. یکی دیگر از مزایای ظریف ویژگی Starter POMs این است که نیازی به یادآوری یا جستجوی وابستگی ها نیست. اگر در حال ساختن یک برنامه کاربردی وب هستید، می توانید یک استارتر "وب" اضافه کنید. اگر در حال ساختن برنامه JPA هستید، می توانید با جمع آوری وابستگی ها و کارکردهای مشترکی که Spring Boot آسان به خاطر سپردن و استفاده از آن می دهد، استارت "JPA" را اضافه کنید.

Spring Boot CLI

در ابتدا گفته شد که اکنون می توان یک برنامه وب جاوا ایجاد کرد که بتواند در یک توییت متناسب باشد. این اتفاق به دلیل Groovy و Spring Boot CLI رخ می دهد. Spring Boot CLI یک رابط خط فرمان است که توسط فریمورک Spring Boot تهیه شده است و به شما امکان می دهد با استفاده از زبان برنامه نویسی Groovy برنامه های وب مبتنی بر Spring ایجاد کنید. در واقع، Groovy و Spring Boot به خوبی یکدیگر را تکمیل می کنند. Groovy در صدد ساده تر ساختن جاوا است، در حالی که Spring Boot با هدف ساده تر ساختن برنامه های Spring و هر دو از سادگی یکدیگر بهره مند است. همچنین در حالی که پیکربندی خودکار و وابستگی های استارتر یک ویژگی جدایی ناپذیر Spring Boot هستند، Spring CLI اختیاری است. همچنین برای استفاده از آن باید Spring CLI را نصب کنید.

Actuator

Actuator یا فعال کننده یکی دیگر از ویژگی های جذاب Spring Boot است که اجازه می دهد تا آنچه را که در داخل یک برنامه اجرا کننده Spring Boot اجرا می شود ببینید. با وجود خوب بودن در تنظیمات خودکار، این خطر وجود دارد که نمی دانید چه چیزی در برنامه شما وجود دارد و خطر ابتلا به آن توسط Spring Actuator مرتفع می شود. این بینش و معیارهای زیادی راجع به اجرای برنامه های کاربردی در تولید فراهم می کند. به عنوان مثال، با استفاده از Actuator می توانید دقیقاً بدانید که bean در فریمورک Application پیکربندی شده است، تصمیمات پیکربندی خودکار گرفته شده، چه متغیرهای محیطی، خصوصیات سیستم، آرگومان های خط فرمان برای یک برنامه کاربردی و موارد دیگر وجود دارد. حتی می توانید اثری از درخواست های HTTP توسط این برنامه به همراه معیارهای مختلف کاربردهای مفید، دریافت کنید.به عنوان مثال استفاده از پردازنده و حافظه، جزئیات جمع آوری زباله، درخواست های وب و منبع داده مورد استفاده. Spring Boot Actuator همچنین چندین نقطه پایانی برای بازیابی این داده ها، به عنوان مثال فراهم می کند. می توانید با استفاده از API RESTful، همه این موارد را بدست آورید، یا می توانید با ویژگی Shell از راه دور استفاده کنید تا به راحتی در برنامه وارد شوید و با صدور دستورات تمام این اطلاعات را دریافت کنید.

همچنین با استفاده از JMX MBeans تمام این قابلیت ها را در معرض دید شما قرار می دهد، به این معنی که می توانید آنها را در زمان اجرا با استفاده از یک مشتری JMX مانند JConsole کنترل کنید. در عین حال، شما همچنین باید دسترسی به نقاط انتهایی Actuator را تضمین کنید زیرا نه تنها اطلاعات محرمانه را افشا می کند بلکه خطرناک است. به عنوان مثال، هر کسی می تواند برنامه شما را با استفاده از shutdown/ نقاط پایانی متوقف کند. اگرچه، جای نگرانی نیست. شما نیز مانند سایر برنامه های Spring، می توانید از Spring Security برای محافظت از نقاط انتهایی Actuator استفاده کنید.

Spring Boot Initializer

Spring Initializer یکی دیگر از ویژگی های Spring Boot است که با توجه به ساختار پروژه مشکل را حل می کند. این یک برنامه وب است که به شما امکان می دهد پروژه های Maven یا Gradle را با Java ،Kotlin ،Groovy یا Spring Boot تولید کنید. تنها آنچه شما باید ارائه دهید پروژه MetaData در GUI است، به عنوان مثال نام پروژه شما، گروه، مصنوعات و غیره همچنین به شما امکان می دهد وابستگی استارت را از یک لیست بزرگ، انتخاب کنید. به عنوان مثال وب، JPA یا استارت امنیتی. پس از ایجاد یک پروژه، می توانید فایل Zip را بارگیری کرده و سپس به یک IDE مانند Eclipse یا IntelliJ IDEA باز کنید. سپس می توانید این پروژه نمونه را ویرایش کنید تا با کد خود استفاده کنید. طبق تجربه من، یکی از مشکلات رایجی که بسیاری از توسعه دهندگان جاوا و Spring با آن روبرو هستند نحوه شروع یک پروژه است. بسیاری از آنها درباره اینکه آیا می توانند از فایل جاوا، فایل منبع و غیره استفاده کنند، سرسخت هستند.

اگرچه Maven ،Gradle ،IntelliJ IDEA و Eclipse به شما کمک می کنند تا یک ساختار اساسی را به شما ارائه دهیم، اما برای شروع کار لازم است که در این دو مهارت مهارت داشته باشید. Spring Boot Initaizer این مشکل را حل می کند و ایجاد یک برنامه جاوا مبتنی بر Spring را بدون اطلاع واقعی از جزئیات داخلی فریمورک Spring به راحتی امکان پذیر می کند. این در حال حاضر همه در مورد برخی از ویژگی های Spring Boot است که توسعه دهندگان جاوا باید بدانند. این ویژگی ها واقعاً کار با جاوا و Spring را سرگرم کننده و پربار می سازد، به همین دلیل شرکت های بیشتر و بیشتری برای توسعه جاوا از Spring Boot استفاده می کنند.

اسپرینگ بوت (Spring Boot)

اسپرینگ بوت ابزاری برای تنظیم سریع برنامه ها است و به منظور ساخت برنامه های Spring-powered، از تنظیمات خارج از جعبه استفاده می کند. همانطور که ممکن است بدانید، Spring به طیف گسترده ای از ماژول های مختلف را در زیر چتر خود، مانند هسته اسپرینگ، داده های اسپرینگ، اسپرینگ-وب (که به طور کلی شامل MVC اسپرینگ است) و غیره ادغام می کند. با استفاده از این ابزار، می توانید اسپرینگ بگویید که چه تعداد از آنها استفاده خواهند کرد و یک ست سریع برای آنها دریافت خواهید کرد (به شما اجازه داده می شود که بعداً آن را تغییر دهید). بنابراین، Spring MVC فریمورکی است که باید در برنامه های وب مورد استفاده قرار گیرد و Spring Boot یک آغازگر پروژه آماده تولید مبتنی بر اسپرینگ است.

فریمورک اسپرینگ (Spring MVC) چگونه کار می کند؟

ماژول های Spring MVC با توزیع فریمورک Spring به بازار عرضه می شوند. ماژول های Spring MVC از فریمورک Spring به خوبی با سایر فریمورک ها ادغام می شوند. این ماژول ها نیز بسیار گسترده هستند. Spring MVC بر اساس الگوی طراحی MVC است. در اینجا لیست کلاس های کلیدی Spring MVC آمده است.

  • DispatcherServlet: در فایل web.xml پیکربندی شده است و الگوهای URL مورد نیاز در این Servlet نقشه برداری شده است. به عنوان کنترل کننده فرانت کار می کند و تمام درخواست کاربر را انجام می دهد.
  • ModelAndView: این کلاس به عنوان نگهدارنده برای Model و View در Spring MVC کار می کند.
  • کنترلر SimpleFormController: اجرای Concrete FormController است. این فرم قابل تنظیم و دیدگاه های موفقیت و یک زنجیره onSubmit برای برجسته کردن راحت تر است. در صورت بروز خطاهای اعتبار سنجی، به صورت خودکار از View فرم دوباره ارسال می شود و در صورت ارسال معتبر، View موفقیت را نمایش می دهد.

نمودار زیر معماری ساده Spring MVC را نشان می دهد:

معماری فریمورک اسپرینگ

بیایید درک کنیم که توالی وقایع، زمانی اتفاق می افتد که یک درخواست توسط MVC Spring دریافت می شود. رویدادهای زیر هنگام درخواست DispatcherServlet اتفاق می افتند:

  • DispatcherServlet پیکربندی شده در فایل web.xml درخواست را دریافت می کند.
  • DispatcherServlet کنترلر مناسب را با کمک HandlerMapping پیدا کرده و سپس Controller همراه را فراخوانی می کند.
  • سپس Controller منطق بیزنس را اجرا می کند (اگر توسط برنامه نویس نوشته شده باشد) و سپس شیء ModeAndView را به DispatcherServlet بازگرداند.
  • DispatcherServlet View را از شی ModelAndView تعیین می کند.
  • سپس DispatcherServlet شی مدل را به View منتقل می کند.
  • View ارائه شده و Dispatcher Servlet خروجی را به کانتینر Servlet می فرستد. سرانجام Servlet Container نتیجه را به کاربر ارسال می کند.

مثال های فریمورک اسپرینگ (Spring MVC)

در زیر فایل pom.xml شامل وابستگی هایی برای Spring MVC و پشتیبانی از taglibs برای نوشتن فایل های JSP است.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.howtodoinjava.demo</groupId>
    <artifactId>springmvcexample</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>springmvcexample Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
     
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
         
        <!-- Spring MVC support -->
         
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
         
        <!-- Tag libs support for view layer -->
         
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>runtime</scope>
        </dependency>
         
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
            <scope>runtime</scope>
        </dependency>
 
    </dependencies>
     
    <build>
        <finalName>springmvcexample</finalName>
    </build>
</project>

این مثال حداقل فایل web.xml برای دریافت انواع درخواست ها، یک servlet را اعلام می کند. servlet دیسپچر در اینجا به عنوان کنترل کننده فرانت عمل می کند.

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     
    <display-name>Spring Web MVC Hello World Application</display-name>
     
    <servlet>
        <servlet-name>spring</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
 
</web-app>
نظرتون درباره این نوشته چیه؟ عالیه بد نیست خوب نبود