في Spring Boot (Spring MVC)، يمر الطلب عبر servlet container، وسلسلة من Filters، ثم DispatcherServlet المركزي، ثم interceptors و**@Controller** الخاص بك، وتُحوَّل القيمة المُعادة إلى HTTP response.
في Spring Boot (Spring MVC)، يمر الطلب عبر servlet container، وسلسلة من Filters، ثم DispatcherServlet المركزي، ثم interceptors و**@Controller** الخاص بك، وتُحوَّل القيمة المُعادة إلى HTTP response.
Servlet container (Tomcat)
▼
Filter chain ── (CharacterEncoding, Security, CORS, ...)
▼
DispatcherServlet ── الـ front controller
▼
HandlerMapping ── إيجاد method الـ @Controller
▼
HandlerInterceptor.preHandle
▼
Argument resolvers ── bind @RequestBody / @PathVariable / @RequestParam
▼
Controller method ── منطقك → يعيد object أو ResponseEntity
▼
HandlerInterceptor.postHandle
▼
HttpMessageConverter / ViewResolver ── serialize إلى JSON أو render لـ view
▼
HandlerInterceptor.afterCompletion → Response ──▶ client
Filter. الـ Filters (بما فيها Spring Security) هي الطبقة الخارجية ويمكنها حجب أو تغليف الطلب قبل أن يراه MVC.preHandle — تعمل كائنات HandlerInterceptor قبل الـ controller (فحوصات المصادقة، logging، قياس التوقيت)؛ وإرجاع false يوقف الطلب.@PathVariable و@RequestParam و@RequestBody (عبر HttpMessageConverter).@RestController الخاص بك منطق العمل وتعيد object أو ResponseEntity.postHandle، ثم تُسَلسَل القيمة المُعادة بواسطة HttpMessageConverter (JSON عبر Jackson) أو يُصيَّر (render) view بواسطة ViewResolver.afterCompletion يعمل بعد أن تُلتزَم (commit) الاستجابة؛ ويعالج @ExceptionHandler/@ControllerAdvice الاستثناءات على طول الطريق.// 4/7/8. interceptor
public class TimingInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object h) {
req.setAttribute("started", System.nanoTime());
return true; // false = قطع المسار مبكراً
}
}
// 6. controller
@RestController
class ItemController {
@GetMapping("/items/{id}") // 3. mapping
ResponseEntity<Item> show(@PathVariable Long id) { // 5. argument resolution
return ResponseEntity.ok(service.find(id)); // 7. يُسَلسَل إلى JSON
}
}
تحتوي دورة حياة Spring على طبقتَي امتداد مميّزتين يحب المُحاورون التنقيب فيهما: Filters (على مستوى servlet، الأبعد للخارج — حيث تعيش Spring Security) وInterceptors (على مستوى Spring MVC، حول الـ controller). معرفة الترتيب — filters، DispatcherServlet، mapping، preHandle للـ interceptor، ربط الوسائط (argument binding)، controller، تحويل الرسالة (message conversion)، afterCompletion — تخبرك أين تضع المصادقة مقابل logging، ولماذا يرفض Security filter طلباً قبل أن يعمل أي interceptor أو controller، وكيف يُركّز @ControllerAdvice معالجة الاستثناءات عبر التدفق بأكمله.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع