{"id":89941,"date":"2025-07-31T23:25:49","date_gmt":"2025-07-31T16:25:49","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=89941"},"modified":"2025-07-31T23:25:51","modified_gmt":"2025-07-31T16:25:51","slug":"spring-mvc-vs-spring-boot","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/","title":{"rendered":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">N\u1ed9i dung b\u00e0i vi\u1ebft<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#Tong_quan_ve_Spring_MVC_va_Spring_Boot\" >T\u1ed5ng quan v\u1ec1 Spring MVC v\u00e0 Spring Boot&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#So_sanh_chi_tiet_Spring_Boot_vs_Spring_MVC\" >So s\u00e1nh chi ti\u1ebft Spring Boot vs Spring MVC<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#Cach_ket_hop_Spring_Boot_va_Spring_MVC\" >C\u00e1ch k\u1ebft h\u1ee3p Spring Boot v\u00e0 Spring MVC<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#Cac_cau_hoi_thuong_gap_ve_Spring_MVC_vs_Spring_Boot\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring MVC vs Spring Boot<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#Tong_ket_Spring_MVC_vs_Spring_Boot\" >T\u1ed5ng k\u1ebft Spring MVC vs Spring Boot<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Trong h\u1ec7 sinh th\u00e1i Java, Spring MVC v\u00e0 Spring Boot l\u00e0 hai c\u00e1i t\u00ean \u0111\u00ecnh \u0111\u00e1m m\u00e0 b\u1ea5t k\u1ef3 l\u1eadp tr\u00ecnh vi\u00ean web n\u00e0o c\u0169ng t\u1eebng nghe t\u1edbi. Tuy nhi\u00ean, s\u1ef1 ph\u1ed5 bi\u1ebfn n\u00e0y c\u0169ng \u0111i k\u00e8m kh\u00f4ng \u00edt nh\u1ea7m l\u1eabn: Li\u1ec7u Spring Boot c\u00f3 ph\u1ea3i l\u00e0 phi\u00ean b\u1ea3n k\u1ebf nhi\u1ec7m, \u0111\u01b0\u1ee3c sinh ra \u0111\u1ec3 thay th\u1ebf Spring MVC? B\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u00fap b\u1ea1n th\u00e1o g\u1ee1 nh\u1eefng kh\u00fac m\u1eafc \u0111\u00f3 b\u1eb1ng c\u00e1ch l\u00e0m r\u00f5 m\u1ed1i quan h\u1ec7 th\u1ef1c s\u1ef1 gi\u1eefa Spring MVC vs Spring Boot, t\u1eeb \u0111\u00f3 gi\u00fap b\u1ea1n \u0111\u01b0a ra l\u1ef1a ch\u1ecdn ph\u00f9 h\u1ee3p nh\u1ea5t cho d\u1ef1 \u00e1n c\u1ee7a m\u00ecnh.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft n\u00e0y \u0111\u1ec3 \u0111\u01b0\u1ee3c gi\u1ea3i \u0111\u00e1p:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>S\u1ef1 th\u1eadt v\u1ec1 m\u1ed1i quan h\u1ec7 gi\u1eefa Spring MVC v\u00e0 Spring Boot&nbsp;<\/li>\n\n\n\n<li>So s\u00e1nh nh\u1eefng \u0111i\u1ec3m kh\u00e1c nhau gi\u1eefa Spring MVC v\u00e0 Spring Boot<\/li>\n\n\n\n<li>Spring MVC v\u00e0 Spring Boot ph\u00f9 h\u1ee3p cho nh\u1eefng d\u1ef1 \u00e1n n\u00e0o?<\/li>\n\n\n\n<li>C\u00e1ch k\u1ebft h\u1ee3p gi\u1eefa Spring MVC v\u00e0 Spring Boot<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-quan-v\u1ec1-spring-mvc-va-spring-boot-nbsp\"><span class=\"ez-toc-section\" id=\"Tong_quan_ve_Spring_MVC_va_Spring_Boot\"><\/span><strong>T\u1ed5ng quan v\u1ec1 Spring MVC v\u00e0 Spring Boot&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-mvc\"><strong>Spring MVC<\/strong><\/h3>\n\n\n\n<p>Tr\u01b0\u1edbc khi Spring Boot ra \u0111\u1eddi v\u00e0 \u0111\u01a1n gi\u1ea3n h\u00f3a m\u1ecdi th\u1ee9, <strong>Spring MVC<\/strong> ch\u00ednh l\u00e0 tr\u1ee5 c\u1ed9t, l\u00e0 n\u1ec1n t\u1ea3ng c\u1ed1t l\u00f5i gi\u00fap c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n Java x\u00e2y d\u1ef1ng nh\u1eefng \u1ee9ng d\u1ee5ng web m\u1ea1nh m\u1ebd v\u00e0 c\u00f3 c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng.<\/p>\n\n\n\n<p>V\u1ec1 b\u1ea3n ch\u1ea5t, <strong>Spring MVC<\/strong> l\u00e0 m\u1ed9t module quan tr\u1ecdng trong h\u1ec7 sinh th\u00e1i Spring Framework, \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf chuy\u00ean bi\u1ec7t \u0111\u1ec3 tri\u1ec3n khai m\u00f4 h\u00ecnh ki\u1ebfn tr\u00fac <strong>Model-View-Controller (MVC)<\/strong> kinh \u0111i\u1ec3n cho c\u00e1c \u1ee9ng d\u1ee5ng web. M\u1ee5c ti\u00eau ch\u00ednh c\u1ee7a n\u00f3 l\u00e0 t\u00e1ch bi\u1ec7t m\u1ed9t c\u00e1ch r\u00e0nh m\u1ea1ch c\u00e1c th\u00e0nh ph\u1ea7n kh\u00e1c nhau c\u1ee7a \u1ee9ng d\u1ee5ng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Model<\/strong>: Ch\u1ee9a d\u1eef li\u1ec7u c\u1ee7a \u1ee9ng d\u1ee5ng v\u00e0 c\u00e1c logic nghi\u1ec7p v\u1ee5 (business logic). \u0110\u00e2y l\u00e0 n\u01a1i x\u1eed l\u00fd, t\u00ednh to\u00e1n v\u00e0 chu\u1ea9n b\u1ecb d\u1eef li\u1ec7u.<\/li>\n\n\n\n<li><strong>View<\/strong>: Ch\u1ecbu tr\u00e1ch nhi\u1ec7m hi\u1ec3n th\u1ecb d\u1eef li\u1ec7u cho ng\u01b0\u1eddi d\u00f9ng. \u0110\u00e2y ch\u00ednh l\u00e0 giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng (UI), th\u01b0\u1eddng \u0111\u01b0\u1ee3c t\u1ea1o ra t\u1eeb c\u00e1c c\u00f4ng ngh\u1ec7 nh\u01b0 JSP, Thymeleaf, ho\u1eb7c HTML.<\/li>\n\n\n\n<li><strong>Controller<\/strong>: \u0110\u00f3ng vai tr\u00f2 trung gian, ti\u1ebfp nh\u1eadn c\u00e1c y\u00eau c\u1ea7u (requests) t\u1eeb ng\u01b0\u1eddi d\u00f9ng, t\u01b0\u01a1ng t\u00e1c v\u1edbi Model \u0111\u1ec3 x\u1eed l\u00fd nghi\u1ec7p v\u1ee5, v\u00e0 cu\u1ed1i c\u00f9ng ch\u1ecdn View ph\u00f9 h\u1ee3p \u0111\u1ec3 tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3 (response) cho ng\u01b0\u1eddi d\u00f9ng.<\/li>\n<\/ul>\n\n\n\n<p>S\u1ef1 ph\u00e2n t\u00e1ch r\u00f5 r\u00e0ng n\u00e0y gi\u00fap \u1ee9ng d\u1ee5ng d\u1ec5 d\u00e0ng b\u1ea3o tr\u00ec, m\u1edf r\u1ed9ng v\u00e0 ki\u1ec3m th\u1eed h\u01a1n.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-mvc-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring MVC l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring MVC<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-boot\"><strong>Spring Boot<\/strong><\/h3>\n\n\n\n<p>N\u1ebfu Spring MVC \u0111\u1eb7t ra n\u1ec1n m\u00f3ng v\u1eefng ch\u1eafc th\u00ec <strong>Spring Boot<\/strong> \u0111\u01b0\u1ee3c t\u1ea1o ra \u0111\u1ec3 ph\u00e1 v\u1ee1 nh\u1eefng r\u00e0o c\u1ea3n v\u1ec1 c\u1ea5u h\u00ecnh v\u00e0 gi\u00fap c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n kh\u1edfi t\u1ea1o d\u1ef1 \u00e1n m\u1ed9t c\u00e1ch nhanh ch\u00f3ng nh\u1ea5t.<\/p>\n\n\n\n<p>V\u1ec1 c\u1ed1t l\u00f5i, <strong>Spring Boot<\/strong> l\u00e0 m\u1ed9t ph\u1ea7n m\u1edf r\u1ed9ng c\u1ee7a Spring Framework, kh\u00f4ng thay th\u1ebf Spring m\u00e0 \u0111\u01b0\u1ee3c sinh ra v\u1edbi m\u1ed9t m\u1ee5c ti\u00eau duy nh\u1ea5t: gi\u00fap &#8220;kh\u1edfi \u0111\u1ed9ng&#8221; (bootstrap) v\u00e0 ch\u1ea1y \u1ee9ng d\u1ee5ng Spring nhanh v\u00e0 d\u1ec5 d\u00e0ng nh\u1ea5t c\u00f3 th\u1ec3.<\/p>\n\n\n\n<p>\u0110\u1ec3 l\u00e0m \u0111\u01b0\u1ee3c \u0111i\u1ec1u n\u00e0y, Spring Boot ho\u1ea1t \u0111\u1ed9ng d\u1ef1a tr\u00ean tri\u1ebft l\u00fd <strong>&#8220;Convention over Configuration&#8221;<\/strong> (\u01afa chu\u1ed9ng quy \u01b0\u1edbc h\u01a1n c\u1ea5u h\u00ecnh). Thay v\u00ec b\u1eaft b\u1ea1n ph\u1ea3i t\u1ef1 khai b\u00e1o m\u1ecdi th\u1ee9, Spring Boot s\u1ebd \u0111\u01b0a ra c\u00e1c c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh th\u00f4ng minh d\u1ef1a tr\u00ean nh\u1eefng quy \u01b0\u1edbc ph\u1ed5 bi\u1ebfn nh\u1ea5t. Nh\u1edd v\u1eady, b\u1ea1n c\u00f3 th\u1ec3 b\u1ecf qua h\u00e0ng lo\u1ea1t b\u01b0\u1edbc thi\u1ebft l\u1eadp ph\u1ee9c t\u1ea1p v\u00e0 t\u1eadp trung ngay v\u00e0o vi\u1ec7c vi\u1ebft m\u00e3 logic cho nghi\u1ec7p v\u1ee5.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-so-sanh-chi-ti\u1ebft-spring-boot-vs-spring-mvc\"><span class=\"ez-toc-section\" id=\"So_sanh_chi_tiet_Spring_Boot_vs_Spring_MVC\"><\/span><strong>So s\u00e1nh chi ti\u1ebft Spring Boot vs Spring MVC<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u0110\u1ec3 bi\u1ebft c\u00f4ng ngh\u1ec7 n\u00e0o ph\u00f9 h\u1ee3p h\u01a1n v\u1edbi nhu c\u1ea7u, h\u00e3y \u0111\u1eb7t Spring Boot v\u00e0 Spring MVC l\u00ean b\u00e0n c\u00e2n v\u00e0 so s\u00e1nh tr\u1ef1c ti\u1ebfp qua c\u00e1c y\u1ebfu t\u1ed1 then ch\u1ed1t.<\/p>\n\n\n\n<p>B\u1ea3ng d\u01b0\u1edbi \u0111\u00e2y gi\u00fap t\u1ed5ng h\u1ee3p nh\u1eefng kh\u00e1c bi\u1ec7t c\u1ed1t l\u00f5i:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Y\u1ebfu t\u1ed1<\/strong><\/td><td><strong>Spring MVC<\/strong><\/td><td><strong>Spring Boot<\/strong><\/td><\/tr><tr><td><strong>C\u1ea5u h\u00ecnh<\/strong><\/td><td>Th\u1ee7 c\u00f4ng &amp; t\u01b0\u1eddng minh.&nbsp;L\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i t\u1ef1 tay \u0111\u1ecbnh ngh\u0129a c\u00e1c beans quan tr\u1ecdng nh\u01b0 DispatcherServlet, ViewResolver, HandlerMapping trong XML ho\u1eb7c Java.<\/td><td>T\u1ef1 \u0111\u1ed9ng &amp; Th\u00f4ng minh.&nbsp;\u00c1p d\u1ee5ng c\u01a1 ch\u1ebf Auto-Configuration, t\u1ef1 \u0111\u1ed9ng thi\u1ebft l\u1eadp \u1ee9ng d\u1ee5ng d\u1ef1a tr\u00ean c\u00e1c th\u01b0 vi\u1ec7n trong classpath. Gi\u1ea3m thi\u1ec3u t\u1ed1i \u0111a c\u1ea5u h\u00ecnh.<\/td><\/tr><tr><td><strong>Qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n<\/strong><\/td><td>T\u1ef1 qu\u1ea3n l\u00fd. Ph\u1ea3i t\u1ef1 khai b\u00e1o v\u00e0 \u0111\u1ea3m b\u1ea3o t\u00ednh t\u01b0\u01a1ng th\u00edch c\u1ee7a t\u1eebng th\u01b0 vi\u1ec7n ph\u1ee5 thu\u1ed9c trong file pom.xml ho\u1eb7c build.gradle.<\/td><td>\u0110\u01a1n gi\u1ea3n h\u00f3a v\u1edbi c\u00e1c g\u00f3i starter (v\u00ed d\u1ee5: spring-boot-starter-web) \u0111\u00e3 bao g\u1ed3m m\u1ed9t b\u1ed9 th\u01b0 vi\u1ec7n t\u01b0\u01a1ng th\u00edch, \u0111\u01b0\u1ee3c ki\u1ec3m th\u1eed k\u1ef9 l\u01b0\u1ee1ng.<\/td><\/tr><tr><td><strong>Web Server<\/strong><\/td><td>B\u00ean ngo\u00e0i (External). Y\u00eau c\u1ea7u m\u1ed9t m\u00e1y ch\u1ee7 web b\u00ean ngo\u00e0i nh\u01b0 Apache Tomcat, Jetty ph\u1ea3i \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t v\u00e0 c\u1ea5u h\u00ecnh ri\u00eang.<\/td><td>Nh\u00fang (Embedded). T\u00edch h\u1ee3p s\u1eb5n m\u00e1y ch\u1ee7 (Tomcat l\u00e0 m\u1eb7c \u0111\u1ecbnh) b\u00ean trong \u1ee9ng d\u1ee5ng. Kh\u00f4ng c\u1ea7n c\u00e0i \u0111\u1eb7t server ri\u00eang.<\/td><\/tr><tr><td><strong>\u0110\u00f3ng g\u00f3i &amp; Tri\u1ec3n khai&nbsp;<\/strong><\/td><td>Th\u01b0\u1eddng \u0111\u00f3ng g\u00f3i th\u00e0nh file .war v\u00e0 tri\u1ec3n khai l\u00ean m\u00e1y ch\u1ee7 web b\u00ean ngo\u00e0i.<\/td><td>\u0110\u00f3ng g\u00f3i th\u00e0nh file .jar \u0111\u1ed9c l\u1eadp, c\u00f3 th\u1ec3 ch\u1ea1y ngay v\u1edbi l\u1ec7nh java -jar.&nbsp;<\/td><\/tr><tr><td><strong>T\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n<\/strong><\/td><td>Ch\u1eadm h\u01a1n. T\u1ed1n nhi\u1ec1u th\u1eddi gian cho vi\u1ec7c thi\u1ebft l\u1eadp, c\u1ea5u h\u00ecnh ban \u0111\u1ea7u v\u00e0 qu\u1ea3n l\u00fd c\u00e1c th\u00e0nh ph\u1ea7n.<\/td><td>R\u1ea5t nhanh. Lo\u1ea1i b\u1ecf g\u1ea7n nh\u01b0 to\u00e0n b\u1ed9 c\u1ea5u h\u00ecnh ph\u1ee9c t\u1ea1p, gi\u00fap l\u1eadp tr\u00ecnh vi\u00ean t\u1eadp trung ngay v\u00e0o vi\u1ec7c vi\u1ebft code business.&nbsp;<\/td><\/tr><tr><td><strong>Khi n\u00e0o n\u00ean s\u1eed d\u1ee5ng<\/strong><\/td><td>&#8211; Ph\u00f9 h\u1ee3p cho c\u00e1c \u1ee9ng d\u1ee5ng l\u1edbn, nguy\u00ean kh\u1ed1i (monolithic) n\u01a1i b\u1ea1n c\u1ea7n ki\u1ec3m so\u00e1t chi ti\u1ebft v\u00e0 to\u00e0n di\u1ec7n m\u1ecdi c\u1ea5u h\u00ecnh.&nbsp;&#8211; C\u1ea7n thi\u1ebft khi ph\u1ea3i tri\u1ec3n khai d\u01b0\u1edbi d\u1ea1ng file .war l\u00ean m\u1ed9t m\u00e1y ch\u1ee7 \u1ee9ng d\u1ee5ng b\u00ean ngo\u00e0i \u0111\u00e3 c\u00f3 s\u1eb5n.<\/td><td>&#8211; L\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho h\u1ea7u h\u1ebft c\u00e1c d\u1ef1 \u00e1n hi\u1ec7n \u0111\u1ea1i, \u0111\u1eb7c bi\u1ec7t l\u00e0 ph\u00e1t tri\u1ec3n Microservices, x\u00e2y d\u1ef1ng REST APIs v\u00e0 c\u00e1c d\u1ef1 \u00e1n c\u1ea7n ph\u00e1t tri\u1ec3n nhanh (RAD &#8211; Rapid Application Development).&nbsp;&#8211; L\u00e0 l\u1ef1a ch\u1ecdn m\u1eb7c \u0111\u1ecbnh cho \u1ee9ng d\u1ee5ng web m\u1edbi.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Nh\u00ecn v\u00e0o b\u1ea3ng tr\u00ean, c\u00f3 th\u1ec3 th\u1ea5y Spring Boot kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t c\u00f4ng ngh\u1ec7 ho\u00e0n to\u00e0n m\u1edbi, m\u00e0 l\u00e0 m\u1ed9t s\u1ef1 ti\u1ebfn h\u00f3a v\u01b0\u1ee3t b\u1eadc t\u1eeb Spring Framework, gi\u00fap gi\u1ea3i quy\u1ebft nh\u1eefng th\u00e1ch th\u1ee9c c\u1ed1 h\u1eefu c\u1ee7a Spring MVC v\u1ec1 s\u1ef1 ph\u1ee9c t\u1ea1p trong c\u1ea5u h\u00ecnh v\u00e0 tri\u1ec3n khai.&nbsp;<\/p>\n\n\n\n<p>C\u00f9ng so s\u00e1nh chi ti\u1ebft t\u1eebng y\u1ebfu t\u1ed1 nh\u00e9:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-c\u1ea5u-hinh\"><strong>C\u1ea5u h\u00ecnh<\/strong><\/h3>\n\n\n\n<p><strong>Spring MVC c\u1ea7n c\u1ea5u h\u00ecnh th\u1ee7 c\u00f4ng (manual configuration)<\/strong>: \u0110\u00e2y l\u00e0 \u0111\u1eb7c \u0111i\u1ec3m n\u1ed5i b\u1eadt nh\u1ea5t. V\u1edbi Spring MVC, l\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i &#8220;x\u1eafn tay \u00e1o&#8221; l\u00ean v\u00e0 t\u1ef1 m\u00ecnh c\u1ea5u h\u00ecnh m\u1ecdi th\u00e0nh ph\u1ea7n quan tr\u1ecdng \u0111\u1ec3 \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 ho\u1ea1t \u0111\u1ed9ng. \u0110i\u1ec1u n\u00e0y bao g\u1ed3m vi\u1ec7c khai b\u00e1o <code>DispatcherServlet<\/code> (b\u1ed9 \u0111i\u1ec1u ph\u1ed1i trung t\u00e2m), <code>ViewResolver<\/code> (b\u1ed9 ph\u00e2n gi\u1ea3i view), v\u00e0 <code>HandlerMapping<\/code> (b\u1ed9 \u00e1nh x\u1ea1 request t\u1edbi controller)&#8230; th\u00f4ng qua c\u00e1c t\u1ec7p tin XML ho\u1eb7c c\u00e1c l\u1edbp Java c\u00f3 ch\u00fa th\u00edch <code>@Configuration<\/code>. M\u1eb7c d\u00f9 t\u1ed1n c\u00f4ng s\u1ee9c, c\u00e1ch l\u00e0m n\u00e0y mang l\u1ea1i s\u1ef1 ki\u1ec3m so\u00e1t tuy\u1ec7t \u0111\u1ed1i cho ng\u01b0\u1eddi l\u1eadp tr\u00ecnh.<\/p>\n\n\n\n<p><strong>Spring Boot cho ph\u00e9p t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh (auto-configuration)<\/strong>: \u0110\u00e2y l\u00e0 ph\u00e9p m\u00e0u c\u1ee7a Spring Boot. N\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng &#8220;qu\u00e9t&#8221; c\u00e1c th\u01b0 vi\u1ec7n (JARs) c\u00f3 trong classpath c\u1ee7a b\u1ea1n v\u00e0 t\u1ef1 c\u1ea5u h\u00ecnh c\u00e1c th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft. V\u00ed d\u1ee5, ch\u1ec9 c\u1ea7n b\u1ea1n th\u00eam spring-boot-starter-web v\u00e0o d\u1ef1 \u00e1n, Spring Boot s\u1ebd hi\u1ec3u r\u1eb1ng b\u1ea1n mu\u1ed1n x\u00e2y d\u1ef1ng m\u1ed9t \u1ee9ng d\u1ee5ng web v\u00e0 t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh m\u1ed9t m\u00e1y ch\u1ee7 web nh\u00fang c\u00f9ng to\u00e0n b\u1ed9 c\u00e1c th\u00e0nh ph\u1ea7n c\u1ee7a Spring MVC m\u00e0 kh\u00f4ng c\u1ea7n b\u1ea1n can thi\u1ec7p.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-qu\u1ea3n-ly-th\u01b0-vi\u1ec7n\"><strong>Qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n<\/strong><\/h3>\n\n\n\n<p><strong>Spring MVC: <\/strong>B\u1ea1n ph\u1ea3i t\u1ef1 khai b\u00e1o v\u00e0 qu\u1ea3n l\u00fd phi\u00ean b\u1ea3n cho t\u1eebng th\u01b0 vi\u1ec7n ph\u1ee5 thu\u1ed9c m\u1ed9t c\u00e1ch t\u01b0\u1eddng minh trong c\u00e1c t\u1ec7p qu\u1ea3n l\u00fd d\u1ef1 \u00e1n nh\u01b0 <code>pom.xml<\/code> (v\u1edbi Maven) ho\u1eb7c <code>build.gradle<\/code> (v\u1edbi Gradle). Vi\u1ec7c n\u00e0y \u0111\u00f2i h\u1ecfi s\u1ef1 c\u1ea9n th\u1eadn \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o c\u00e1c phi\u00ean b\u1ea3n t\u01b0\u01a1ng th\u00edch v\u00e0 tr\u00e1nh xung \u0111\u1ed9t.<\/p>\n\n\n\n<p><strong>Spring Boot<\/strong> \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n b\u1eb1ng c\u00e1ch cung c\u1ea5p c\u00e1c g\u00f3i <strong>&#8220;starter&#8221;<\/strong> v\u00f4 c\u00f9ng ti\u1ec7n l\u1ee3i. M\u1ed7i starter l\u00e0 m\u1ed9t b\u1ed9 s\u01b0u t\u1eadp c\u00e1c th\u01b0 vi\u1ec7n ph\u1ee5 thu\u1ed9c t\u01b0\u01a1ng th\u00edch, \u0111\u00e3 \u0111\u01b0\u1ee3c ki\u1ec3m th\u1eed \u0111\u1ec3 ph\u1ee5c v\u1ee5 m\u1ed9t m\u1ee5c \u0111\u00edch c\u1ee5 th\u1ec3. V\u00ed d\u1ee5, b\u1ea1n ch\u1ec9 c\u1ea7n th\u00eam <code>spring-boot-starter-data-jpa<\/code> l\u00e0 \u0111\u00e3 c\u00f3 ngay m\u1ecdi th\u1ee9 c\u1ea7n thi\u1ebft \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u, kh\u00f4ng c\u1ea7n lo l\u1eafng v\u1ec1 vi\u1ec7c ch\u1ecdn \u0111\u00fang phi\u00ean b\u1ea3n cho t\u1eebng th\u01b0 vi\u1ec7n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-tri\u1ec3n-khai-deployment-amp-web-server\"><strong>Tri\u1ec3n khai (Deployment) &amp; Web Server<\/strong><\/h3>\n\n\n\n<p><strong>C\u00e1c \u1ee9ng d\u1ee5ng Spring MVC truy\u1ec1n th\u1ed1ng<\/strong> th\u01b0\u1eddng \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i th\u00e0nh m\u1ed9t t\u1ec7p <strong>WAR<\/strong> (Web Application Archive). T\u1ec7p n\u00e0y sau \u0111\u00f3 c\u1ea7n \u0111\u01b0\u1ee3c tri\u1ec3n khai l\u00ean m\u1ed9t m\u00e1y ch\u1ee7 \u1ee9ng d\u1ee5ng web b\u00ean ngo\u00e0i (external server) nh\u01b0 Apache Tomcat, Jetty, ho\u1eb7c WildFly \u0111\u1ec3 c\u00f3 th\u1ec3 ch\u1ea1y \u0111\u01b0\u1ee3c.<\/p>\n\n\n\n<p><strong>Spring Boot: <\/strong>t\u00edch h\u1ee3p s\u1eb5n c\u00e1c m\u00e1y ch\u1ee7 nh\u00fang (embedded server) ph\u1ed5 bi\u1ebfn nh\u01b0 Tomcat, Jetty, ho\u1eb7c Undertow ngay b\u00ean trong n\u00f3. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p b\u1ea1n \u0111\u00f3ng g\u00f3i \u1ee9ng d\u1ee5ng c\u1ee7a m\u00ecnh th\u00e0nh m\u1ed9t t\u1ec7p <code>.jar<\/code> duy nh\u1ea5t v\u00e0 ch\u1ea1y n\u00f3 nh\u01b0 m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u1ed9c l\u1eadp b\u1eb1ng l\u1ec7nh <code>java -jar app.jar<\/code>. B\u1ea1n ho\u00e0n to\u00e0n kh\u00f4ng c\u1ea7n c\u00e0i \u0111\u1eb7t v\u00e0 c\u1ea5u h\u00ecnh m\u1ed9t m\u00e1y ch\u1ee7 web ri\u00eang bi\u1ec7t, gi\u00fap vi\u1ec7c tri\u1ec3n khai tr\u1edf n\u00ean \u0111\u01a1n gi\u1ea3n h\u01a1n bao gi\u1edd h\u1ebft.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-khi-nao-nen-s\u1eed-d\u1ee5ng\"><strong>Khi n\u00e0o n\u00ean s\u1eed d\u1ee5ng?<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-spring-boot-0\"><strong>Spring Boot<\/strong><\/h4>\n\n\n\n<p>V\u1edbi nh\u1eefng \u01b0u \u0111i\u1ec3m v\u01b0\u1ee3t tr\u1ed9i v\u1ec1 t\u1ed1c \u0111\u1ed9 v\u00e0 s\u1ef1 ti\u1ec7n l\u1ee3i, Spring Boot \u0111\u00e3 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho h\u1ea7u h\u1ebft c\u00e1c d\u1ef1 \u00e1n hi\u1ec7n \u0111\u1ea1i, \u0111\u1eb7c bi\u1ec7t l\u00e0 trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p sau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ph\u00e1t tri\u1ec3n Microservices<\/strong>: Kh\u1ea3 n\u0103ng t\u1ea1o ra c\u00e1c \u1ee9ng d\u1ee5ng \u0111\u1ed9c l\u1eadp, nh\u1eb9 v\u00e0 d\u1ec5 tri\u1ec3n khai khi\u1ebfn Spring Boot tr\u1edf th\u00e0nh c\u00f4ng c\u1ee5 l\u00fd t\u01b0\u1edfng cho ki\u1ebfn tr\u00fac microservices.<\/li>\n\n\n\n<li><strong>X\u00e2y d\u1ef1ng REST APIs<\/strong>: Vi\u1ec7c thi\u1ebft l\u1eadp nhanh ch\u00f3ng m\u1ed9t m\u00e1y ch\u1ee7 web v\u00e0 c\u00e1c endpoint gi\u00fap vi\u1ec7c x\u00e2y d\u1ef1ng API tr\u1edf n\u00ean v\u00f4 c\u00f9ng hi\u1ec7u qu\u1ea3.<\/li>\n\n\n\n<li><strong>C\u00e1c d\u1ef1 \u00e1n c\u1ea7n ph\u00e1t tri\u1ec3n nhanh (Rapid Application Development &#8211; RAD)<\/strong>: Khi th\u1eddi gian l\u00e0 y\u1ebfu t\u1ed1 then ch\u1ed1t, Spring Boot gi\u00fap b\u1ea1n \u0111\u01b0a s\u1ea3n ph\u1ea9m ra th\u1ecb tr\u01b0\u1eddng trong th\u1eddi gian ng\u1eafn nh\u1ea5t.<\/li>\n\n\n\n<li><strong>H\u1ea7u h\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng web m\u1edbi<\/strong>: \u0110\u1ed1i v\u1edbi ph\u1ea7n l\u1edbn c\u00e1c d\u1ef1 \u00e1n web b\u1eaft \u0111\u1ea7u t\u1eeb \u0111\u1ea7u trong th\u1eddi \u0111i\u1ec3m hi\u1ec7n t\u1ea1i, Spring Boot l\u00e0 l\u1ef1a ch\u1ecdn m\u1eb7c \u0111\u1ecbnh v\u00e0 \u0111\u01b0\u1ee3c khuy\u1ebfn kh\u00edch s\u1eed d\u1ee5ng.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/huong-dan-spring-boot-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Boot tutorial chi ti\u1ebft t\u1eeb A-Z cho l\u1eadp tr\u00ecnh vi\u00ean Java<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-spring-mvc-0\"><strong>Spring MVC<\/strong><\/h4>\n\n\n\n<p>M\u1eb7c d\u00f9 Spring Boot \u0111\u00e3 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn ph\u1ed5 bi\u1ebfn cho c\u00e1c d\u1ef1 \u00e1n m\u1edbi, Spring MVC v\u1eabn c\u00f3 ch\u1ed7 \u0111\u1ee9ng v\u1eefng ch\u1eafc trong m\u1ed9t s\u1ed1 tr\u01b0\u1eddng h\u1ee3p c\u1ee5 th\u1ec3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u1ef1 \u00e1n l\u1edbn v\u00e0 ph\u1ee9c t\u1ea1p<\/strong>: Khi d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n c\u00f3 nh\u1eefng y\u00eau c\u1ea7u \u0111\u1eb7c th\u00f9, \u0111\u00f2i h\u1ecfi s\u1ef1 ki\u1ec3m so\u00e1t chi ti\u1ebft v\u00e0 kh\u1ea3 n\u0103ng t\u00f9y bi\u1ebfn c\u1ea5u h\u00ecnh \u1edf m\u1ee9c \u0111\u1ed9 s\u00e2u m\u00e0 c\u00e1c c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng kh\u00f4ng \u0111\u00e1p \u1ee9ng \u0111\u01b0\u1ee3c.<\/li>\n\n\n\n<li><strong>T\u00edch h\u1ee3p v\u1edbi h\u1ec7 th\u1ed1ng c\u0169 (Legacy Systems)<\/strong>: Khi c\u1ea7n t\u00edch h\u1ee3p v\u00e0o c\u00e1c ki\u1ebfn tr\u00fac ho\u1eb7c c\u00f4ng ngh\u1ec7 c\u0169 kh\u00f4ng tu\u00e2n theo c\u00e1c quy \u01b0\u1edbc ph\u1ed5 bi\u1ebfn m\u00e0 Spring Boot \u00e1p \u0111\u1eb7t.<\/li>\n\n\n\n<li><strong>M\u1ee5c \u0111\u00edch h\u1ecdc t\u1eadp<\/strong>: Hi\u1ec3u r\u00f5 c\u00e1ch c\u1ea5u h\u00ecnh Spring MVC t\u1eeb \u0111\u1ea7u s\u1ebd mang l\u1ea1i cho b\u1ea1n m\u1ed9t n\u1ec1n t\u1ea3ng ki\u1ebfn th\u1ee9c v\u1eefng ch\u1eafc v\u1ec1 c\u00e1ch Spring Framework ho\u1ea1t \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-mvc-tutorial\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring MVC tutorial: H\u01b0\u1edbng d\u1eabn x\u00e2y \u1ee9ng d\u1ee5ng web v\u1edbi Spring M<\/a><\/strong><a href=\"https:\/\/itviec.com\/blog\/spring-mvc-tutorial\/\">VC<\/a><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cach-k\u1ebft-h\u1ee3p-spring-boot-va-spring-mvc\"><span class=\"ez-toc-section\" id=\"Cach_ket_hop_Spring_Boot_va_Spring_MVC\"><\/span><strong>C\u00e1ch k\u1ebft h\u1ee3p Spring Boot v\u00e0 Spring MVC<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>M\u1ed9t hi\u1ec3u l\u1ea7m ph\u1ed5 bi\u1ebfn l\u00e0 ngh\u0129 r\u1eb1ng Spring Boot thay th\u1ebf Spring MVC. Th\u1ef1c t\u1ebf, Spring Boot kh\u00f4ng thay th\u1ebf m\u00e0 d\u1ef1a tr\u00ean Spring MVC v\u00e0 m\u1edf r\u1ed9ng kh\u1ea3 n\u0103ng c\u1ee7a n\u00f3..<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cach-ho\u1ea1t-d\u1ed9ng\"><strong>C\u00e1ch ho\u1ea1t \u0111\u1ed9ng<\/strong><\/h3>\n\n\n\n<p>H\u00e3y h\u00ecnh dung th\u1ebf n\u00e0y: khi b\u1ea1n t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng web b\u1eb1ng Spring Boot v\u00e0 th\u00eam dependency <code>spring-boot-starter-web<\/code>, Spring Boot s\u1ebd \u0111\u00f3ng vai tr\u00f2 nh\u01b0 m\u1ed9t ng\u01b0\u1eddi qu\u1ea3n l\u00fd d\u1ef1 \u00e1n th\u00f4ng minh. N\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng th\u1ef1c hi\u1ec7n t\u1ea5t c\u1ea3 c\u00e1c c\u00f4ng vi\u1ec7c thi\u1ebft l\u1eadp v\u00e0 c\u1ea5u h\u00ecnh nh\u00e0m ch\u00e1n m\u00e0 tr\u01b0\u1edbc \u0111\u00e2y b\u1ea1n ph\u1ea3i l\u00e0m th\u1ee7 c\u00f4ng v\u1edbi Spring MVC.<\/p>\n\n\n\n<p>C\u1ee5 th\u1ec3, Spring Boot s\u1ebd:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh <code>DispatcherServlet<\/code>.<\/li>\n\n\n\n<li>T\u1ef1 \u0111\u0103ng k\u00fd c\u00e1c <code>HandlerMapping<\/code>, <code>ViewResolver<\/code>.<\/li>\n\n\n\n<li>T\u1ef1 kh\u1edfi ch\u1ea1y m\u1ed9t m\u00e1y ch\u1ee7 web nh\u00fang nh\u01b0 Tomcat.<\/li>\n<\/ul>\n\n\n\n<p>L\u00fac n\u00e0y, b\u1ea1n v\u1edbi t\u01b0 c\u00e1ch l\u00e0 l\u1eadp tr\u00ecnh vi\u00ean, ch\u1ec9 vi\u1ec7c t\u1eadp trung v\u00e0o ph\u1ea7n quan tr\u1ecdng nh\u1ea5t: x\u00e2y d\u1ef1ng logic cho \u1ee9ng d\u1ee5ng. B\u1ea1n v\u1eabn vi\u1ebft c\u00e1c <code>@RestController<\/code>, t\u1ea1o c\u00e1c ph\u01b0\u01a1ng th\u1ee9c x\u1eed l\u00fd request v\u1edbi <code>@GetMapping<\/code>, <code>@PostMapping<\/code>&#8230; t\u1ea5t c\u1ea3 nh\u1eefng ch\u00fa th\u00edch (annotation) n\u00e0y <strong>v\u1ed1n l\u00e0 c\u1ee7a Spring MVC<\/strong>. Spring Boot ch\u1ec9 \u0111\u01a1n gi\u1ea3n l\u00e0 t\u1ea1o ra m\u1ed9t m\u00f4i tr\u01b0\u1eddng \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh s\u1eb5n \u0111\u1ec3 b\u1ea1n s\u1eed d\u1ee5ng ch\u00fang m\u1ed9t c\u00e1ch thu\u1eadn ti\u1ec7n nh\u1ea5t.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-vi-d\u1ee5-t\u1ea1o-m\u1ed9t-\u1ee9ng-d\u1ee5ng-hello-world-d\u01a1n-gi\u1ea3n\"><strong>V\u00ed d\u1ee5 t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng &#8220;Hello World&#8221; \u0111\u01a1n gi\u1ea3n<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-theo-cach-c\u1ee7a-spring-mvc-truy\u1ec1n-th\u1ed1ng\"><strong>Theo c\u00e1ch c\u1ee7a Spring MVC (truy\u1ec1n th\u1ed1ng)<\/strong><\/h4>\n\n\n\n<p>V\u1edbi Spring MVC, \u0111\u1ec3 ch\u1ea1y \u0111\u01b0\u1ee3c \u1ee9ng d\u1ee5ng, b\u1ea1n c\u1ea7n \u00edt nh\u1ea5t 2 l\u1edbp c\u1ea5u h\u00ecnh th\u1ee7 c\u00f4ng:<\/p>\n\n\n\n<p><strong>B\u01b0\u1edbc 1: Kh\u1edfi t\u1ea1o Servlet (Servlet Initializer)<\/strong> B\u1ea1n c\u1ea7n m\u1ed9t l\u1edbp \u0111\u1ec3 \u0111\u0103ng k\u00fd <code>DispatcherServlet <\/code>&#8211; tr\u00e1i tim c\u1ee7a Spring MVC.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ File: MyWebAppInitializer.java\nimport org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;\n\npublic class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {\n\n    @Override\n    protected Class&lt;?&gt;&#91;] getRootConfigClasses() {\n        return null;\n    }\n\n    \/\/ Cung c\u1ea5p l\u1edbp c\u1ea5u h\u00ecnh cho Spring\n    @Override\n    protected Class&lt;?&gt;&#91;] getServletConfigClasses() {\n        return new Class&lt;?&gt;&#91;] { WebConfig.class };\n    }\n\n    \/\/ \u00c1nh x\u1ea1 DispatcherServlet t\u1edbi URL g\u1ed1c \"\/\"\n    @Override\n    protected String&#91;] getServletMappings() {\n        return new String&#91;] { \"\/\" };\n    }\n}<\/code><\/pre>\n\n\n\n<p><strong>B\u01b0\u1edbc 2: C\u1ea5u h\u00ecnh Web (Web Configuration)<\/strong> Ti\u1ebfp theo, b\u1ea1n c\u1ea7n m\u1ed9t l\u1edbp \u0111\u1ec3 k\u00edch ho\u1ea1t Spring MVC v\u00e0 \u0111\u1ecbnh ngh\u0129a c\u00e1c th\u00e0nh ph\u1ea7n nh\u01b0 <code>ViewResolver<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ File: WebConfig.java\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.ComponentScan;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.view.InternalResourceViewResolver;\n\n@Configuration\n@EnableWebMvc \/\/ K\u00edch ho\u1ea1t Spring MVC\n@ComponentScan(\"com.example.controller\") \/\/ Qu\u00e9t c\u00e1c controller\npublic class WebConfig {\n\n    \/\/ C\u1ea5u h\u00ecnh ViewResolver \u0111\u1ec3 t\u00ecm c\u00e1c file JSP\n    @Bean\n    public InternalResourceViewResolver viewResolver() {\n        InternalResourceViewResolver resolver = new InternalResourceViewResolver();\n        resolver.setPrefix(\"\/WEB-INF\/views\/\");\n        resolver.setSuffix(\".jsp\");\n        return resolver;\n    }\n}<\/code><\/pre>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y, ch\u1ec9 \u0111\u1ec3 \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 &#8220;ch\u1ea1y&#8221;, ch\u00fang ta \u0111\u00e3 c\u1ea7n kh\u00e1 nhi\u1ec1u m\u00e3 boilerplate (m\u00e3 l\u1eb7p \u0111i l\u1eb7p l\u1ea1i).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-theo-cach-c\u1ee7a-spring-boot\"><strong>Theo c\u00e1ch c\u1ee7a Spring Boot<\/strong><\/h4>\n\n\n\n<p>V\u1edbi Spring Boot, to\u00e0n b\u1ed9 qu\u00e1 tr\u00ecnh tr\u00ean \u0111\u01b0\u1ee3c r\u00fat g\u1ecdn m\u1ed9t c\u00e1ch \u0111\u00e1ng kinh ng\u1ea1c.<\/p>\n\n\n\n<p><strong>B\u01b0\u1edbc 1: Th\u00eam Dependency<\/strong> Trong file <code>pom.xml<\/code>, b\u1ea1n ch\u1ec9 c\u1ea7n th\u00eam m\u1ed9t dependency duy nh\u1ea5t:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p><strong>B\u01b0\u1edbc 2: T\u1ea1o L\u1edbp Main<\/strong> To\u00e0n b\u1ed9 c\u1ea5u h\u00ecnh \u0111\u01b0\u1ee3c g\u00f3i g\u1ecdn trong m\u1ed9t l\u1edbp ch\u00ednh v\u1edbi ch\u00fa th\u00edch @SpringBootApplication.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@SpringBootApplication.\n\/\/ File: MyApplication.java\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@SpringBootApplication \/\/ Ph\u00e9p m\u00e0u x\u1ea3y ra \u1edf \u0111\u00e2y!\n@RestController\npublic class MyApplication {\n\n    public static void main(String&#91;] args) {\n        SpringApplication.run(MyApplication.class, args);\n    }\n\n    @GetMapping(\"\/\")\n    public String hello() {\n        return \"Hello World!\";\n    }\n}<\/code><\/pre>\n\n\n\n<p>Khi b\u1ea1n ch\u1ea1y l\u1edbp <code>MyApplication<\/code>, Spring Boot s\u1ebd:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nh\u00ecn th\u1ea5y <code>spring-boot-starter-web<\/code> trong <code>pom.xml.<\/code><\/li>\n\n\n\n<li>Hi\u1ec3u r\u1eb1ng \u0111\u00e2y l\u00e0 m\u1ed9t \u1ee9ng d\u1ee5ng web v\u00e0 t\u1ef1 \u0111\u1ed9ng <strong>c\u1ea5u h\u00ecnh m\u1ed9t m\u00e1y ch\u1ee7 Tomcat nh\u00fang<\/strong>.<\/li>\n\n\n\n<li>Ch\u00fa th\u00edch <code>@SpringBootApplication<\/code> s\u1ebd t\u1ef1 \u0111\u1ed9ng <strong>qu\u00e9t c\u00e1c component<\/strong> (nh\u01b0 <code>@RestController<\/code>) v\u00e0 <strong>thi\u1ebft l\u1eadp DispatcherServlet<\/strong> c\u00f9ng c\u00e1c c\u1ea5u h\u00ecnh MVC m\u1eb7c \u0111\u1ecbnh kh\u00e1c.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-spring-mvc-vs-spring-boot\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Spring_MVC_vs_Spring_Boot\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring MVC vs Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-chuy\u1ec3n-d\u1ed5i-m\u1ed9t-d\u1ef1-an-t\u1eeb-spring-mvc-sang-spring-boot-co-kho-khong\"><strong>Chuy\u1ec3n \u0111\u1ed5i m\u1ed9t d\u1ef1 \u00e1n t\u1eeb Spring MVC sang Spring Boot c\u00f3 kh\u00f3 kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>\u0110i\u1ec1u n\u00e0y ph\u1ee5 thu\u1ed9c v\u00e0o \u0111\u1ed9 ph\u1ee9c t\u1ea1p c\u1ee7a d\u1ef1 \u00e1n.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0110\u1ed1i v\u1edbi c\u00e1c d\u1ef1 \u00e1n ti\u00eau chu\u1ea9n:<\/strong> Qu\u00e1 tr\u00ecnh chuy\u1ec3n \u0111\u1ed5i kh\u00e1 \u0111\u01a1n gi\u1ea3n. C\u00f4ng vi\u1ec7c ch\u00ednh l\u00e0 lo\u1ea1i b\u1ecf c\u00e1c c\u1ea5u h\u00ecnh XML ho\u1eb7c Java th\u1ee7 c\u00f4ng v\u00e0 thay th\u1ebf ch\u00fang b\u1eb1ng c\u00e1c starter v\u00e0 thu\u1ed9c t\u00ednh c\u1ee7a Spring Boot.<\/li>\n\n\n\n<li><strong>\u0110\u1ed1i v\u1edbi c\u00e1c d\u1ef1 \u00e1n c\u00f3 nhi\u1ec1u c\u1ea5u h\u00ecnh t\u00f9y bi\u1ebfn s\u00e2u:<\/strong> Vi\u1ec7c chuy\u1ec3n \u0111\u1ed5i s\u1ebd ph\u1ee9c t\u1ea1p h\u01a1n v\u00e0 \u0111\u00f2i h\u1ecfi ph\u1ea3i \u00e1nh x\u1ea1 c\u1ea9n th\u1eadn c\u00e1c c\u1ea5u h\u00ecnh c\u0169 sang c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh c\u1ee7a Spring Boot.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-co-th\u1ec3-s\u1eed-d\u1ee5ng-spring-boot-ma-khong-c\u1ea7n-spring-mvc-khong\"><strong>C\u00f3 th\u1ec3 s\u1eed d\u1ee5ng Spring Boot m\u00e0 kh\u00f4ng c\u1ea7n Spring MVC kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Ho\u00e0n to\u00e0n c\u00f3 th\u1ec3.<\/p>\n\n\n\n<p>Spring Boot l\u00e0 m\u1ed9t framework c\u00f3 c\u1ea5u tr\u00fac module. N\u1ebfu b\u1ea1n kh\u00f4ng th\u00eam starter <code>spring-boot-starter-web<\/code>, c\u00e1c th\u00e0nh ph\u1ea7n c\u1ee7a Spring MVC s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c t\u1ea3i. B\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng Spring Boot \u0111\u1ec3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web <strong>ph\u1ea3n \u1ee9ng (reactive)<\/strong> v\u1edbi <code>spring-boot-starter-webflux<\/code>.<\/li>\n\n\n\n<li>T\u1ea1o c\u00e1c \u1ee9ng d\u1ee5ng x\u1eed l\u00fd theo l\u00f4 (batch applications) v\u1edbi <code>spring-boot-starter-batch<\/code>.<\/li>\n\n\n\n<li>Vi\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng d\u00f2ng l\u1ec7nh (command-line tools).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-co-c\u1ea7n-h\u1ecdc-spring-mvc-tr\u01b0\u1edbc-khi-h\u1ecdc-spring-boot-khong\"><strong>C\u00f3 c\u1ea7n h\u1ecdc Spring MVC tr\u01b0\u1edbc khi h\u1ecdc Spring Boot kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>B\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 b\u1eaft \u0111\u1ea7u tr\u1ef1c ti\u1ebfp v\u1edbi Spring Boot v\u00e0 x\u00e2y d\u1ef1ng s\u1ea3n ph\u1ea9m ngay l\u1eadp t\u1ee9c. Tuy nhi\u00ean, vi\u1ec7c hi\u1ec3u c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a Spring MVC (nh\u01b0 <code>DispatcherServlet<\/code>, <code>Model<\/code>, <code>View<\/code>, <code>Controller<\/code>) s\u1ebd cho b\u1ea1n m\u1ed9t n\u1ec1n t\u1ea3ng v\u1eefng ch\u1eafc. Ki\u1ebfn th\u1ee9c n\u00e0y v\u00f4 c\u00f9ng qu\u00fd gi\u00e1 khi b\u1ea1n c\u1ea7n g\u1ee1 l\u1ed7i (debug) ho\u1eb7c t\u00f9y ch\u1ec9nh c\u00e1c c\u1ea5u h\u00ecnh m\u00e0 Spring Boot \u0111\u00e3 t\u1ef1 \u0111\u1ed9ng l\u00e0m cho b\u1ea1n.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/lo-trinh-hoc-spring-boot-roadmap\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Boot Roadmap: L\u1ed9 tr\u00ecnh h\u1ecdc Spring Boot chi ti\u1ebft<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-boot-co-lam-\u1ee9ng-d\u1ee5ng-ch\u1eadm-h\u01a1n-khong\"><strong>Spring Boot c\u00f3 l\u00e0m \u1ee9ng d\u1ee5ng ch\u1eadm h\u01a1n kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Kh\u00f4ng \u0111\u00e1ng k\u1ec3. Th\u1eddi gian kh\u1edfi \u0111\u1ed9ng c\u00f3 th\u1ec3 l\u00e2u h\u01a1n m\u1ed9t ch\u00fat, nh\u01b0ng hi\u1ec7u n\u0103ng khi ch\u1ea1y g\u1ea7n nh\u01b0 t\u01b0\u01a1ng \u0111\u01b0\u01a1ng v\u00ec ch\u00fang d\u00f9ng chung m\u1ed9t n\u1ec1n t\u1ea3ng.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-k\u1ebft-spring-mvc-vs-spring-boot\"><span class=\"ez-toc-section\" id=\"Tong_ket_Spring_MVC_vs_Spring_Boot\"><\/span><strong>T\u1ed5ng k\u1ebft Spring MVC vs Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Spring MVC v\u00e0 Spring Boot kh\u00f4ng thay th\u1ebf nhau m\u00e0 c\u00f3 m\u1ed1i quan h\u1ec7 c\u1ed9ng sinh. Spring MVC l\u00e0 m\u1ed9t module c\u1ee7a Spring Framework, \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web theo ki\u1ebfn tr\u00fac MVC, \u0111\u00f2i h\u1ecfi c\u1ea5u h\u00ecnh th\u1ee7 c\u00f4ng v\u00e0 tri\u1ec3n khai l\u00ean m\u00e1y ch\u1ee7 b\u00ean ngo\u00e0i. Ng\u01b0\u1ee3c l\u1ea1i, Spring Boot l\u00e0 ph\u1ea7n m\u1edf r\u1ed9ng c\u1ee7a Spring Framework, gi\u00fap t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n b\u1eb1ng c\u00e1ch t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh, cung c\u1ea5p c\u00e1c starter dependencies v\u00e0 t\u00edch h\u1ee3p m\u00e1y ch\u1ee7 nh\u00fang.<\/p>\n\n\n\n<p>Spring Boot \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n b\u1eb1ng c\u00e1ch t\u1ef1 \u0111\u1ed9ng h\u00f3a c\u00e1c thi\u1ebft l\u1eadp ph\u1ee9c t\u1ea1p c\u1ee7a Spring MVC. M\u1eb7c d\u00f9 b\u1ea1n c\u00f3 th\u1ec3 b\u1eaft \u0111\u1ea7u v\u1edbi Spring Boot ngay l\u1eadp t\u1ee9c, vi\u1ec7c hi\u1ec3u Spring MVC s\u1ebd cung c\u1ea5p n\u1ec1n t\u1ea3ng ki\u1ebfn th\u1ee9c v\u1eefng ch\u1eafc cho vi\u1ec7c g\u1ee1 l\u1ed7i v\u00e0 t\u00f9y ch\u1ec9nh.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trong h\u1ec7 sinh th\u00e1i Java, Spring MVC v\u00e0 Spring Boot l\u00e0 hai c\u00e1i t\u00ean \u0111\u00ecnh \u0111\u00e1m m\u00e0 b\u1ea5t k\u1ef3 l\u1eadp tr\u00ecnh vi\u00ean web n\u00e0o c\u0169ng t\u1eebng nghe t\u1edbi. Tuy nhi\u00ean, s\u1ef1 ph\u1ed5 bi\u1ebfn n\u00e0y c\u0169ng \u0111i k\u00e8m kh\u00f4ng \u00edt nh\u1ea7m l\u1eabn: Li\u1ec7u Spring Boot c\u00f3 ph\u1ea3i l\u00e0 phi\u00ean b\u1ea3n k\u1ebf nhi\u1ec7m, \u0111\u01b0\u1ee3c sinh ra \u0111\u1ec3 [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":90291,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109,10350],"tags":[10349],"class_list":["post-89941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it","category-java","tag-spring"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Spring Boot c\u00f3 thay th\u1ebf Spring MVC kh\u00f4ng? Ph\u00e2n bi\u1ec7t Spring MVC vs Spring boot v\u00e0 c\u00e1ch ch\u00fang ho\u1ea1t \u0111\u1ed9ng \u0111\u1ec3 \u00e1p d\u1ee5ng \u0111\u00fang cho d\u1ef1 \u00e1n web c\u1ee7a b\u1ea1n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java\" \/>\n<meta property=\"og:description\" content=\"Trong h\u1ec7 sinh th\u00e1i Java, Spring MVC v\u00e0 Spring Boot l\u00e0 hai c\u00e1i t\u00ean \u0111\u00ecnh \u0111\u00e1m m\u00e0 b\u1ea5t k\u1ef3 l\u1eadp tr\u00ecnh vi\u00ean web n\u00e0o c\u0169ng t\u1eebng nghe t\u1edbi. Tuy nhi\u00ean, s\u1ef1 ph\u1ed5 bi\u1ebfn n\u00e0y\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/\" \/>\n<meta property=\"og:site_name\" content=\"ITviec Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITviec\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-31T16:25:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-31T16:25:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1347\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tien Tran\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ITviec\" \/>\n<meta name=\"twitter:site\" content=\"@ITviec\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tien Tran\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java - ITviec Blog","description":"Spring Boot c\u00f3 thay th\u1ebf Spring MVC kh\u00f4ng? Ph\u00e2n bi\u1ec7t Spring MVC vs Spring boot v\u00e0 c\u00e1ch ch\u00fang ho\u1ea1t \u0111\u1ed9ng \u0111\u1ec3 \u00e1p d\u1ee5ng \u0111\u00fang cho d\u1ef1 \u00e1n web c\u1ee7a b\u1ea1n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/","og_locale":"vi_VN","og_type":"article","og_title":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java","og_description":"Trong h\u1ec7 sinh th\u00e1i Java, Spring MVC v\u00e0 Spring Boot l\u00e0 hai c\u00e1i t\u00ean \u0111\u00ecnh \u0111\u00e1m m\u00e0 b\u1ea5t k\u1ef3 l\u1eadp tr\u00ecnh vi\u00ean web n\u00e0o c\u0169ng t\u1eebng nghe t\u1edbi. Tuy nhi\u00ean, s\u1ef1 ph\u1ed5 bi\u1ebfn n\u00e0y","og_url":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-07-31T16:25:49+00:00","article_modified_time":"2025-07-31T16:25:51+00:00","og_image":[{"width":2560,"height":1347,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png","type":"image\/png"}],"author":"Tien Tran","twitter_card":"summary_large_image","twitter_creator":"@ITviec","twitter_site":"@ITviec","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Tien Tran","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"15 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/"},"author":{"name":"Tien Tran","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/1595d671c49cfa2a48cd3c0a047a1298"},"headline":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java","datePublished":"2025-07-31T16:25:49+00:00","dateModified":"2025-07-31T16:25:51+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/"},"wordCount":4089,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png","keywords":["spring"],"articleSection":["Chuy\u00ean m\u00f4n IT","Java"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/","url":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/","name":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png","datePublished":"2025-07-31T16:25:49+00:00","dateModified":"2025-07-31T16:25:51+00:00","description":"Spring Boot c\u00f3 thay th\u1ebf Spring MVC kh\u00f4ng? Ph\u00e2n bi\u1ec7t Spring MVC vs Spring boot v\u00e0 c\u00e1ch ch\u00fang ho\u1ea1t \u0111\u1ed9ng \u0111\u1ec3 \u00e1p d\u1ee5ng \u0111\u00fang cho d\u1ef1 \u00e1n web c\u1ee7a b\u1ea1n.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-mvc-vs-spring-boot-scaled.png","width":800,"height":421,"caption":"Spring MVC vs Spring Boot - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/spring-mvc-vs-spring-boot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Chuy\u00ean m\u00f4n IT","item":"https:\/\/itviec.com\/blog\/chuyen-mon-it\/"},{"@type":"ListItem","position":2,"name":"Spring MVC vs Spring Boot: C\u00e1ch ch\u1ecdn \u0111\u00fang cho d\u1ef1 \u00e1n Java"}]},{"@type":"WebSite","@id":"https:\/\/itviec.com\/blog\/#website","url":"https:\/\/itviec.com\/blog\/","name":"ITviec Blog","description":"IT Jobs &amp; People in Vietnam","publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itviec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/itviec.com\/blog\/#organization","name":"ITviec","url":"https:\/\/itviec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","width":1800,"height":1800,"caption":"ITviec"},"image":{"@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ITviec","https:\/\/x.com\/ITviec","https:\/\/www.linkedin.com\/company\/itviec","https:\/\/www.youtube.com\/channel\/UCYthAQ3bcGr57M_ag5gHDvQ"]},{"@type":"Person","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/1595d671c49cfa2a48cd3c0a047a1298","name":"Tien Tran","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/05\/tien-tran-author-e1715658627643-100x100.jpg","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/05\/tien-tran-author-e1715658627643-100x100.jpg","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/05\/tien-tran-author-e1715658627643-100x100.jpg","caption":"Tien Tran"},"url":"https:\/\/itviec.com\/blog\/author\/tien-tran\/"}]}},"_links":{"self":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/users\/203"}],"replies":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/comments?post=89941"}],"version-history":[{"count":5,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89941\/revisions"}],"predecessor-version":[{"id":90293,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89941\/revisions\/90293"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/90291"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=89941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=89941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=89941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}