Spring Boot vs Spring MVC vs Spring - كيف تقارن؟

الربيع ، ربيع الحذاء ، ربيع MVC ، في كل مكان هناك كلمة "ربيع"! دعنا نتصفح أين ومتى يمكنك استخدام كل من هذه الأدوات.
في هذه المقالة ، سوف ترى مراجعات: Spring ، Spring MVC ، و Spring Boot ، واكتشف المشكلات التي يحلونها ، والمكان الأفضل لتطبيقها. أهم حقيقة تتعلمها هي أن Spring و Spring MVC و Spring Boot لا تتنافس على نفس المكان. إنها تحل مشاكل مختلفة ، وتحلها جيدًا.
ما هي المشكلة الرئيسية التي يحلها إطار الربيع هذا؟
فكر طويلا وشاقا. ما هي المشكلة التي حلها ربيع الإطار؟
لماذا هذا مهم؟ لأنه عندما يتم استخدام DI أو IOC بشكل صحيح ، يمكننا تطوير تطبيقات مقترنة بشكل فضفاض. ويمكن اختبار التطبيقات المزدوجة بسهولة من خلال اختبارات الوحدة.
دعنا ننظر إلى مثال بسيط.
مثال دون حقن التبعية
النظر في المثال أدناه: WelcomeController يعتمد على WelcomeService لتلقي رسالة ترحيب. ماذا يفعل للحصول على مثيل من WelcomeService؟
WelcomeService service = new WelcomeService();
ينشئ هذا السطر مثيلًا لهذه الخدمة. وهذا يعني أنها مرتبطة بقوة. على سبيل المثال ، إذا قمت بإنشاء نموذج وهمية لـ WelcomeService في اختبار الوحدة الخاصة بـ WelcomeController ، فكيف أحصل على WelcomeController لاستخدام النموذج وهمية؟ ليس سهلا!
@RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } }
مثال على حقن التبعية البسيطة
يبدو العالم أسهل بكثير مع حقن التبعية. تركت إطار الربيع يقوم بالعمل الشاق. نحن فقط نستخدم
شرحين بسيطين :
مكون و
Autowired .
- باستخدام Component ، نقول Spring Framework: مرحبًا ، هذه هي الحاوية التي تحتاج إلى إدارتها.
- باستخدام Autowired ، نقول Spring Framework: مرحبًا ، ابحث عن التطابق المناسب لهذا النوع المحدد وقم بتوصيله.
في المثال أدناه ، سينشئ إطار Spring فاصلاً لخدمة WelcomeService ويربطه بـ WelcomeController.
في اختبار الوحدة ، يمكنني أن أطلب من إطار عمل سبرينغ توصيل جهاز الترحيب WelcomeService بـ WelcomeController. (Spring Spring يسهل الأمور من خلال القيام بذلك مع تعليق توضيحيMockBean. لكن هذه قصة أخرى!)
@Component public class WelcomeService {
ماذا حل إطار الربيع؟
المشكلة 1: رمز الازدواجية / التلوث
هل يتوقف إطار الربيع مع حقن التبعية؟ لا. وهو يعتمد على المفهوم الأساسي لحقن التبعية مع وحدات الربيع المتعددة.
- الربيع jdbc
- ربيع mvc
- الربيع aop
- ربيع orm
- ربيع jms
- اختبار الربيع
دعونا نتحدث عن Spring JMS و Spring JDBC للحظة.
هل تجلب هذه الوحدات وظائف جديدة؟ لا. يمكننا أن نفعل كل هذا على J2EE أو Java EE. إذن ما الذي يجلبونه؟ أنها تجلب التجريدات البسيطة. الغرض من هذه التجريدات هو:
- تقليل رمز Boilerplate / تقليل الازدواجية
- تعزيز قطع / تمديد قابلية الاختبار
على سبيل المثال ، تحتاج إلى رمز أقل بكثير لاستخدام JDBCTemplate أو JMSTemplate مقارنة بـ JDBC أو JMS التقليدية.
المشكلة 2: التكامل الجيد مع الأطر الأخرى
إن الشيء العظيم في إطار الربيع هو أنه لا يحاول حل المشكلات التي تم حلها بالفعل. كل ما يفعله هو توفير التكامل الممتاز مع الأطر الأخرى ، والتي بدورها توفر حلولاً ممتازة.
- السبات ل ORM
- iBatis لرسم خرائط الكائنات
- JUnit و Mockito لاختبار وحدة
لماذا نحتاج الحذاء الربيع؟
التطبيقات المستندة إلى الربيع لديها العديد من التكوينات.
عندما نستخدم Spring MVC ، نحتاج إلى التكوين: فحص المكون ، servlet المرسل ، محلل العرض ، برطانات الويب (لتقديم محتوى ثابت) من بين أشياء أخرى.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean><mvc:resources mapping="/webjars/**" location="/webjars/"/>
يُظهر الرمز أدناه تكوين servlet المرسل النموذجي في تطبيق ويب.
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
عندما نستخدم Hibernate / JPA ، نحتاج إلى تكوين مصدر البيانات ومصنع مدير الكيان ومدير المعاملات وأشياء أخرى.
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean><jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database><bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean><bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean><tx:annotation-driven transaction-manager="transactionManager"/>
المشكلة 1: تهيئة التمهيد التلقائي للينابيع: هل يمكننا التفكير بشكل مختلف؟
يوفر Spring Boot عملية تفكير جديدة حولها.
- ماذا عن التكوين التلقائي لمصدر البيانات إذا كانت جرة الإسبات في classpath؟
- ماذا عن التكوين التلقائي لجهاز Dispatcher Servlet إذا كان Spring MVC jar في classpath؟
ثم سيكون هناك أحكام لتجاوز التكوين التلقائي الافتراضي.
المشكلة 2: مشاريع بدء تشغيل التمهيد في الربيع: مبنية على أنماط معروفة جيدًا
دعنا نقول أننا نريد تطوير تطبيق ويب.
بادئ ذي بدء ، نحن بحاجة إلى تحديد الأطر التي نريد استخدامها ، والإصدارات التي يجب استخدامها ، وكيفية توصيلها معًا.
جميع تطبيقات الويب لها احتياجات مماثلة. يتم استخدام التبعيات التالية في Spring MVC. ويشمل ذلك Spring MVC و Jackson Databind و Hibernate-Validator و Log4j.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version> </dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
إذا كنت ترغب في تطوير تطبيق ويب أو تطبيق لخدمات RESTful ، فاختيارك هو Spring Boot Start Web. لنقم بإنشاء مشروع بسرعة باستخدام Spring Boot Starter Web باستخدام Spring Initializr.
التبعيات لـ Spring Boot Starter Web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
توضح لقطة الشاشة التالية التبعيات المختلفة التي تمت إضافتها إلى تطبيقنا.

يمكن تصنيف التبعيات إلى:
- الربيع: الأساسية ، الفاصوليا ، السياق ، aop
- الويب MVC: (Spring MVC)
- جاكسون: للاتصال JSON
- التحقق من الصحة: مدقق السبات ، API التحقق من الصحة
- حاوية سيرفلت المدمجة: Tomcat
- تسجيل الدخول: logback ، slf4j
سيستخدم أي تطبيق ويب نموذجي كل هذه التبعيات. يأتي Spring Boot Starter Web معهم. كمطور ، لا داعي للقلق بشأن هذه التبعيات أو الإصدارات المتوافقة.
الربيع التمهيد كاتب المشروع الخيارات
كما نرى من موقع Spring Boot Starter Web ، تساعدنا مشاريع البدء على تطوير أنواع معينة من التطبيقات بسرعة.
- spring-boot-starter-web-services: SOAP Web Services
- spring-boot-starter-web: تطبيقات الويب و RESTful
- spring-boot-starter-test: اختبار الوحدة واختبار التكامل
- spring-boot-starter-jdbc: JDBC التقليدية
- spring-boot-starter-hateoas: أضف ميزات HATEOAS إلى خدماتك
- spring-boot-starter-security: المصادقة والتخويل باستخدام Spring Security
- spring-boot-starter-data-jpa: Spring Data JPA with Hibernate
- spring-boot-starter-cache: تمكين دعم التخزين المؤقت لـ Spring Framework
- spring-boot-star--rest-data: توفير خدمات REST بسيطة باستخدام Spring Data REST
أهداف أخرى من Spring Boot
هناك أيضًا عدة مبتدئين للأشياء الفنية:
- spring-boot-starter-actuator: لاستخدام الميزات المتقدمة مثل مراقبة تطبيقك وتتبعه خارج الصندوق
- spring-boot-starter-undertow، spring-boot-starter-gty، spring-boot-starter-tomcat: لتحديد حاوية servlet مضمنة محددة
- spring-boot-starter-logging: للتسجيل باستخدام logback
- spring-boot-starter-log4j2: التسجيل باستخدام Log4j2
يهدف Spring Boot إلى إنشاء تطبيقات لفترات أقصر.
- المحرك: يتيح مراقبة وتتبع التطبيقات المتقدمة.
- تكاملات الخادم المدمجة: نظرًا لأن الخادم مدمج في التطبيق ، فأنا بحاجة إلى تثبيت خادم تطبيق منفصل على الخادم
- معالجة الأخطاء الافتراضية