{"id":88878,"date":"2025-07-01T22:11:22","date_gmt":"2025-07-01T15:11:22","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=88878"},"modified":"2025-07-02T09:22:29","modified_gmt":"2025-07-02T02:22:29","slug":"spring-boot-la-gi","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/","title":{"rendered":"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 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-boot-la-gi\/#Spring_Boot_la_gi_Phu_hop_voi_du_an_nao\" >Spring Boot l\u00e0 g\u00ec? Ph\u00f9 h\u1ee3p v\u1edbi d\u1ef1 \u00e1n n\u00e0o?<\/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-boot-la-gi\/#Vi_sao_nen_chon_Spring_Boot\" >V\u00ec sao n\u00ean ch\u1ecdn Spring Boot?<\/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-boot-la-gi\/#Cac_khai_niem_cot_loi_cua_Spring_Boot\" >C\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a Spring Boot<\/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-boot-la-gi\/#Huong_dan_xay_dung_ung_dung_dau_tien_voi_Spring_Boot\" >H\u01b0\u1edbng d\u1eabn x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng \u0111\u1ea7u ti\u00ean v\u1edbi 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-boot-la-gi\/#He_sinh_thai_Spring\" >H\u1ec7 sinh th\u00e1i Spring&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#Cac_cau_hoi_thuong_gap_ve_Spring_Boot\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring Boot<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Spring Boot l\u00e0 m\u1ed9t framework gi\u00fap b\u1ea1n nhanh ch\u00f3ng v\u00e0 d\u1ec5 d\u00e0ng x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho m\u00f4i tr\u01b0\u1eddng production. N\u1ebfu b\u1ea1n l\u00e0 l\u1eadp tr\u00ecnh vi\u00ean Java mu\u1ed1n t\u00ecm hi\u1ec3u m\u1ed9t ph\u01b0\u01a1ng ph\u00e1p ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng hi\u1ec7n \u0111\u1ea1i, b\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u00fap b\u1ea1n n\u1eafm \u0111\u01b0\u1ee3c ki\u1ebfn th\u1ee9c n\u1ec1n t\u1ea3ng v\u1ec1 Spring Boot v\u00e0 c\u00f3 th\u1ec3 t\u1ef1 tay x\u00e2y d\u1ef1ng nh\u1eefng \u1ee9ng d\u1ee5ng \u0111\u1ea7u ti\u00ean c\u1ee7a m\u00ecnh.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft n\u00e0y \u0111\u1ec3 bi\u1ebft th\u00eam chi ti\u1ebft:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spring Boot l\u00e0 g\u00ec? T\u1ea1i sao n\u00ean ch\u1ecdn Spring Boot?<\/li>\n\n\n\n<li>C\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a Spring Boot<\/li>\n\n\n\n<li>X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng \u0111\u1ea7u ti\u00ean v\u1edbi Spring Boot<\/li>\n\n\n\n<li>H\u1ec7 sinh th\u00e1i Spring Boot<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-spring-boot-la-gi-phu-h\u1ee3p-v\u1edbi-d\u1ef1-an-nao\"><span class=\"ez-toc-section\" id=\"Spring_Boot_la_gi_Phu_hop_voi_du_an_nao\"><\/span><strong>Spring Boot l\u00e0 g\u00ec? Ph\u00f9 h\u1ee3p v\u1edbi d\u1ef1 \u00e1n n\u00e0o?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Spring Boot l\u00e0 m\u1ed9t framework m\u00e3 ngu\u1ed3n m\u1edf d\u1ef1a tr\u00ean Java, gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c ph\u00e1t tri\u1ec3n c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho m\u00f4i tr\u01b0\u1eddng production. N\u00f3 lo\u1ea1i b\u1ecf ph\u1ea7n l\u1edbn c\u00f4ng vi\u1ec7c c\u1ea5u h\u00ecnh ph\u1ee9c t\u1ea1p th\u01b0\u1eddng th\u1ea5y trong c\u00e1c d\u1ef1 \u00e1n Spring truy\u1ec1n th\u1ed1ng, cho ph\u00e9p b\u1ea1n t\u1eadp trung v\u00e0o vi\u1ec7c vi\u1ebft logic nghi\u1ec7p v\u1ee5.<\/p>\n\n\n\n<p>\u0110\u1eb7c bi\u1ec7t framework n\u00e0y r\u1ea5t ph\u00f9 h\u1ee3p v\u1edbi nh\u1eefng d\u1ef1 \u00e1n nh\u01b0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Microservices<\/strong>: Kh\u1ea3 n\u0103ng t\u1ea1o c\u00e1c \u1ee9ng d\u1ee5ng nh\u1ecf, \u0111\u1ed9c l\u1eadp v\u00e0 d\u1ec5 d\u00e0ng tri\u1ec3n khai l\u00e0m cho Spring Boot tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u \u0111\u1ec3 x\u00e2y d\u1ef1ng ki\u1ebfn tr\u00fac microservices.<\/li>\n\n\n\n<li><strong>\u1ee8ng d\u1ee5ng web v\u00e0 RESTful API<\/strong>: Cung c\u1ea5p s\u1eb5n c\u00e1c c\u00f4ng c\u1ee5 v\u00e0 th\u01b0 vi\u1ec7n \u0111\u1ec3 ph\u00e1t tri\u1ec3n nhanh ch\u00f3ng c\u00e1c \u1ee9ng d\u1ee5ng web v\u00e0 API.<\/li>\n\n\n\n<li><strong>\u1ee8ng d\u1ee5ng c\u1ea7n kh\u1edfi \u0111\u1ed9ng nhanh (Rapid Application Development &#8211; RAD)<\/strong>: V\u1edbi t\u00ednh n\u0103ng &#8220;convention over configuration&#8221; (\u01b0u ti\u00ean quy \u01b0\u1edbc h\u01a1n c\u1ea5u h\u00ecnh) v\u00e0 &#8220;auto-configuration&#8221; (t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh), Spring Boot gi\u00fap gi\u1ea3m thi\u1ec3u th\u1eddi gian thi\u1ebft l\u1eadp ban \u0111\u1ea7u, \u0111\u1ea9y nhanh qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n.<\/li>\n\n\n\n<li><strong>C\u00e1c \u1ee9ng d\u1ee5ng c\u1ea7n t\u00edch h\u1ee3p d\u1ec5 d\u00e0ng v\u1edbi h\u1ec7 sinh th\u00e1i Spring<\/strong>: N\u1ebfu b\u1ea1n \u0111\u00e3 quen thu\u1ed9c v\u1edbi Spring Framework (v\u00ed d\u1ee5: Spring Data, Spring Security), Spring Boot gi\u00fap t\u1eadn d\u1ee5ng t\u1ed1i \u0111a c\u00e1c module n\u00e0y m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng.<\/li>\n\n\n\n<li><strong>D\u1ef1 \u00e1n c\u1ea7n s\u1ef1 linh ho\u1ea1t v\u00e0 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng<\/strong>: Spring Boot d\u1ec5 d\u00e0ng t\u00f9y ch\u1ec9nh v\u00e0 m\u1edf r\u1ed9ng khi d\u1ef1 \u00e1n ph\u00e1t tri\u1ec3n.<\/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 th\u00eam: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-framework-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring l\u00e0 g\u00ec? Spring Framework l\u00e0 g\u00ec?<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-vi-sao-nen-ch\u1ecdn-spring-boot\"><span class=\"ez-toc-section\" id=\"Vi_sao_nen_chon_Spring_Boot\"><\/span><strong>V\u00ec sao n\u00ean ch\u1ecdn Spring Boot?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Khi b\u1eaft tay v\u00e0o m\u1ed9t d\u1ef1 \u00e1n Java m\u1edbi ho\u1eb7c t\u00ecm c\u00e1ch t\u1ed1i \u01b0u h\u00f3a quy tr\u00ecnh ph\u00e1t tri\u1ec3n hi\u1ec7n t\u1ea1i, c\u00e2u h\u1ecfi &#8220;N\u00ean s\u1eed d\u1ee5ng c\u00f4ng ngh\u1ec7 n\u00e0o?&#8221; lu\u00f4n \u0111\u01b0\u1ee3c \u0111\u1eb7t ra. Spring Boot \u0111\u00e3 nhanh ch\u00f3ng tr\u1edf th\u00e0nh m\u1ed9t l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean v\u00e0 doanh nghi\u1ec7p, v\u00e0 d\u01b0\u1edbi \u0111\u00e2y l\u00e0 nh\u1eefng l\u00fd do thuy\u1ebft ph\u1ee5c t\u1ea1i sao b\u1ea1n n\u00ean c\u00e2n nh\u1eafc s\u1eed d\u1ee5ng framework n\u00e0y:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-d\u01a1n-gi\u1ea3n-hoa-vi\u1ec7c-thi\u1ebft-l\u1eadp\"><strong>\u0110\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c thi\u1ebft l\u1eadp<\/strong><\/h3>\n\n\n\n<p>M\u1ed9t trong nh\u1eefng r\u00e0o c\u1ea3n l\u1edbn khi b\u1eaft \u0111\u1ea7u v\u1edbi Spring Framework truy\u1ec1n th\u1ed1ng l\u00e0 kh\u1ed1i l\u01b0\u1ee3ng c\u1ea5u h\u00ecnh ban \u0111\u1ea7u. Spring Boot gi\u1ea3i quy\u1ebft tri\u1ec7t \u0111\u1ec3 v\u1ea5n \u0111\u1ec1 n\u00e0y:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gi\u1ea3m thi\u1ec3u c\u1ea5u h\u00ecnh:<\/strong> B\u1ea1n s\u1ebd n\u00f3i l\u1eddi t\u1ea1m bi\u1ec7t v\u1edbi nh\u1eefng file XML c\u1ea5u h\u00ecnh d\u00e0i d\u00f2ng ho\u1eb7c v\u00f4 s\u1ed1 c\u00e1c l\u1edbp Java-based config ph\u1ee9c t\u1ea1p. Spring Boot gi\u1ea3m thi\u1ec3u t\u1ed1i \u0111a l\u01b0\u1ee3ng code boilerplate b\u1ea1n c\u1ea7n ph\u1ea3i vi\u1ebft.<\/li>\n\n\n\n<li><strong>&#8220;Convention over Configuration&#8221; (\u01afu ti\u00ean quy \u01b0\u1edbc h\u01a1n c\u1ea5u h\u00ecnh):<\/strong> Spring Boot \u00e1p d\u1ee5ng tri\u1ebft l\u00fd n\u00e0y b\u1eb1ng c\u00e1ch cung c\u1ea5p c\u00e1c c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh c\u1ef1c k\u1ef3 h\u1ee3p l\u00fd cho h\u1ea7u h\u1ebft c\u00e1c tr\u01b0\u1eddng h\u1ee3p ph\u1ed5 bi\u1ebfn. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 b\u1ea1n ch\u1ec9 c\u1ea7n can thi\u1ec7p v\u00e0 t\u00f9y ch\u1ec9nh khi th\u1ef1c s\u1ef1 c\u00f3 nhu c\u1ea7u \u0111\u1eb7c bi\u1ec7t, thay v\u00ec ph\u1ea3i \u0111\u1ecbnh ngh\u0129a m\u1ecdi th\u1ee9 t\u1eeb \u0111\u1ea7u.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-t\u1ef1-d\u1ed9ng-c\u1ea5u-hinh-auto-configuration\"><strong>T\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh (Auto-Configuration)<\/strong><\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 m\u1ed9t trong nh\u1eefng &#8220;ph\u00e9p m\u00e0u&#8221; c\u1ee7a Spring Boot, gi\u00fap t\u0103ng t\u1ed1c \u0111\u00e1ng k\u1ec3 qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o d\u1ef1 \u00e1n:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>C\u01a1 ch\u1ebf th\u00f4ng minh:<\/strong> Spring Boot t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n d\u1ef1a tr\u00ean c\u00e1c th\u01b0 vi\u1ec7n (dependencies) m\u00e0 b\u1ea1n \u0111\u00e3 th\u00eam v\u00e0o <code>classpath<\/code>. N\u00f3 s\u1ebd &#8220;quan s\u00e1t&#8221; v\u00e0 thi\u1ebft l\u1eadp nh\u1eefng g\u00ec c\u1ea7n thi\u1ebft \u0111\u1ec3 c\u00e1c th\u00e0nh ph\u1ea7n n\u00e0y ho\u1ea1t \u0111\u1ed9ng c\u00f9ng nhau m\u1ed9t c\u00e1ch tr\u01a1n tru.<\/li>\n\n\n\n<li><strong>V\u00ed d\u1ee5 th\u1ef1c t\u1ebf:<\/strong> N\u1ebfu b\u1ea1n th\u00eam <a href=\"https:\/\/mvnrepository.com\/artifact\/org.springframework.boot\/spring-boot-starter-web\" target=\"_blank\" rel=\"noreferrer noopener\">spring-boot-starter-web<\/a> v\u00e0o d\u1ef1 \u00e1n, Spring Boot s\u1ebd t\u1ef1 \u0111\u1ed9ng hi\u1ec3u r\u1eb1ng b\u1ea1n \u0111ang x\u00e2y d\u1ef1ng m\u1ed9t \u1ee9ng d\u1ee5ng web. N\u00f3 s\u1ebd t\u1ef1 c\u1ea5u h\u00ecnh nh\u1eefng th\u1ee9 nh\u01b0 <a href=\"https:\/\/docs.spring.io\/spring-framework\/reference\/web\/webmvc\/mvc-servlet.html\" target=\"_blank\" rel=\"noreferrer noopener\">DispatcherServlet<\/a>, <a href=\"https:\/\/docs.spring.io\/spring-framework\/reference\/web\/webmvc\/mvc-controller\/ann-methods\/jackson.html\" target=\"_blank\" rel=\"noreferrer noopener\">Jackson<\/a> (th\u01b0 vi\u1ec7n x\u1eed l\u00fd JSON), <a href=\"https:\/\/www.baeldung.com\/spring-boot-configure-tomcat\" target=\"_blank\" rel=\"noreferrer noopener\">Embedded Tomcat<\/a>, v\u00e0 nhi\u1ec1u th\u1ee9 kh\u00e1c m\u00e0 kh\u00f4ng c\u1ea7n b\u1ea1n ph\u1ea3i vi\u1ebft m\u1ed9t d\u00f2ng code c\u1ea5u h\u00ecnh n\u00e0o.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-qu\u1ea3n-ly-th\u01b0-vi\u1ec7n-ti\u1ec7n-l\u1ee3i-v\u1edbi-starter-dependencies-cac-goi-ph\u1ee5-thu\u1ed9c\"><strong>Qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n ti\u1ec7n l\u1ee3i v\u1edbi Starter Dependencies (C\u00e1c g\u00f3i ph\u1ee5 thu\u1ed9c)<\/strong><\/h3>\n\n\n\n<p>M\u1ed9t trong nh\u1eefng l\u00fd do thuy\u1ebft ph\u1ee5c nh\u1ea5t \u0111\u1ec3 ch\u1ecdn Spring Boot ch\u00ednh l\u00e0 c\u00e1ch n\u00f3 gi\u1ea3i quy\u1ebft n\u1ed7i \u00e1m \u1ea3nh v\u1ec1 qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n v\u00e0 \u0111\u1ea3m b\u1ea3o t\u00ednh t\u01b0\u01a1ng th\u00edch gi\u1eefa ch\u00fang. Thay v\u00ec ph\u1ea3i v\u1eadt l\u1ed9n v\u1edbi vi\u1ec7c t\u00ecm ki\u1ebfm, khai b\u00e1o v\u00e0 ki\u1ec3m tra t\u1eebng dependency ri\u00eang l\u1ebb, Spring Boot gi\u1edbi thi\u1ec7u kh\u00e1i ni\u1ec7m <strong>&#8220;Starters&#8221;<\/strong> \u2013 c\u00e1c g\u00f3i ph\u1ee5 thu\u1ed9c ti\u1ec7n l\u1ee3i.<\/p>\n\n\n\n<p>V\u1ec1 b\u1ea3n ch\u1ea5t, Starters l\u00e0 nh\u1eefng khai b\u00e1o \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a s\u1eb5n (trong file POM cho Maven ho\u1eb7c khai b\u00e1o dependencies cho Gradle) gom nh\u00f3m t\u1ea5t c\u1ea3 c\u00e1c th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft cho m\u1ed9t ch\u1ee9c n\u0103ng c\u1ee5 th\u1ec3. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0:<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/spring.io\/guides\/gs\/accessing-data-jpa\" target=\"_blank\" rel=\"noreferrer noopener\">spring-boot-starter-data-jpa<\/a>: Bao g\u1ed3m m\u1ecdi th\u1ee9 b\u1ea1n c\u1ea7n \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u quan h\u1ec7 s\u1eed d\u1ee5ng JPA, bao g\u1ed3m Spring Data JPA, Hibernate, v\u00e0 c\u00e1c tr\u00ecnh k\u1ebft n\u1ed1i JDBC.<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.spring.io\/spring-security\/reference\/getting-spring-security.html\" target=\"_blank\" rel=\"noreferrer noopener\">spring-boot-starter-security<\/a>: Cung c\u1ea5p c\u00e1c th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft \u0111\u1ec3 t\u00edch h\u1ee3p Spring Security v\u00e0o \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n.<\/li>\n<\/ul>\n\n\n\n<p><strong>L\u1ee3i \u00edch:<\/strong> Ch\u1ec9 c\u1ea7n th\u00eam m\u1ed9t starter, b\u1ea1n s\u1ebd c\u00f3 ngay m\u1ed9t b\u1ed9 th\u01b0 vi\u1ec7n \u0111\u1ea7y \u0111\u1ee7 v\u00e0 t\u01b0\u01a1ng th\u00edch, gi\u00fap b\u1ea1n tr\u00e1nh kh\u1ecfi vi\u1ec7c ph\u1ea3i t\u00ecm ki\u1ebfm, khai b\u00e1o t\u1eebng dependency ri\u00eang l\u1ebb v\u00e0 lo l\u1eafng v\u1ec1 xung \u0111\u1ed9t phi\u00ean b\u1ea3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-d\u01a1n-gi\u1ea3n-hoa-tri\u1ec3n-khai-nh\u1edd-may-ch\u1ee7-nhung-embedded-servers\"><strong>\u0110\u01a1n gi\u1ea3n h\u00f3a tri\u1ec3n khai nh\u1edd m\u00e1y ch\u1ee7 nh\u00fang (Embedded Servers)<\/strong><\/h3>\n\n\n\n<p>Y\u1ebfu t\u1ed1 then ch\u1ed1t khi\u1ebfn Spring Boot tr\u1edf n\u00ean h\u1ea5p d\u1eabn v\u00e0 \u0111\u01b0\u1ee3c tin d\u00f9ng r\u1ed9ng r\u00e3i l\u00e0 v\u00ec s\u1ef1 \u0111\u01a1n gi\u1ea3n v\u00e0 linh ho\u1ea1t trong vi\u1ec7c tri\u1ec3n khai nh\u1edd m\u00e1y ch\u1ee7 nh\u00fang (Embedded Servers), gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh tri\u1ec3n khai \u1ee9ng d\u1ee5ng.<\/p>\n\n\n\n<p>V\u1edbi Spring Boot, b\u1ea1n s\u1ebd \u0111\u01b0\u1ee3c tr\u1ea3i nghi\u1ec7m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kh\u00f4ng c\u00f2n g\u00e1nh n\u1eb7ng c\u00e0i \u0111\u1eb7t v\u00e0 c\u1ea5u h\u00ecnh m\u00e1y ch\u1ee7 ri\u00eang:<\/strong> Spring Boot t\u00edch h\u1ee3p s\u1eb5n c\u00e1c m\u00e1y ch\u1ee7 web ph\u1ed5 bi\u1ebfn nh\u01b0 Tomcat, Jetty, ho\u1eb7c Undertow ngay b\u00ean trong \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 b\u1ea1n kh\u00f4ng c\u1ea7n ph\u1ea3i c\u00e0i \u0111\u1eb7t hay qu\u1ea3n l\u00fd m\u1ed9t m\u00e1y ch\u1ee7 \u1ee9ng d\u1ee5ng Java ri\u00eang bi\u1ec7t.<\/li>\n\n\n\n<li><strong>\u0110\u00f3ng g\u00f3i v\u00e0 ch\u1ea1y \u1ee9ng d\u1ee5ng ch\u1ec9 b\u1eb1ng m\u1ed9t file JAR duy nh\u1ea5t:<\/strong> Thay v\u00ec ph\u1ea3i t\u1ea1o c\u00e1c file WAR ph\u1ee9c t\u1ea1p v\u00e0 tri\u1ec3n khai l\u00ean m\u1ed9t m\u00e1y ch\u1ee7 b\u00ean ngo\u00e0i, \u1ee9ng d\u1ee5ng Spring Boot c\u1ee7a b\u1ea1n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i th\u00e0nh m\u1ed9t file <code>.jar<\/code> \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng \u0111\u1ec3 ch\u1ea1y. Ch\u1ec9 v\u1edbi m\u1ed9t l\u1ec7nh \u0111\u01a1n gi\u1ea3n <code>java -jar ten-ung-dung.jar<\/code>, \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n \u0111\u00e3 c\u00f3 th\u1ec3 ho\u1ea1t \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<p>S\u1ef1 ti\u1ec7n l\u1ee3i n\u00e0y mang l\u1ea1i nhi\u1ec1u \u01b0u \u0111i\u1ec3m l\u1edbn:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u0103ng t\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n v\u00e0 ki\u1ec3m th\u1eed:<\/strong> Vi\u1ec7c kh\u1edfi \u0111\u1ed9ng v\u00e0 ch\u1ea1y \u1ee9ng d\u1ee5ng tr\u1edf n\u00ean nhanh ch\u00f3ng, gi\u00fap r\u00fat ng\u1eafn chu k\u1ef3 ph\u00e1t tri\u1ec3n.<\/li>\n\n\n\n<li><strong>\u0110\u01a1n gi\u1ea3n h\u00f3a quy tr\u00ecnh tri\u1ec3n khai (deployment):<\/strong> Vi\u1ec7c tri\u1ec3n khai ch\u1ec9 \u0111\u01a1n gi\u1ea3n l\u00e0 sao ch\u00e9p file JAR v\u00e0 ch\u1ea1y n\u00f3, c\u1ef1c k\u1ef3 hi\u1ec7u qu\u1ea3 trong c\u00e1c m\u00f4i tr\u01b0\u1eddng CI\/CD.<\/li>\n\n\n\n<li><strong>L\u00fd t\u01b0\u1edfng cho ki\u1ebfn tr\u00fac Microservices:<\/strong> Kh\u1ea3 n\u0103ng \u0111\u00f3ng g\u00f3i th\u00e0nh m\u1ed9t \u0111\u01a1n v\u1ecb \u0111\u1ed9c l\u1eadp, d\u1ec5 d\u00e0ng qu\u1ea3n l\u00fd v\u00e0 nh\u00e2n b\u1ea3n l\u00e0m cho Spring Boot tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn ho\u00e0n h\u1ea3o \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c microservices.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-tinh-nang-s\u1eb5n-sang-cho-production-production-ready-features\"><strong>T\u00ednh n\u0103ng s\u1eb5n s\u00e0ng cho Production (Production-Ready Features)<\/strong><\/h3>\n\n\n\n<p>M\u1ed9t l\u1ee3i \u00edch \u01b0u vi\u1ec7t c\u1ee7a Spring Boot ch\u00ednh l\u00e0 n\u00f3 trang b\u1ecb s\u1eb5n cho b\u1ea1n nh\u1eefng t\u00ednh n\u0103ng m\u1ea1nh m\u1ebd \u0111\u1ec3 v\u1eadn h\u00e0nh v\u00e0 gi\u00e1m s\u00e1t \u1ee9ng d\u1ee5ng m\u1ed9t c\u00e1ch chuy\u00ean nghi\u1ec7p (Production-Ready Features), gi\u00fap b\u1ea1n t\u1ef1 tin tri\u1ec3n khai s\u1ea3n ph\u1ea9m.<\/p>\n\n\n\n<p>Thay v\u00ec ph\u1ea3i t\u1ef1 x\u00e2y d\u1ef1ng c\u00e1c c\u01a1 ch\u1ebf ph\u1ee9c t\u1ea1p, Spring Boot cung c\u1ea5p<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-kh\u1ea3-nang-giam-sat-va-qu\u1ea3n-ly-toan-di\u1ec7n-v\u1edbi-spring-boot-actuator\"><strong>Kh\u1ea3 n\u0103ng gi\u00e1m s\u00e1t v\u00e0 qu\u1ea3n l\u00fd to\u00e0n di\u1ec7n v\u1edbi Spring Boot Actuator<\/strong><\/h4>\n\n\n\n<p>\u0110\u00e2y l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 v\u00f4 gi\u00e1, m\u1edf ra h\u00e0ng lo\u1ea1t &#8220;c\u1eeda s\u1ed5&#8221; (endpoint HTTP) \u0111\u1ec3 b\u1ea1n theo d\u00f5i s\u00e1t sao &#8220;s\u1ee9c kh\u1ecfe&#8221; v\u00e0 ho\u1ea1t \u0111\u1ed9ng c\u1ee7a \u1ee9ng d\u1ee5ng. B\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng ki\u1ec3m tra t\u00ecnh tr\u1ea1ng (<code>\/health<\/code>), xem c\u00e1c ch\u1ec9 s\u1ed1 v\u1eadn h\u00e0nh quan tr\u1ecdng nh\u01b0 b\u1ed9 nh\u1edb, CPU, s\u1ed1 l\u01b0\u1ee3ng request (<code>\/metrics<\/code>), truy c\u1eadp th\u00f4ng tin t\u00f9y ch\u1ec9nh (<code>\/info<\/code>), hay ki\u1ec3m tra c\u00e1c bi\u1ebfn m\u00f4i tr\u01b0\u1eddng v\u00e0 c\u1ea5u h\u00ecnh \u0111ang \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng (<code>\/env<\/code>).<\/p>\n\n\n\n<p>\u0110i\u1ec1u n\u00e0y gi\u00fap vi\u1ec7c ch\u1ea9n \u0111o\u00e1n s\u1ef1 c\u1ed1 v\u00e0 t\u1ed1i \u01b0u hi\u1ec7u n\u0103ng tr\u1edf n\u00ean tr\u1ef1c quan v\u00e0 hi\u1ec7u qu\u1ea3 h\u01a1n r\u1ea5t nhi\u1ec1u.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-linh-ho\u1ea1t-t\u1ed1i-da-trong-qu\u1ea3n-ly-c\u1ea5u-hinh-v\u1edbi-externalized-configuration\"><strong>Linh ho\u1ea1t t\u1ed1i \u0111a trong qu\u1ea3n l\u00fd c\u1ea5u h\u00ecnh v\u1edbi Externalized Configuration<\/strong><\/h4>\n\n\n\n<p>Spring Boot cho ph\u00e9p b\u1ea1n t\u00e1ch bi\u1ec7t ho\u00e0n to\u00e0n c\u1ea5u h\u00ecnh ra kh\u1ecfi m\u00e3 ngu\u1ed3n. B\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng thay \u0111\u1ed5i c\u00e0i \u0111\u1eb7t \u1ee9ng d\u1ee5ng (v\u00ed d\u1ee5: th\u00f4ng tin k\u1ebft n\u1ed1i database, c\u1ed5ng server) th\u00f4ng qua c\u00e1c file <code>application.properties<\/code> ho\u1eb7c <code>application.yml<\/code>, s\u1eed d\u1ee5ng bi\u1ebfn m\u00f4i tr\u01b0\u1eddng c\u1ee7a h\u1ec7 th\u1ed1ng, ho\u1eb7c th\u1eadm ch\u00ed truy\u1ec1n tham s\u1ed1 tr\u1ef1c ti\u1ebfp khi kh\u1edfi ch\u1ea1y \u1ee9ng d\u1ee5ng. \u0110i\u1ec1u n\u00e0y gi\u00fap vi\u1ec7c \u0111i\u1ec1u ch\u1ec9nh \u1ee9ng d\u1ee5ng cho c\u00e1c m\u00f4i tr\u01b0\u1eddng kh\u00e1c nhau m\u00e0 kh\u00f4ng c\u1ea7n bi\u00ean d\u1ecbch l\u1ea1i code tr\u1edf n\u00ean \u0111\u01a1n gi\u1ea3n.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-qu\u1ea3n-ly-moi-tr\u01b0\u1eddng-chuyen-nghi\u1ec7p-v\u1edbi-profiles-h\u1ed3-s\u01a1-c\u1ea5u-hinh\"><strong>Qu\u1ea3n l\u00fd m\u00f4i tr\u01b0\u1eddng chuy\u00ean nghi\u1ec7p v\u1edbi Profiles (H\u1ed3 s\u01a1 c\u1ea5u h\u00ecnh)<\/strong><\/h4>\n\n\n\n<p>D\u1ec5 d\u00e0ng \u0111\u1ecbnh ngh\u0129a v\u00e0 k\u00edch ho\u1ea1t c\u00e1c b\u1ed9 c\u1ea5u h\u00ecnh ri\u00eang bi\u1ec7t cho t\u1eebng m\u00f4i tr\u01b0\u1eddng c\u1ee5 th\u1ec3 nh\u01b0 ph\u00e1t tri\u1ec3n (dev), ki\u1ec3m th\u1eed (test), hay s\u1ea3n ph\u1ea9m (prod). \u0110i\u1ec1u n\u00e0y \u0111\u1ea3m b\u1ea3o \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n lu\u00f4n ch\u1ea1y v\u1edbi nh\u1eefng thi\u1ebft l\u1eadp ph\u00f9 h\u1ee3p nh\u1ea5t cho t\u1eebng giai \u0111o\u1ea1n, gi\u1ea3m thi\u1ec3u r\u1ee7i ro v\u00e0 t\u0103ng t\u00ednh \u1ed5n \u0111\u1ecbnh.<\/p>\n\n\n\n<p>Vi\u1ec7c t\u00edch h\u1ee3p s\u1eb5n nh\u1eefng c\u00f4ng c\u1ee5 n\u00e0y kh\u00f4ng ch\u1ec9 ti\u1ebft ki\u1ec7m th\u1eddi gian ph\u00e1t tri\u1ec3n m\u00e0 c\u00f2n \u0111\u1ea3m b\u1ea3o \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n c\u00f3 kh\u1ea3 n\u0103ng ch\u1ed1ng ch\u1ecbu t\u1ed1t h\u01a1n, d\u1ec5 d\u00e0ng qu\u1ea3n l\u00fd v\u00e0 b\u1ea3o tr\u00ec h\u01a1n khi \u0111\u01b0a v\u00e0o v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf. \u0110\u00e2y ch\u00ednh l\u00e0 s\u1ef1 kh\u00e1c bi\u1ec7t m\u00e0 Spring Boot mang l\u1ea1i, gi\u00fap b\u1ea1n t\u1eadp trung v\u00e0o logic nghi\u1ec7p v\u1ee5 thay v\u00ec loay hoay v\u1edbi c\u00e1c v\u1ea5n \u0111\u1ec1 h\u1ea1 t\u1ea7ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-h\u01b0\u1edfng-l\u1ee3i-t\u1eeb-h\u1ec7-sinh-thai-spring-r\u1ed9ng-l\u1edbn-nbsp\"><strong>H\u01b0\u1edfng l\u1ee3i t\u1eeb h\u1ec7 sinh th\u00e1i Spring r\u1ed9ng l\u1edbn&nbsp;<\/strong><\/h3>\n\n\n\n<p>L\u00fd do cu\u1ed1i c\u00f9ng, nh\u01b0ng kh\u00f4ng k\u00e9m ph\u1ea7n quan tr\u1ecdng, \u0111\u1ec3 ch\u1ecdn Spring Boot ch\u00ednh l\u00e0 vi\u1ec7c b\u1ea1n \u0111\u01b0\u1ee3c <strong>h\u01b0\u1edfng l\u1ee3i t\u1eeb to\u00e0n b\u1ed9 s\u1ee9c m\u1ea1nh v\u00e0 s\u1ef1 tr\u01b0\u1edfng th\u00e0nh c\u1ee7a h\u1ec7 sinh th\u00e1i Spring r\u1ed9ng l\u1edbn<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u00edch h\u1ee3p li\u1ec1n m\u1ea1ch:<\/strong> N\u00f3 ho\u1ea1t \u0111\u1ed9ng ho\u00e0n h\u1ea3o v\u00e0 t\u00edch h\u1ee3p d\u1ec5 d\u00e0ng v\u1edbi c\u00e1c d\u1ef1 \u00e1n Spring ph\u1ed5 bi\u1ebfn kh\u00e1c nh\u01b0 Spring Data (truy c\u1eadp d\u1eef li\u1ec7u), Spring Security (b\u1ea3o m\u1eadt), Spring Cloud (ph\u00e1t tri\u1ec3n microservices), Spring Batch (x\u1eed l\u00fd t\u00e1c v\u1ee5 h\u00e0ng lo\u1ea1t), v\u00e0 nhi\u1ec1u h\u01a1n n\u1eefa.<\/li>\n\n\n\n<li><strong>C\u1ed9ng \u0111\u1ed3ng l\u1edbn m\u1ea1nh v\u00e0 t\u00e0i li\u1ec7u phong ph\u00fa:<\/strong> V\u1edbi l\u1ecbch s\u1eed ph\u00e1t tri\u1ec3n l\u00e2u d\u00e0i, Spring s\u1edf h\u1eefu m\u1ed9t c\u1ed9ng \u0111\u1ed3ng ng\u01b0\u1eddi d\u00f9ng v\u00e0 nh\u00e0 ph\u00e1t tri\u1ec3n kh\u1ed5ng l\u1ed3 tr\u00ean to\u00e0n th\u1ebf gi\u1edbi. Do \u0111\u00f3 b\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng t\u00ecm th\u1ea5y t\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn, v\u00ed d\u1ee5 th\u1ef1c t\u1ebf \u0111\u1ec3 h\u1ecdc h\u1ecfi v\u00e0 t\u00ecm s\u1ef1 h\u1ed7 tr\u1ee3 khi g\u1eb7p v\u1ea5n \u0111\u1ec1.<\/li>\n<\/ul>\n\n\n\n<p>T\u00f3m l\u1ea1i, vi\u1ec7c ch\u1ecdn Spring Boot \u0111\u1ed3ng ngh\u0129a v\u1edbi vi\u1ec7c b\u1ea1n ch\u1ecdn m\u1ed9t l\u1ed9 tr\u00ecnh ph\u00e1t tri\u1ec3n Java nhanh h\u01a1n, hi\u1ec7u qu\u1ea3 h\u01a1n, \u00edt c\u1ea5u h\u00ecnh h\u01a1n v\u00e0 \u0111\u01b0\u1ee3c trang b\u1ecb \u0111\u1ea7y \u0111\u1ee7 c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u0169ng nh\u01b0 v\u1eadn h\u00e0nh c\u00e1c \u1ee9ng d\u1ee5ng hi\u1ec7n \u0111\u1ea1i, t\u1eeb nh\u1eefng d\u1ef1 \u00e1n nh\u1ecf cho \u0111\u1ebfn c\u00e1c h\u1ec7 th\u1ed1ng microservices ph\u1ee9c t\u1ea1p.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc th\u00eam: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-framework\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Framework v\u00e0 h\u1ec7 sinh th\u00e1i v\u1eefng ch\u1eafc cho \u1ee9ng d\u1ee5ng Java<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-khai-ni\u1ec7m-c\u1ed1t-loi-c\u1ee7a-spring-boot\"><span class=\"ez-toc-section\" id=\"Cac_khai_niem_cot_loi_cua_Spring_Boot\"><\/span><strong>C\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u0110\u1ec3 khai th\u00e1c t\u1ed1i \u0111a s\u1ee9c m\u1ea1nh v\u00e0 s\u1ef1 linh ho\u1ea1t c\u1ee7a Spring Boot, vi\u1ec7c n\u1eafm v\u1eefng c\u00e1c kh\u00e1i ni\u1ec7m n\u1ec1n t\u1ea3ng l\u00e0 v\u00f4 c\u00f9ng quan tr\u1ecdng. Nh\u1eefng kh\u00e1i ni\u1ec7m n\u00e0y l\u00e0 ch\u00eca kh\u00f3a gi\u00fap b\u1ea1n hi\u1ec3u c\u00e1ch Spring Boot \u0111\u01a1n gi\u1ea3n h\u00f3a v\u00e0 t\u0103ng t\u1ed1c qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng Java.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Kh\u00e1i ni\u1ec7m<\/strong><\/td><td><strong>\u0110\u1ecbnh ngh\u0129a&nbsp;<\/strong><\/td><td><strong>C\u00e1ch th\u1ee9c ho\u1ea1t \u0111\u1ed9ng<\/strong><\/td><\/tr><tr><td><strong>@SpringBootApplication<\/strong><\/td><td>Annotation &#8220;c\u1eeda ng\u00f5&#8221; \u1edf l\u1edbp ch\u00ednh c\u1ee7a \u1ee9ng d\u1ee5ng Spring Boot, k\u1ebft h\u1ee3p c\u1ee7a <code>@Configuration<\/code>, <code>@EnableAutoConfiguration<\/code>, v\u00e0 <code>@ComponentScan<\/code>.<\/td><td>K\u1ebft h\u1ee3p \u0111\u00e1nh d\u1ea5u l\u1edbp l\u00e0 ngu\u1ed3n c\u1ea5u h\u00ecnh bean (<code>@Configuration<\/code>), k\u00edch ho\u1ea1t t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh (<code>@EnableAutoConfiguration<\/code>), v\u00e0 qu\u00e9t c\u00e1c component trong package (<code>@ComponentScan<\/code>).<\/td><\/tr><tr><td><strong>Auto-configuration (T\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh)<\/strong><\/td><td>Spring Boot t\u1ef1 \u0111\u1ed9ng thi\u1ebft l\u1eadp \u1ee9ng d\u1ee5ng d\u1ef1a tr\u00ean c\u00e1c th\u01b0 vi\u1ec7n (dependencies) b\u1ea1n th\u00eam v\u00e0o.<\/td><td>Spring Boot qu\u00e9t v\u00e0 t\u1ef1 t\u1ea1o c\u00e1c th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft. V\u00ed d\u1ee5: c\u00f3 th\u01b0 vi\u1ec7n database th\u00ec t\u1ef1 k\u1ebft n\u1ed1i.<\/td><\/tr><tr><td><strong>Starters (C\u00e1c &#8220;g\u00f3i kh\u1edfi \u0111\u1ed9ng&#8221;)<\/strong><\/td><td>L\u00e0 c\u00e1c b\u1ed9 dependency \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i s\u1eb5n cho t\u1eebng ch\u1ee9c n\u0103ng c\u1ee5 th\u1ec3 (web, data, security&#8230;).<\/td><td>Th\u00eam m\u1ed9t starter l\u00e0 t\u1ef1 \u0111\u1ed9ng c\u00f3 \u0111\u1ee7 c\u00e1c th\u01b0 vi\u1ec7n li\u00ean quan, t\u01b0\u01a1ng th\u00edch v\u1edbi nhau.<\/td><\/tr><tr><td><strong>Spring Boot Actuator (B\u1ed9 ti\u1ec7n \u00edch qu\u1ea3n l\u00fd &amp; gi\u00e1m s\u00e1t)<\/strong><\/td><td>Cung c\u1ea5p c\u00e1c c\u00f4ng c\u1ee5 s\u1eb5n c\u00f3 \u0111\u1ec3 theo d\u00f5i v\u00e0 qu\u1ea3n l\u00fd \u1ee9ng d\u1ee5ng khi \u0111ang ch\u1ea1y.<\/td><td>Th\u00eam Actuator s\u1ebd c\u00f3 c\u00e1c \u0111\u01b0\u1eddng d\u1eabn (endpoint) \u0111\u1ec3 xem s\u1ee9c kh\u1ecfe, th\u00f4ng s\u1ed1, m\u00f4i tr\u01b0\u1eddng c\u1ee7a \u1ee9ng d\u1ee5ng.<\/td><\/tr><tr><td><strong>Externalized Configuration (C\u1ea5u h\u00ecnh b\u00ean ngo\u00e0i)<\/strong><\/td><td>Cho ph\u00e9p t\u00e1ch bi\u1ec7t c\u1ea5u h\u00ecnh ra kh\u1ecfi code \u1ee9ng d\u1ee5ng, gi\u00fap \u1ee9ng d\u1ee5ng ch\u1ea1y tr\u00ean nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng kh\u00e1c nhau m\u00e0 kh\u00f4ng c\u1ea7n s\u1eeda \u0111\u1ed5i code.<\/td><td>N\u1ea1p c\u1ea5u h\u00ecnh t\u1eeb nhi\u1ec1u ngu\u1ed3n theo <strong>th\u1ee9 t\u1ef1 \u01b0u ti\u00ean<\/strong> (v\u00ed d\u1ee5: command-line, bi\u1ebfn m\u00f4i tr\u01b0\u1eddng, file <code>.properties<\/code> b\u00ean ngo\u00e0i\/trong JAR). Ph\u1ed5 bi\u1ebfn nh\u1ea5t l\u00e0 file <code>application.properties<\/code> ho\u1eb7c <code>.yml<\/code>. <strong>Profiles<\/strong> cho ph\u00e9p c\u1ea5u h\u00ecnh ri\u00eang theo m\u00f4i tr\u01b0\u1eddng (<code>application-{profile}.properties<\/code>).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-springbootapplication\"><strong>@SpringBootApplication<\/strong><\/h3>\n\n\n\n<p>\u0110\u00e2y l\u00e0 m\u1ed9t annotation &#8220;c\u1eeda ng\u00f5&#8221; m\u00e0 b\u1ea1n s\u1ebd th\u1ea5y \u1edf l\u1edbp ch\u00ednh (main class) c\u1ee7a h\u1ea7u h\u1ebft m\u1ecdi \u1ee9ng d\u1ee5ng Spring Boot. N\u00f3 kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t ph\u00e9p m\u00e0u \u0111\u01a1n l\u1ebb m\u00e0 l\u00e0 s\u1ef1 k\u1ebft h\u1ee3p c\u1ee7a ba annotation quan tr\u1ecdng kh\u00e1c:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>@Configuration<\/code><\/strong>: \u0110\u00e1nh d\u1ea5u l\u1edbp n\u00e0y l\u00e0 m\u1ed9t ngu\u1ed3n \u0111\u1ecbnh ngh\u0129a c\u00e1c bean (\u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd b\u1edfi Spring IoC container). C\u00e1c ph\u01b0\u01a1ng th\u1ee9c \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u <code>@Bean<\/code> trong l\u1edbp n\u00e0y s\u1ebd t\u1ea1o ra c\u00e1c bean m\u00e0 Spring s\u1ebd qu\u1ea3n l\u00fd.<\/li>\n\n\n\n<li><strong><code>@EnableAutoConfiguration<\/code><\/strong>: K\u00edch ho\u1ea1t c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh &#8220;th\u1ea7n k\u1ef3&#8221; c\u1ee7a Spring Boot. Spring Boot s\u1ebd d\u1ef1a v\u00e0o c\u00e1c th\u01b0 vi\u1ec7n (JAR files) c\u00f3 trong <code>classpath<\/code> \u0111\u1ec3 \u0111o\u00e1n v\u00e0 t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh nh\u1eefng g\u00ec c\u1ea7n thi\u1ebft cho \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n.<\/li>\n\n\n\n<li><strong><code>@ComponentScan<\/code><\/strong>: Y\u00eau c\u1ea7u Spring qu\u00e9t c\u00e1c component (v\u00ed d\u1ee5: <code>@Controller<\/code>, <code>@Service<\/code>, <code>@Repository<\/code>, <code>@Component<\/code>) trong package hi\u1ec7n t\u1ea1i c\u1ee7a l\u1edbp ch\u1ee9a annotation n\u00e0y v\u00e0 c\u00e1c package con c\u1ee7a n\u00f3. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p Spring t\u1ef1 \u0111\u1ed9ng ph\u00e1t hi\u1ec7n v\u00e0 \u0111\u0103ng k\u00fd c\u00e1c bean m\u00e0 b\u1ea1n \u0111\u00e3 \u0111\u1ecbnh ngh\u0129a.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-auto-configuration-t\u1ef1-d\u1ed9ng-c\u1ea5u-hinh-nbsp\"><strong>Auto-Configuration (T\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh)&nbsp;<\/strong><\/h3>\n\n\n\n<p>C\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh l\u00e0 m\u1ed9t trong nh\u1eefng l\u00fd do ch\u00ednh khi\u1ebfn Spring Boot tr\u1edf n\u00ean m\u1ea1nh m\u1ebd v\u00e0 d\u1ec5 s\u1eed d\u1ee5ng. C\u00e1ch ho\u1ea1t \u0111\u1ed9ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00f3m t\u1eaft nh\u01b0 sau:<\/p>\n\n\n\n<p><strong>Qu\u00e9t <code>classpath<\/code><\/strong>: Khi \u1ee9ng d\u1ee5ng kh\u1edfi \u0111\u1ed9ng, Spring Boot s\u1ebd ki\u1ec3m tra c\u00e1c th\u01b0 vi\u1ec7n (JAR files) m\u00e0 b\u1ea1n \u0111\u00e3 th\u00eam v\u00e0o d\u1ef1 \u00e1n (th\u00f4ng qua Maven ho\u1eb7c Gradle).<\/p>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng c\u1ea5u h\u00ecnh c\u00f3 \u0111i\u1ec1u ki\u1ec7n<\/strong>: D\u1ef1a tr\u00ean s\u1ef1 hi\u1ec7n di\u1ec7n (ho\u1eb7c v\u1eafng m\u1eb7t) c\u1ee7a c\u00e1c l\u1edbp ho\u1eb7c bean nh\u1ea5t \u0111\u1ecbnh, Spring Boot s\u1ebd quy\u1ebft \u0111\u1ecbnh c\u00f3 n\u00ean \u00e1p d\u1ee5ng m\u1ed9t c\u1ea5u h\u00ecnh c\u1ee5 th\u1ec3 hay kh\u00f4ng. Vi\u1ec7c n\u00e0y \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n th\u00f4ng qua c\u00e1c annotation \u0111i\u1ec1u ki\u1ec7n nh\u01b0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@ConditionalOnClass<\/code>: Ch\u1ec9 \u00e1p d\u1ee5ng c\u1ea5u h\u00ecnh n\u1ebfu m\u1ed9t l\u1edbp c\u1ee5 th\u1ec3 c\u00f3 m\u1eb7t trong <code>classpath<\/code>. V\u00ed d\u1ee5, n\u1ebfu <code>DataSource.class<\/code> c\u00f3 m\u1eb7t, Spring Boot s\u1ebd c\u1ed1 g\u1eafng c\u1ea5u h\u00ecnh m\u1ed9t DataSource.<\/li>\n\n\n\n<li><code>@ConditionalOnMissingBean<\/code>: Ch\u1ec9 t\u1ea1o m\u1ed9t bean n\u1ebfu ch\u01b0a c\u00f3 bean n\u00e0o c\u00f9ng ki\u1ec3u \u0111\u01b0\u1ee3c ng\u01b0\u1eddi d\u00f9ng \u0111\u1ecbnh ngh\u0129a. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p b\u1ea1n ghi \u0111\u00e8 c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh c\u1ee7a Spring Boot m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng.<\/li>\n\n\n\n<li>V\u00e0 nhi\u1ec1u annotation <code>@Conditional<\/code>&#8230; kh\u00e1c (<code>@ConditionalOnBean<\/code>, <code>@ConditionalOnProperty<\/code>, v.v.) gi\u00fap Spring Boot \u0111\u01b0a ra c\u00e1c quy\u1ebft \u0111\u1ecbnh c\u1ea5u h\u00ecnh th\u00f4ng minh.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>T\u00f3m l\u1ea1i, Spring Boot c\u1ed1 g\u1eafng &#8220;\u0111o\u00e1n&#8221; v\u00e0 thi\u1ebft l\u1eadp nh\u1eefng c\u1ea5u h\u00ecnh ph\u1ed5 bi\u1ebfn nh\u1ea5t gi\u00fap b\u1ea1n, nh\u01b0ng v\u1eabn cho ph\u00e9p b\u1ea1n t\u00f9y ch\u1ec9nh ho\u1eb7c thay th\u1ebf khi c\u1ea7n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-starters-cac-goi-ph\u1ee5-thu\u1ed9c-kh\u1edfi-d\u1ea7u\"><strong>Starters (C\u00e1c g\u00f3i ph\u1ee5 thu\u1ed9c kh\u1edfi \u0111\u1ea7u)<\/strong><\/h3>\n\n\n\n<p>Starters l\u00e0 m\u1ed9t trong nh\u1eefng \u00fd t\u01b0\u1edfng tuy\u1ec7t v\u1eddi nh\u1ea5t c\u1ee7a Spring Boot, gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c qu\u1ea3n l\u00fd <code>dependency<\/code> (c\u00e1c th\u01b0 vi\u1ec7n ph\u1ee5 thu\u1ed9c) m\u1ed9t c\u00e1ch \u0111\u00e1ng k\u1ec3.<\/p>\n\n\n\n<p><strong>Vai tr\u00f2 ch\u00ednh<\/strong>: M\u1ed7i &#8220;starter&#8221; l\u00e0 m\u1ed9t b\u1ed9 m\u00f4 t\u1ea3 <code>dependency<\/code> ti\u1ec7n l\u1ee3i, bao g\u1ed3m m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c <code>dependency<\/code> kh\u00e1c nhau th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng c\u00f9ng nhau cho m\u1ed9t m\u1ee5c \u0111\u00edch c\u1ee5 th\u1ec3. Thay v\u00ec ph\u1ea3i khai b\u00e1o h\u00e0ng ch\u1ee5c <code>dependency<\/code> ri\u00eang l\u1ebb v\u00e0 lo l\u1eafng v\u1ec1 phi\u00ean b\u1ea3n t\u01b0\u01a1ng th\u00edch, b\u1ea1n ch\u1ec9 c\u1ea7n khai b\u00e1o m\u1ed9t starter.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 c\u00e1c starters ph\u1ed5 bi\u1ebfn<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>spring-boot-starter-web<\/code><\/strong>: D\u00e0nh cho vi\u1ec7c x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web, bao g\u1ed3m RESTful APIs, s\u1eed d\u1ee5ng Spring MVC. N\u00f3 t\u1ef1 \u0111\u1ed9ng mang theo Tomcat (m\u00e1y ch\u1ee7 nh\u00fang m\u1eb7c \u0111\u1ecbnh) v\u00e0 c\u00e1c th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft kh\u00e1c.<\/li>\n\n\n\n<li><strong><code>spring-boot-starter-data-jpa<\/code><\/strong>: \u0110\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u quan h\u1ec7 s\u1eed d\u1ee5ng JPA (Java Persistence API), th\u01b0\u1eddng \u0111i k\u00e8m v\u1edbi Hibernate.<\/li>\n\n\n\n<li><strong><code>spring-boot-starter-security<\/code><\/strong>: T\u00edch h\u1ee3p Spring Security \u0111\u1ec3 b\u1ea3o v\u1ec7 \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n.<\/li>\n\n\n\n<li><strong><code>spring-boot-starter-test<\/code><\/strong>: Cung c\u1ea5p c\u00e1c th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft cho vi\u1ec7c vi\u1ebft unit test v\u00e0 integration test (nh\u01b0 JUnit, Mockito, Spring Test).<\/li>\n\n\n\n<li><strong><code>spring-boot-starter-actuator<\/code><\/strong>: Th\u00eam c\u00e1c t\u00ednh n\u0103ng gi\u00e1m s\u00e1t v\u00e0 qu\u1ea3n l\u00fd \u1ee9ng d\u1ee5ng. Vi\u1ec7c s\u1eed d\u1ee5ng starters gi\u00fap file c\u1ea5u h\u00ecnh build (v\u00ed d\u1ee5 <code>pom.xml<\/code> c\u1ee7a Maven) c\u1ee7a b\u1ea1n g\u1ecdn g\u00e0ng h\u01a1n v\u00e0 gi\u1ea3m thi\u1ec3u nguy c\u01a1 xung \u0111\u1ed9t phi\u00ean b\u1ea3n gi\u1eefa c\u00e1c th\u01b0 vi\u1ec7n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-boot-actuator-b\u1ed9-ti\u1ec7n-ich-qu\u1ea3n-ly-amp-giam-sat\"><strong>Spring Boot Actuator (B\u1ed9 ti\u1ec7n \u00edch qu\u1ea3n l\u00fd &amp; gi\u00e1m s\u00e1t)<\/strong><\/h3>\n\n\n\n<p>Khi \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n \u0111\u00e3 \u0111\u01b0\u1ee3c tri\u1ec3n khai v\u00e0 ch\u1ea1y tr\u00ean m\u00f4i tr\u01b0\u1eddng production, vi\u1ec7c gi\u00e1m s\u00e1t v\u00e0 qu\u1ea3n l\u00fd n\u00f3 l\u00e0 v\u00f4 c\u00f9ng c\u1ea7n thi\u1ebft. Spring Boot Actuator cung c\u1ea5p c\u00e1c t\u00ednh n\u0103ng n\u00e0y &#8220;out-of-the-box&#8221;:<\/p>\n\n\n\n<p><strong>C\u00e1c endpoint h\u1eefu \u00edch<\/strong>: Actuator expos\u00e9 (c\u00f4ng khai) m\u1ed9t lo\u1ea1t c\u00e1c endpoint HTTP (ho\u1eb7c JMX) \u0111\u1ec3 b\u1ea1n c\u00f3 th\u1ec3 ki\u1ec3m tra t\u00ecnh tr\u1ea1ng v\u00e0 t\u01b0\u01a1ng t\u00e1c v\u1edbi \u1ee9ng d\u1ee5ng. M\u1ed9t s\u1ed1 endpoint quan tr\u1ecdng bao g\u1ed3m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/actuator\/health<\/code>: Cung c\u1ea5p th\u00f4ng tin v\u1ec1 &#8220;s\u1ee9c kh\u1ecfe&#8221; c\u1ee7a \u1ee9ng d\u1ee5ng (v\u00ed d\u1ee5: tr\u1ea1ng th\u00e1i k\u1ebft n\u1ed1i c\u01a1 s\u1edf d\u1eef li\u1ec7u, dung l\u01b0\u1ee3ng \u1ed5 \u0111\u0129a).<\/li>\n\n\n\n<li><code>\/actuator\/info<\/code>: Hi\u1ec3n th\u1ecb c\u00e1c th\u00f4ng tin t\u00f9y ch\u1ec9nh v\u1ec1 \u1ee9ng d\u1ee5ng m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh.<\/li>\n\n\n\n<li><code>\/actuator\/metrics<\/code>: Cung c\u1ea5p c\u00e1c ch\u1ec9 s\u1ed1 chi ti\u1ebft v\u1ec1 hi\u1ec7u su\u1ea5t \u1ee9ng d\u1ee5ng (v\u00ed d\u1ee5: b\u1ed9 nh\u1edb s\u1eed d\u1ee5ng, s\u1ed1 l\u01b0\u1ee3ng request, th\u1eddi gian ph\u1ea3n h\u1ed3i).<\/li>\n\n\n\n<li><code>\/actuator\/env<\/code>: Li\u1ec7t k\u00ea c\u00e1c thu\u1ed9c t\u00ednh c\u1ea5u h\u00ecnh t\u1eeb t\u1ea5t c\u1ea3 c\u00e1c ngu\u1ed3n m\u00f4i tr\u01b0\u1eddng.<\/li>\n\n\n\n<li><code>\/actuator\/loggers<\/code>: Cho ph\u00e9p xem v\u00e0 thay \u0111\u1ed5i m\u1ee9c \u0111\u1ed9 log c\u1ee7a \u1ee9ng d\u1ee5ng m\u1ed9t c\u00e1ch linh ho\u1ea1t khi \u1ee9ng d\u1ee5ng \u0111ang ch\u1ea1y.<\/li>\n<\/ul>\n\n\n\n<p><strong>C\u00e1ch b\u1eadt v\u00e0 c\u1ea5u h\u00ecnh Actuator<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0110\u1ec3 s\u1eed d\u1ee5ng, b\u1ea1n ch\u1ec9 c\u1ea7n th\u00eam <code>dependency<\/code> <code>spring-boot-starter-actuator<\/code> v\u00e0o file <code>pom.xml<\/code> (ho\u1eb7c <code>build.gradle<\/code>).<\/li>\n\n\n\n<li>M\u1eb7c \u0111\u1ecbnh, kh\u00f4ng ph\u1ea3i t\u1ea5t c\u1ea3 c\u00e1c endpoint \u0111\u1ec1u \u0111\u01b0\u1ee3c expos\u00e9 qua HTTP v\u00ec l\u00fd do b\u1ea3o m\u1eadt. B\u1ea1n c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh nh\u1eefng endpoint n\u00e0o \u0111\u01b0\u1ee3c expos\u00e9 v\u00e0 c\u00e1ch ch\u00fang \u0111\u01b0\u1ee3c b\u1ea3o v\u1ec7 th\u00f4ng qua file <code>application.properties<\/code> (ho\u1eb7c <code>application.yml<\/code>). V\u00ed d\u1ee5, \u0111\u1ec3 expos\u00e9 t\u1ea5t c\u1ea3 c\u00e1c endpoint (kh\u00f4ng khuy\u1ebfn kh\u00edch cho m\u00f4i tr\u01b0\u1eddng production n\u1ebfu kh\u00f4ng c\u00f3 b\u1ea3o m\u1eadt ch\u1eb7t ch\u1ebd):<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd3GzpwSucIGPzFVm-gl2JnkiWqZEMJU2ExktfZa1YMo7etL9z8Cq2B14wfpjl9CrmfHPzpKkJ0oJc1wZN98uICqbk07KJWDtD31JXmPEmq7bFN9bWYJEg3I4T1f2Et9CEPQuYeBg?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u0110\u1ec3 ch\u1ec9 expos\u00e9 <code>\/health<\/code> v\u00e0 <code>\/info<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXewBamQwZVREaxnReO5DqPiQ5YDw6hPmohDqtlPA2VT1zP8WUTfdkjc3KHRtU07bsKtc91pMtWf3vuAH9eAjZTnMxX3CYBel3PiRHipNSvz_X-8tmA96uyFSM625rnZcs0uFoBWyw?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-externalized-configuration-c\u1ea5u-hinh-ben-ngoai\"><strong>Externalized Configuration (C\u1ea5u h\u00ecnh b\u00ean ngo\u00e0i)<\/strong><\/h3>\n\n\n\n<p>Spring Boot cho ph\u00e9p b\u1ea1n t\u00e1ch bi\u1ec7t c\u1ea5u h\u00ecnh ra kh\u1ecfi code \u1ee9ng d\u1ee5ng, gi\u00fap \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y tr\u00ean nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng kh\u00e1c nhau m\u00e0 kh\u00f4ng c\u1ea7n s\u1eeda \u0111\u1ed5i code.<\/p>\n\n\n\n<p><strong>Th\u1ee9 t\u1ef1 \u01b0u ti\u00ean c\u1ee7a c\u00e1c ngu\u1ed3n c\u1ea5u h\u00ecnh<\/strong>: Spring Boot c\u00f3 m\u1ed9t h\u1ec7 th\u1ed1ng ph\u00e2n c\u1ea5p r\u00f5 r\u00e0ng khi n\u1ea1p c\u1ea5u h\u00ecnh t\u1eeb nhi\u1ec1u ngu\u1ed3n kh\u00e1c nhau. C\u00e1c ngu\u1ed3n c\u00f3 \u0111\u1ed9 \u01b0u ti\u00ean cao h\u01a1n s\u1ebd ghi \u0111\u00e8 l\u00ean c\u00e1c ngu\u1ed3n c\u00f3 \u0111\u1ed9 \u01b0u ti\u00ean th\u1ea5p h\u01a1n. Theo t\u00e0i li\u1ec7u c\u1ee7a Spring Boot (v\u00e0 Baeldung c\u0169ng \u0111\u1ec1 c\u1eadp), th\u1ee9 t\u1ef1 \u01b0u ti\u00ean (t\u1eeb cao xu\u1ed1ng th\u1ea5p, m\u1ed9t c\u00e1ch t\u1ed5ng qu\u00e1t) bao g\u1ed3m:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tham s\u1ed1 d\u00f2ng l\u1ec7nh (Command-line arguments).<\/li>\n\n\n\n<li>Thu\u1ed9c t\u00ednh h\u1ec7 th\u1ed1ng Java (Java System properties &#8211; <code>System.getProperties()<\/code>).<\/li>\n\n\n\n<li>Bi\u1ebfn m\u00f4i tr\u01b0\u1eddng h\u1ec7 \u0111i\u1ec1u h\u00e0nh (OS environment variables).<\/li>\n\n\n\n<li>Thu\u1ed9c t\u00ednh t\u1eeb <code>SPRING_APPLICATION_JSON<\/code> (JSON nh\u00fang trong bi\u1ebfn m\u00f4i tr\u01b0\u1eddng ho\u1eb7c thu\u1ed9c t\u00ednh h\u1ec7 th\u1ed1ng).<\/li>\n\n\n\n<li>C\u00e1c file <code>application-{profile}.properties<\/code> (ho\u1eb7c <code>.yml<\/code>) b\u00ean ngo\u00e0i JAR c\u1ee7a b\u1ea1n (cho profile c\u1ee5 th\u1ec3).<\/li>\n\n\n\n<li>C\u00e1c file <code>application.properties<\/code> (ho\u1eb7c <code>.yml<\/code>) b\u00ean ngo\u00e0i JAR c\u1ee7a b\u1ea1n (chung).<\/li>\n\n\n\n<li>C\u00e1c file <code>application-{profile}.properties<\/code> (ho\u1eb7c <code>.yml<\/code>) b\u00ean trong JAR c\u1ee7a b\u1ea1n (trong <code>classpath<\/code>, cho profile c\u1ee5 th\u1ec3).<\/li>\n\n\n\n<li>C\u00e1c file <code>application.properties<\/code> (ho\u1eb7c <code>.yml<\/code>) b\u00ean trong JAR c\u1ee7a b\u1ea1n (trong <code>classpath<\/code>, chung).<\/li>\n\n\n\n<li>Annotation <code>@PropertySource<\/code> tr\u00ean c\u00e1c l\u1edbp <code>@Configuration<\/code>.<\/li>\n\n\n\n<li>C\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh (th\u00f4ng qua <code>SpringApplication.setDefaultProperties<\/code>).<\/li>\n<\/ol>\n\n\n\n<p><strong>C\u00e1ch s\u1eed d\u1ee5ng <code>application.properties<\/code> \/ <code>application.yml<\/code><\/strong><\/p>\n\n\n\n<p>\u0110\u00e2y l\u00e0 c\u00e1ch ph\u1ed5 bi\u1ebfn nh\u1ea5t \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a c\u1ea5u h\u00ecnh. B\u1ea1n t\u1ea1o file <code>application.properties<\/code> (d\u1ea1ng key=value) ho\u1eb7c <code>application.yml<\/code> (d\u1ea1ng YAML) trong th\u01b0 m\u1ee5c <code>src\/main\/resources<\/code>. Spring Boot s\u1ebd t\u1ef1 \u0111\u1ed9ng n\u1ea1p c\u00e1c thu\u1ed9c t\u00ednh t\u1eeb file n\u00e0y.&nbsp;<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 trong <code>application.properties<\/code>:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8081\n\nspring.application.name=my-app<\/code><\/pre>\n\n\n\n<p><strong>S\u1eed d\u1ee5ng Profiles (<code>application-{profile}.properties<\/code>)<\/strong><\/p>\n\n\n\n<p>Profiles cho ph\u00e9p b\u1ea1n \u0111\u1ecbnh ngh\u0129a c\u00e1c b\u1ed9 c\u1ea5u h\u00ecnh kh\u00e1c nhau cho c\u00e1c m\u00f4i tr\u01b0\u1eddng kh\u00e1c nhau (v\u00ed d\u1ee5: <code>dev<\/code>, <code>test<\/code>, <code>prod<\/code>).&nbsp;<\/p>\n\n\n\n<p>B\u1ea1n t\u1ea1o c\u00e1c file c\u1ea5u h\u00ecnh t\u01b0\u01a1ng \u1ee9ng, v\u00ed d\u1ee5:\u00a0<code>application-dev.properties<\/code>, <code>application-prod.properties<\/code>.<\/p>\n\n\n\n<p>Sau \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 k\u00edch ho\u1ea1t m\u1ed9t ho\u1eb7c nhi\u1ec1u profile khi ch\u1ea1y \u1ee9ng d\u1ee5ng, v\u00ed d\u1ee5 b\u1eb1ng c\u00e1ch \u0111\u1eb7t thu\u1ed9c t\u00ednh <strong><code>spring.profiles.active=dev<\/code><\/strong> trong <strong><code>application.properties<\/code><\/strong> ho\u1eb7c th\u00f4ng qua bi\u1ebfn m\u00f4i tr\u01b0\u1eddng, tham s\u1ed1 d\u00f2ng l\u1ec7nh.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-h\u01b0\u1edbng-d\u1eabn-xay-d\u1ef1ng-\u1ee9ng-d\u1ee5ng-d\u1ea7u-tien-v\u1edbi-spring-boot\"><span class=\"ez-toc-section\" id=\"Huong_dan_xay_dung_ung_dung_dau_tien_voi_Spring_Boot\"><\/span><strong>H\u01b0\u1edbng d\u1eabn x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng \u0111\u1ea7u ti\u00ean v\u1edbi Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>L\u00fd thuy\u1ebft l\u00e0 v\u1eady, nh\u01b0ng c\u00e1ch t\u1ed1t nh\u1ea5t \u0111\u1ec3 hi\u1ec3u Spring Boot ch\u00ednh l\u00e0 b\u1eaft tay v\u00e0o x\u00e2y d\u1ef1ng m\u1ed9t \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf. Trong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd c\u00f9ng nhau t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng &#8220;Hello World&#8221; \u0111\u01a1n gi\u1ea3n v\u1edbi Spring Boot, s\u1eed d\u1ee5ng m\u1ed9t REST Controller.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-chu\u1ea9n-b\u1ecb-nbsp\"><strong>Chu\u1ea9n b\u1ecb&nbsp;<\/strong><\/h3>\n\n\n\n<p>Tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u, h\u00e3y \u0111\u1ea3m b\u1ea3o b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft sau tr\u00ean m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh:<\/p>\n\n\n\n<p><strong>1. Java Development Kit (JDK):<\/strong> Spring Boot 3.x y\u00eau c\u1ea7u JDK 17 tr\u1edf l\u00ean. B\u1ea1n c\u00f3 th\u1ec3 t\u1ea3i JDK t\u1eeb <a href=\"https:\/\/www.oracle.com\/vn\/java\/technologies\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Oracle<\/a> ho\u1eb7c c\u00e1c nh\u00e0 cung c\u1ea5p OpenJDK kh\u00e1c nh\u01b0 <a href=\"https:\/\/adoptopenjdk.net\/releases.html\" target=\"_blank\" rel=\"noreferrer noopener\">Adoptium<\/a>.<\/p>\n\n\n\n<p>Ki\u1ec3m tra phi\u00ean b\u1ea3n Java c\u1ee7a b\u1ea1n b\u1eb1ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java -version<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdobBX3dDGnLJxs5fgn4ikeqzAZPxRCIJLKnIUQX7-ztYjBFlDFbybOLfuhUgLF5-kmHJklwmojZNgLv5utr7QNfxYijslZeynB_eBRFWJv5EZPlhnQiU6ZKdeHy9RgA-5yfmV8AA?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>2. C\u00f4ng c\u1ee5 x\u00e2y d\u1ef1ng (Build Tool):<\/strong> B\u1ea1n c\u1ea7n m\u1ed9t trong hai c\u00f4ng c\u1ee5 qu\u1ea3n l\u00fd dependency v\u00e0 x\u00e2y d\u1ef1ng d\u1ef1 \u00e1n ph\u1ed5 bi\u1ebfn l\u00e0 Maven ho\u1eb7c Gradle. H\u1ea7u h\u1ebft c\u00e1c IDE \u0111\u00e3 t\u00edch h\u1ee3p s\u1eb5n ho\u1eb7c b\u1ea1n c\u00f3 th\u1ec3 c\u00e0i \u0111\u1eb7t ri\u00eang.<\/p>\n\n\n\n<p>Ki\u1ec3m tra phi\u00ean b\u1ea3n Maven:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mvn -version<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfrTUDLxu21WGAzFNXmL4ajMBdEz0Qs6tzs88dvcA7DxPpA7r4LRvnGoTloHsu-wPXrnUUcoQL9DrpvfB9Xpm7j9TbpsBLQQi7jpmj-tPneFvBa3k274oibLSS053rUs-8m0Ax7?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ki\u1ec3m tra phi\u00ean b\u1ea3n Gradle:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gradle -version<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXch7USMQOddBvxPQPJ7B6L93fSrw2dL7cg3V-BrDm4if41dXyV7Iv1djPhjkdUKc4GW_vUQJ9vHQDJC211LfmzoWityX78dOXDiD4y15eNHy8Euf1cSwYv7lFPyJW4mYheGbBm9vA?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>3. IDE (Integrated Development Environment):<\/strong> M\u1ed9t IDE t\u1ed1t s\u1ebd gi\u00fap qu\u00e1 tr\u00ecnh code v\u00e0 qu\u1ea3n l\u00fd d\u1ef1 \u00e1n d\u1ec5 d\u00e0ng h\u01a1n. C\u00e1c l\u1ef1a ch\u1ecdn ph\u1ed5 bi\u1ebfn bao g\u1ed3m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\/\/?section=mac\" target=\"_blank\" rel=\"noreferrer noopener\">IntelliJ IDEA<\/a> (Community ho\u1eb7c Ultimate Edition)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.eclipse.org\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Eclipse<\/a> (v\u1edbi Spring Tools Suite &#8211; STS plugin)<\/li>\n\n\n\n<li><a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Visual Studio Code<\/a> (v\u1edbi c\u00e1c extension h\u1ed7 tr\u1ee3 Java v\u00e0 Spring Boot)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-s\u1eed-d\u1ee5ng-spring-initializr-start-spring-io\"><strong>S\u1eed d\u1ee5ng Spring Initializr (<\/strong><a href=\"http:\/\/start.spring.io\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>start.spring.io<\/strong><\/a><strong>)<\/strong><\/h3>\n\n\n\n<p>C\u00e1ch nhanh nh\u1ea5t v\u00e0 d\u1ec5 d\u00e0ng nh\u1ea5t \u0111\u1ec3 t\u1ea1o c\u1ea5u tr\u00fac d\u1ef1 \u00e1n Spring Boot l\u00e0 s\u1eed d\u1ee5ng <strong><a href=\"https:\/\/itviec.com\/blog\/spring-initializr-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Initializr<\/a><\/strong>. \u0110\u00e2y l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 web do \u0111\u1ed9i ng\u0169 Spring cung c\u1ea5p v\u00e0 c\u0169ng \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p s\u1eb5n trong h\u1ea7u h\u1ebft c\u00e1c IDE hi\u1ec7n \u0111\u1ea1i.<\/p>\n\n\n\n<p><strong>1. Truy c\u1eadp:<\/strong> M\u1edf tr\u00ecnh duy\u1ec7t v\u00e0 truy c\u1eadp <a href=\"https:\/\/start.spring.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/start.spring.io\/<\/a><\/p>\n\n\n\n<p><strong>2. C\u1ea5u h\u00ecnh d\u1ef1 \u00e1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Project:<\/strong> Ch\u1ecdn Maven Project (ho\u1eb7c Gradle Project n\u1ebfu b\u1ea1n quen thu\u1ed9c h\u01a1n). Ch\u00fang ta s\u1ebd d\u00f9ng Maven trong v\u00ed d\u1ee5 n\u00e0y.<\/li>\n\n\n\n<li><strong>Language:<\/strong> Ch\u1ecdn Java.<\/li>\n\n\n\n<li><strong>Spring Boot:<\/strong> Ch\u1ecdn phi\u00ean b\u1ea3n \u1ed5n \u0111\u1ecbnh m\u1edbi nh\u1ea5t (tr\u00e1nh c\u00e1c phi\u00ean b\u1ea3n SNAPSHOT ho\u1eb7c M n\u1ebfu b\u1ea1n mu\u1ed1n s\u1ef1 \u1ed5n \u0111\u1ecbnh). V\u00ed d\u1ee5: 3.3.0 (t\u1ea1i th\u1eddi \u0111i\u1ec3m vi\u1ebft b\u00e0i).<\/li>\n\n\n\n<li><strong>Project Metadata:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Group:<\/strong> Th\u01b0\u1eddng l\u00e0 t\u00ean mi\u1ec1n \u0111\u1ea3o ng\u01b0\u1ee3c c\u1ee7a t\u1ed5 ch\u1ee9c\/c\u00e1 nh\u00e2n b\u1ea1n (v\u00ed d\u1ee5: com.example).<\/li>\n\n\n\n<li><strong>Artifact:<\/strong> T\u00ean d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n (v\u00ed d\u1ee5: <code>my-first-app<\/code> ho\u1eb7c <code>hello-springboot<\/code>).<\/li>\n\n\n\n<li><strong>Name:<\/strong> T\u00ean d\u1ef1 \u00e1n (th\u01b0\u1eddng gi\u1ed1ng Artifact).<\/li>\n\n\n\n<li><strong>Description:<\/strong> M\u00f4 t\u1ea3 ng\u1eafn v\u1ec1 d\u1ef1 \u00e1n (v\u00ed d\u1ee5: Demo project for Spring Boot).<\/li>\n\n\n\n<li><strong>Package name:<\/strong> T\u00ean package g\u1ed1c cho code Java c\u1ee7a b\u1ea1n (v\u00ed d\u1ee5: com.example.demo).<\/li>\n\n\n\n<li><strong>Packaging:<\/strong> Ch\u1ecdn Jar (\u0111\u1ec3 ch\u1ea1y \u1ee9ng d\u1ee5ng nh\u01b0 m\u1ed9t file JAR \u0111\u1ed9c l\u1eadp v\u1edbi m\u00e1y ch\u1ee7 nh\u00fang).<\/li>\n\n\n\n<li><strong>Java:<\/strong> Ch\u1ecdn phi\u00ean b\u1ea3n Java b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t (v\u00ed d\u1ee5: 17).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Dependencies:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Nh\u1ea5p v\u00e0o n\u00fat &#8220;ADD DEPENDENCIES&#8230;&#8221;<\/li>\n\n\n\n<li>T\u00ecm v\u00e0 ch\u1ecdn Spring Web: Starter n\u00e0y c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web, bao g\u1ed3m c\u00e1c RESTful API v\u00e0 n\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng th\u00eam Apache Tomcat l\u00e0m m\u00e1y ch\u1ee7 nh\u00fang m\u1eb7c \u0111\u1ecbnh.<\/li>\n\n\n\n<li>(T\u00f9y ch\u1ecdn) T\u00ecm v\u00e0 ch\u1ecdn Lombok: M\u1ed9t th\u01b0 vi\u1ec7n ti\u1ec7n \u00edch gi\u00fap gi\u1ea3m thi\u1ec3u code boilerplate (v\u00ed d\u1ee5: getters, setters, constructors) b\u1eb1ng c\u00e1c annotation.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>3. T\u1ea1o v\u00e0 t\u1ea3i d\u1ef1 \u00e1n:<\/strong> Sau khi \u0111i\u1ec1n \u0111\u1ea7y \u0111\u1ee7 th\u00f4ng tin, nh\u1ea5p v\u00e0o n\u00fat &#8220;GENERATE&#8221;. M\u1ed9t file ZIP ch\u1ee9a c\u1ea5u tr\u00fac d\u1ef1 \u00e1n s\u1ebd \u0111\u01b0\u1ee3c t\u1ea3i v\u1ec1 m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-import-d\u1ef1-an-vao-ide\"><strong>Import d\u1ef1 \u00e1n v\u00e0o IDE<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gi\u1ea3i n\u00e9n file ZIP v\u1eeba t\u1ea3i v\u1ec1.<\/li>\n\n\n\n<li>M\u1edf IDE c\u1ee7a b\u1ea1n v\u00e0 ch\u1ecdn &#8220;Open&#8221; ho\u1eb7c &#8220;Import Project&#8221;, sau \u0111\u00f3 tr\u1ecf \u0111\u1ebfn th\u01b0 m\u1ee5c d\u1ef1 \u00e1n v\u1eeba gi\u1ea3i n\u00e9n. IDE s\u1ebd t\u1ef1 \u0111\u1ed9ng nh\u1eadn di\u1ec7n v\u00e0 t\u1ea3i c\u00e1c dependencies \u0111\u00e3 khai b\u00e1o trong <strong><code>pom.xml<\/code><\/strong> (n\u1ebfu d\u00f9ng Maven).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-c\u1ea5u-truc-d\u1ef1-an\"><strong>C\u1ea5u tr\u00fac d\u1ef1 \u00e1n<\/strong><\/h3>\n\n\n\n<p>Sau khi import, b\u1ea1n s\u1ebd th\u1ea5y c\u1ea5u tr\u00fac th\u01b0 m\u1ee5c c\u01a1 b\u1ea3n c\u1ee7a m\u1ed9t d\u1ef1 \u00e1n Spring Boot nh\u01b0 sau (v\u00ed d\u1ee5 v\u1edbi Maven):<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXemYw2tIwCy76zQrwLwEEW9sD48zAc2_tXvMBYO5ipkmSBTLipK3O3uaonY07dFITV6XEsWIKkTwgooOSFDmJR4hdWV2BDa5ekEfKb5m0O3913EH5tREyrqXCIfS4W5-Zrr_rYq?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pom.xml<\/code> (ho\u1eb7c <code>build.gradle<\/code>): File \u0111\u1ecbnh ngh\u0129a d\u1ef1 \u00e1n, qu\u1ea3n l\u00fd c\u00e1c th\u01b0 vi\u1ec7n ph\u1ee5 thu\u1ed9c (dependencies) v\u00e0 c\u00e1ch build d\u1ef1 \u00e1n.<\/li>\n\n\n\n<li><code>src\/main\/java<\/code>: Ch\u1ee9a m\u00e3 ngu\u1ed3n Java c\u1ee7a \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li><code>MyFirstAppApplication.java<\/code> (t\u00ean c\u00f3 th\u1ec3 kh\u00e1c t\u00f9y theo Artifact b\u1ea1n \u0111\u1eb7t): \u0110\u00e2y l\u00e0 l\u1edbp ch\u00ednh ch\u1ee9a ph\u01b0\u01a1ng th\u1ee9c <code>main()<\/code> v\u00e0 \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u b\u1eb1ng annotation <code>@SpringBootApplication<\/code>. \u0110\u00e2y l\u00e0 \u0111i\u1ec3m kh\u1edfi \u0111\u1ea7u c\u1ee7a \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li><code>src\/main\/resources<\/code>: Ch\u1ee9a c\u00e1c t\u00e0i nguy\u00ean nh\u01b0 file c\u1ea5u h\u00ecnh (<code>application.properties<\/code>), t\u00e0i nguy\u00ean t\u0129nh, templates.<\/li>\n\n\n\n<li><code>src\/test\/java<\/code>: Ch\u1ee9a m\u00e3 ngu\u1ed3n cho c\u00e1c b\u00e0i ki\u1ec3m th\u1eed (tests).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-t\u1ea1o-m\u1ed9t-rest-controller-d\u01a1n-gi\u1ea3n\"><strong>T\u1ea1o m\u1ed9t REST Controller \u0111\u01a1n gi\u1ea3n<\/strong><\/h3>\n\n\n\n<p>B\u00e2y gi\u1edd, ch\u00fang ta s\u1ebd t\u1ea1o m\u1ed9t API endpoint \u0111\u01a1n gi\u1ea3n tr\u1ea3 v\u1ec1 m\u1ed9t l\u1eddi ch\u00e0o.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u1ea1o package <code>controller<\/code>:<\/strong> Trong <strong><code>src\/main\/java\/com\/example\/demo<\/code><\/strong> (ho\u1eb7c package g\u1ed1c c\u1ee7a b\u1ea1n), t\u1ea1o m\u1ed9t package m\u1edbi t\u00ean l\u00e0 <strong><code>controller<\/code><\/strong>.<\/li>\n\n\n\n<li><strong>T\u1ea1o class <code>HelloController<\/code>:<\/strong> Trong package <strong><code>controller<\/code><\/strong> v\u1eeba t\u1ea1o, t\u1ea1o m\u1ed9t class Java m\u1edbi t\u00ean l\u00e0 <strong><code>HelloController.java<\/code><\/strong>.<\/li>\n\n\n\n<li><strong>Vi\u1ebft code cho <code>HelloController<\/code>:<\/strong> M\u1edf file <code>HelloController.java<\/code> v\u00e0 th\u00eam \u0111o\u1ea1n code sau:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController \/\/ \u0110\u00e1nh d\u1ea5u \u0111\u00e2y l\u00e0 m\u1ed9t REST controller\npublic class HelloController {\n\n&nbsp; &nbsp; @GetMapping(\"\/hello\") \/\/ \u00c1nh x\u1ea1 HTTP GET request \u0111\u1ebfn \"\/hello\"\n&nbsp; &nbsp; public String sayHello() {\n&nbsp; &nbsp; &nbsp; &nbsp; return \"Hello, World RESTful with Spring Boot!\";\n&nbsp; &nbsp; }\n}<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>@RestController<\/code><\/strong>: K\u1ebft h\u1ee3p <code>@Controller<\/code> v\u00e0 <code>@ResponseBody<\/code>, b\u00e1o hi\u1ec7u r\u1eb1ng c\u00e1c gi\u00e1 tr\u1ecb tr\u1ea3 v\u1ec1 t\u1eeb ph\u01b0\u01a1ng th\u1ee9c s\u1ebd \u0111\u01b0\u1ee3c ghi tr\u1ef1c ti\u1ebfp v\u00e0o HTTP response body.<\/li>\n\n\n\n<li><strong><code>@GetMapping(\"\/hello\")<\/code><\/strong>: \u00c1nh x\u1ea1 c\u00e1c HTTP GET request \u0111\u1ebfn \u0111\u01b0\u1eddng d\u1eabn \/hello v\u00e0o ph\u01b0\u01a1ng th\u1ee9c <code>sayHello()<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ch\u1ea1y-\u1ee9ng-d\u1ee5ng\"><strong>Ch\u1ea1y \u1ee9ng d\u1ee5ng<\/strong><\/h3>\n\n\n\n<p><strong>Ch\u1ea1y t\u1eeb IDE:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u1edf file MyFirstAppApplication.java.<\/li>\n\n\n\n<li>Nh\u1ea5p chu\u1ed9t ph\u1ea3i v\u00e0 ch\u1ecdn <code>\"Run 'MyFirstAppApplication.main()'\"<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Ch\u1ea1y b\u1eb1ng Maven (trong terminal):<\/strong> <code>.\/mvnw spring-boot:run<\/code><\/p>\n\n\n\n<p><strong>Ch\u1ea1y b\u1eb1ng Gradle (trong terminal):<\/strong> <code>.\/gradlew bootRun<\/code><\/p>\n\n\n\n<p>Khi \u1ee9ng d\u1ee5ng kh\u1edfi \u0111\u1ed9ng th\u00e0nh c\u00f4ng, b\u1ea1n s\u1ebd th\u1ea5y log output t\u01b0\u01a1ng t\u1ef1:<\/p>\n\n\n\n<p><code>Tomcat started on port(s): 8080 (http) with context path<\/code>&nbsp;<\/p>\n\n\n\n<p><strong>Ki\u1ec3m tra<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u1edf tr\u00ecnh duy\u1ec7t web v\u00e0 truy c\u1eadp: <code>http:\/\/localhost:8080\/hello<\/code><\/li>\n\n\n\n<li>Ho\u1eb7c s\u1eed d\u1ee5ng curl trong terminal: <code>curl<\/code> <a href=\"http:\/\/localhost:8080\/hello\">http:\/\/localhost:8080\/hello<\/a><\/li>\n<\/ul>\n\n\n\n<p>B\u1ea1n s\u1ebd th\u1ea5y k\u1ebft qu\u1ea3: Hello, World RESTful with Spring Boot!<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXf_5l94vjGbH-nuXo071VnUFP88mev0YrADSJo0AgngAPefyU3dyExdo7yW9sqastU8Vs0FuEIJJg--wpqunaDNLyV9ico-FpMQ7nGSJzSl_Z67Y9X9xm9qAqfIqTE1DhbGGr_s7A?key=-PRmmQW-1WsafUaD68_uZbBk\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-h\u1ec7-sinh-thai-spring-nbsp\"><span class=\"ez-toc-section\" id=\"He_sinh_thai_Spring\"><\/span><strong>H\u1ec7 sinh th\u00e1i Spring&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Spring Boot kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t framework \u0111\u1ed9c l\u1eadp m\u00e0 c\u00f2n l\u00e0 m\u1ed9t ph\u1ea7n c\u1ee7a m\u1ed9t h\u1ec7 sinh th\u00e1i Spring r\u1ed9ng l\u1edbn h\u01a1n. Vi\u1ec7c t\u00edch h\u1ee3p d\u1ec5 d\u00e0ng v\u1edbi c\u00e1c d\u1ef1 \u00e1n Spring kh\u00e1c gi\u00fap m\u1edf r\u1ed9ng \u0111\u00e1ng k\u1ec3 kh\u1ea3 n\u0103ng c\u1ee7a \u1ee9ng d\u1ee5ng Spring Boot. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 d\u1ef1 \u00e1n li\u00ean quan th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-data\"><strong>Spring Data<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>M\u1ee5c \u0111\u00edch:<\/strong> \u0110\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c truy c\u1eadp v\u00e0 t\u01b0\u01a1ng t\u00e1c v\u1edbi c\u00e1c kho d\u1eef li\u1ec7u kh\u00e1c nhau.<\/li>\n\n\n\n<li><strong>T\u00ednh n\u0103ng n\u1ed5i b\u1eadt:<\/strong> Cung c\u1ea5p m\u1ed9t m\u00f4 h\u00ecnh l\u1eadp tr\u00ecnh nh\u1ea5t qu\u00e1n \u0111\u1ec3 truy c\u1eadp d\u1eef li\u1ec7u t\u1eeb c\u00e1c ngu\u1ed3n kh\u00e1c nhau nh\u01b0 c\u01a1 s\u1edf d\u1eef li\u1ec7u quan h\u1ec7 (s\u1eed d\u1ee5ng JPA v\u1edbi Hibernate), c\u01a1 s\u1edf d\u1eef li\u1ec7u NoSQL (MongoDB, Cassandra), c\u00e1c kho l\u01b0u tr\u1eef key-value (Redis),&#8230;<\/li>\n\n\n\n<li><strong>L\u1ee3i \u00edch:<\/strong> Gi\u1ea3m thi\u1ec3u code boilerplate cho c\u00e1c thao t\u00e1c CRUD (Create, Read, Update, Delete) th\u00f4ng qua c\u00e1c Repository interface.<\/li>\n\n\n\n<li><strong>V\u00ed d\u1ee5 Starter:<\/strong> <code>spring-boot-starter-data-jpa<\/code>, <code>spring-boot-starter-data-mongodb<\/code>, <code>spring-boot-starter-data-redis<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-security\"><strong>Spring Security<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>M\u1ee5c \u0111\u00edch:<\/strong> Cung c\u1ea5p c\u00e1c gi\u1ea3i ph\u00e1p to\u00e0n di\u1ec7n v\u1ec1 b\u1ea3o m\u1eadt cho \u1ee9ng d\u1ee5ng Java.<\/li>\n\n\n\n<li><strong>T\u00ednh n\u0103ng n\u1ed5i b\u1eadt:<\/strong> H\u1ed7 tr\u1ee3 x\u00e1c th\u1ef1c (authentication &#8211; ai l\u00e0 ng\u01b0\u1eddi d\u00f9ng?) v\u00e0 ph\u00e2n quy\u1ec1n (authorization &#8211; ng\u01b0\u1eddi d\u00f9ng \u0111\u01b0\u1ee3c l\u00e0m g\u00ec?). Cung c\u1ea5p c\u00e1c c\u01a1 ch\u1ebf b\u1ea3o v\u1ec7 ch\u1ed1ng l\u1ea1i c\u00e1c t\u1ea5n c\u00f4ng ph\u1ed5 bi\u1ebfn nh\u01b0 CSRF, Session Fixation. T\u00edch h\u1ee3p d\u1ec5 d\u00e0ng v\u1edbi OAuth2, JWT, LDAP v\u00e0 nhi\u1ec1u c\u01a1 ch\u1ebf x\u00e1c th\u1ef1c kh\u00e1c.<\/li>\n\n\n\n<li><strong>L\u1ee3i \u00edch:<\/strong> Gi\u00fap x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng an to\u00e0n v\u00e0 b\u1ea3o m\u1eadt m\u1ed9t c\u00e1ch m\u1ea1nh m\u1ebd v\u00e0 linh ho\u1ea1t.<\/li>\n\n\n\n<li><strong>V\u00ed d\u1ee5 Starter:<\/strong> <code>spring-boot-starter-security<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-cloud\"><strong>Spring Cloud<\/strong><\/h3>\n\n\n\n<p><strong>M\u1ee5c \u0111\u00edch:<\/strong> Cung c\u1ea5p c\u00e1c c\u00f4ng c\u1ee5 v\u00e0 framework \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng ph\u00e2n t\u00e1n v\u00e0 ki\u1ebfn tr\u00fac microservices tr\u00ean n\u1ec1n t\u1ea3ng \u0111\u00e1m m\u00e2y.<\/p>\n\n\n\n<p><strong>T\u00ednh n\u0103ng n\u1ed5i b\u1eadt:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Service Discovery (v\u00ed d\u1ee5: Netflix Eureka, Consul):<\/strong> Cho ph\u00e9p c\u00e1c microservice t\u1ef1 \u0111\u1ed9ng t\u00ecm th\u1ea5y v\u00e0 giao ti\u1ebfp v\u1edbi nhau.<\/li>\n\n\n\n<li><strong>Configuration Server (v\u00ed d\u1ee5: Spring Cloud Config):<\/strong> Qu\u1ea3n l\u00fd c\u1ea5u h\u00ecnh t\u1eadp trung cho c\u00e1c microservice.<\/li>\n\n\n\n<li><strong>Circuit Breaker (v\u00ed d\u1ee5: Resilience4j, tr\u01b0\u1edbc \u0111\u00e2y l\u00e0 Netflix Hystrix):<\/strong> T\u0103ng kh\u1ea3 n\u0103ng ch\u1ecbu l\u1ed7i c\u1ee7a h\u1ec7 th\u1ed1ng b\u1eb1ng c\u00e1ch ng\u0103n ch\u1eb7n c\u00e1c l\u1ed7i lan truy\u1ec1n.<\/li>\n\n\n\n<li><strong>API Gateway (v\u00ed d\u1ee5: Spring Cloud Gateway):<\/strong> Cung c\u1ea5p m\u1ed9t \u0111i\u1ec3m v\u00e0o duy nh\u1ea5t cho t\u1ea5t c\u1ea3 c\u00e1c request \u0111\u1ebfn h\u1ec7 th\u1ed1ng microservices.<\/li>\n\n\n\n<li><strong>Load Balancing (v\u00ed d\u1ee5: Spring Cloud LoadBalancer, tr\u01b0\u1edbc \u0111\u00e2y l\u00e0 Netflix Ribbon):<\/strong> Ph\u00e2n ph\u1ed1i t\u1ea3i gi\u1eefa c\u00e1c instance c\u1ee7a microservice.<\/li>\n<\/ul>\n\n\n\n<p><strong>L\u1ee3i \u00edch:<\/strong> \u0110\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c ph\u00e1t tri\u1ec3n v\u00e0 tri\u1ec3n khai c\u00e1c h\u1ec7 th\u1ed1ng microservices ph\u1ee9c t\u1ea1p, c\u00f3 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng v\u00e0 ch\u1ecbu l\u1ed7i cao.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 Starter:<\/strong> C\u00e1c starters ri\u00eang cho t\u1eebng module c\u1ee7a Spring Cloud (v\u00ed d\u1ee5: <code>spring-cloud-starter-netflix-eureka-client<\/code>, <code>spring-cloud-starter-config-client<\/code>, <code>spring-cloud-starter-gateway<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-webflux\"><strong>Spring WebFlux<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>M\u1ee5c \u0111\u00edch:<\/strong> H\u1ed7 tr\u1ee3 ph\u00e1t tri\u1ec3n c\u00e1c \u1ee9ng d\u1ee5ng web ph\u1ea3n \u1ee9ng (reactive), kh\u00f4ng ch\u1eb7n (non-blocking), c\u00f3 kh\u1ea3 n\u0103ng x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi cao v\u1edbi t\u00e0i nguy\u00ean h\u1ec7 th\u1ed1ng hi\u1ec7u qu\u1ea3.<\/li>\n\n\n\n<li><strong>T\u00ednh n\u0103ng n\u1ed5i b\u1eadt:<\/strong> S\u1eed d\u1ee5ng m\u00f4 h\u00ecnh l\u1eadp tr\u00ecnh reactive d\u1ef1a tr\u00ean Project Reactor (Flux v\u00e0 Mono) \u0111\u1ec3 x\u1eed l\u00fd c\u00e1c lu\u1ed3ng d\u1eef li\u1ec7u b\u1ea5t \u0111\u1ed3ng b\u1ed9. Ph\u00f9 h\u1ee3p cho c\u00e1c \u1ee9ng d\u1ee5ng c\u1ea7n th\u00f4ng l\u01b0\u1ee3ng cao, \u0111\u1ed9 tr\u1ec5 th\u1ea5p, v\u00e0 c\u00e1c \u1ee9ng d\u1ee5ng streaming.<\/li>\n\n\n\n<li><strong>L\u1ee3i \u00edch:<\/strong> X\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng c\u00f3 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng t\u1ed1t h\u01a1n v\u00e0 ph\u1ea3n h\u1ed3i nhanh h\u01a1n, \u0111\u1eb7c bi\u1ec7t trong c\u00e1c k\u1ecbch b\u1ea3n c\u00f3 nhi\u1ec1u I\/O bound operations.<\/li>\n\n\n\n<li><strong>V\u00ed d\u1ee5 Starter:<\/strong> <code>spring-boot-starter-webflux<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-thymeleaf-apache-freemarker-template-engines\"><strong>Thymeleaf \/ Apache Freemarker (Template Engines)<\/strong><\/h3>\n\n\n\n<p><strong>M\u1ee5c \u0111\u00edch:<\/strong> D\u00e0nh cho vi\u1ec7c render giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng ph\u00eda m\u00e1y ch\u1ee7 (server-side rendering).<\/p>\n\n\n\n<p><strong>T\u00ednh n\u0103ng n\u1ed5i b\u1eadt:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Thymeleaf:<\/strong> M\u1ed9t template engine hi\u1ec7n \u0111\u1ea1i cho Java, cho ph\u00e9p t\u1ea1o c\u00e1c template HTML t\u1ef1 nhi\u00ean (c\u00f3 th\u1ec3 m\u1edf tr\u1ef1c ti\u1ebfp tr\u00ean tr\u00ecnh duy\u1ec7t m\u00e0 kh\u00f4ng b\u1ecb l\u1ed7i). T\u00edch h\u1ee3p t\u1ed1t v\u1edbi Spring MVC.<\/li>\n\n\n\n<li><strong>Freemarker:<\/strong> M\u1ed9t template engine m\u1ea1nh m\u1ebd v\u00e0 linh ho\u1ea1t kh\u00e1c, c\u0169ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng r\u1ed9ng r\u00e3i.<\/li>\n<\/ul>\n\n\n\n<p><strong>L\u1ee3i \u00edch:<\/strong> Cho ph\u00e9p x\u00e2y d\u1ef1ng c\u00e1c trang web \u0111\u1ed9ng n\u01a1i HTML \u0111\u01b0\u1ee3c t\u1ea1o ra tr\u00ean server tr\u01b0\u1edbc khi g\u1eedi v\u1ec1 tr\u00ecnh duy\u1ec7t.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 Starter:<\/strong> <code>spring-boot-starter-thymeleaf<\/code>, <code>spring-boot-starter-freemarker<\/code>.<\/p>\n\n\n\n<p>T\u00f3m l\u1ea1i: Vi\u1ec7c hi\u1ec3u v\u00e0 bi\u1ebft c\u00e1ch k\u1ebft h\u1ee3p c\u00e1c d\u1ef1 \u00e1n n\u00e0y trong h\u1ec7 sinh th\u00e1i Spring Boot s\u1ebd gi\u00fap b\u1ea1n x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c nh\u1eefng \u1ee9ng d\u1ee5ng Java m\u1ea1nh m\u1ebd, linh ho\u1ea1t v\u00e0 \u0111\u00e1p \u1ee9ng \u0111\u01b0\u1ee3c c\u00e1c y\u00eau c\u1ea7u \u0111a d\u1ea1ng c\u1ee7a c\u00e1c d\u1ef1 \u00e1n hi\u1ec7n \u0111\u1ea1i.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-spring-boot\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Spring_Boot\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-fat-jar-ho\u1eb7c-executable-jar-trong-spring-boot-la-gi\"><strong>&#8220;Fat JAR&#8221; (ho\u1eb7c &#8220;Executable JAR&#8221;) trong Spring Boot l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>Khi b\u1ea1n \u0111\u00f3ng g\u00f3i m\u1ed9t \u1ee9ng d\u1ee5ng Spring Boot (th\u01b0\u1eddng l\u00e0 v\u1edbi <strong><code>spring-boot-maven-plugin<\/code><\/strong> ho\u1eb7c <strong><code>spring-boot-gradle-plugin<\/code><\/strong>), n\u00f3 s\u1ebd t\u1ea1o ra m\u1ed9t file JAR &#8220;b\u00e9o&#8221; (fat JAR).<\/p>\n\n\n\n<p>File JAR n\u00e0y ch\u1ee9a t\u1ea5t c\u1ea3 c\u00e1c dependencies c\u1ea7n thi\u1ebft c\u1ee7a \u1ee9ng d\u1ee5ng (bao g\u1ed3m c\u1ea3 m\u00e1y ch\u1ee7 nh\u00fang nh\u01b0 Tomcat) \u0111\u1ec3 \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 ch\u1ea1y \u0111\u1ed9c l\u1eadp b\u1eb1ng l\u1ec7nh <strong><code>java -jar ten-ung-dung.jar<\/code><\/strong> m\u00e0 kh\u00f4ng c\u1ea7n c\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 b\u00ean ngo\u00e0i.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-lam-th\u1ebf-nao-d\u1ec3-lo\u1ea1i-tr\u1eeb-m\u1ed9t-auto-configuration-c\u1ee5-th\u1ec3\"><strong>L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 lo\u1ea1i tr\u1eeb m\u1ed9t Auto-Configuration c\u1ee5 th\u1ec3?<\/strong><\/h3>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 lo\u1ea1i tr\u1eeb m\u1ed9t l\u1edbp Auto-Configuration c\u1ee5 th\u1ec3 b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng thu\u1ed9c t\u00ednh <strong><code>exclude<\/code><\/strong> c\u1ee7a annotation <strong><code>@SpringBootApplication<\/code><\/strong> (ho\u1eb7c <strong><code>@EnableAutoConfiguration<\/code><\/strong>).<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;\n\n@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})\npublic class MyApplication {\n&nbsp; &nbsp; \/\/ ...\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-initializr-la-gi-va-t\u1ea1i-sao-toi-nen-s\u1eed-d\u1ee5ng-no\"><strong>Spring Initializr l\u00e0 g\u00ec v\u00e0 t\u1ea1i sao t\u00f4i n\u00ean s\u1eed d\u1ee5ng n\u00f3?<\/strong><\/h3>\n\n\n\n<p>Spring Initializr l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 web (v\u00e0 c\u0169ng \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p trong nhi\u1ec1u IDE) gi\u00fap b\u1ea1n nhanh ch\u00f3ng t\u1ea1o c\u1ea5u tr\u00fac d\u1ef1 \u00e1n Spring Boot ban \u0111\u1ea7u. B\u1ea1n n\u00ean s\u1eed d\u1ee5ng Spring Initializr v\u00ec n\u00f3 gi\u00fap:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ch\u1ecdn phi\u00ean b\u1ea3n Spring Boot, ng\u00f4n ng\u1eef (Java, Kotlin, Groovy), c\u00f4ng c\u1ee5 build (Maven\/Gradle).<\/li>\n\n\n\n<li>D\u1ec5 d\u00e0ng th\u00eam c\u00e1c &#8220;starter&#8221; dependencies c\u1ea7n thi\u1ebft cho d\u1ef1 \u00e1n.<\/li>\n\n\n\n<li>T\u1ea1o ra m\u1ed9t d\u1ef1 \u00e1n v\u1edbi c\u1ea5u tr\u00fac chu\u1ea9n, s\u1eb5n s\u00e0ng \u0111\u1ec3 import v\u00e0o IDE v\u00e0 b\u1eaft \u0111\u1ea7u code.<\/li>\n\n\n\n<li>Ti\u1ebft ki\u1ec7m th\u1eddi gian thi\u1ebft l\u1eadp ban \u0111\u1ea7u v\u00e0 gi\u1ea3m thi\u1ec3u l\u1ed7i c\u1ea5u h\u00ecnh.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-toi-co-th\u1ec3-t\u1ea1o-d\u1ef1-an-spring-boot-ma-khong-c\u1ea7n-spring-initializr-khong\"><strong>T\u00f4i c\u00f3 th\u1ec3 t\u1ea1o d\u1ef1 \u00e1n Spring Boot m\u00e0 kh\u00f4ng c\u1ea7n Spring Initializr kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>C\u00f3, b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3. B\u1ea1n c\u00f3 th\u1ec3 t\u1ef1 t\u1ea1o file pom.xml ho\u1eb7c build.gradle, khai b\u00e1o c\u00e1c dependencies c\u1ea7n thi\u1ebft v\u00e0 c\u1ea5u tr\u00fac th\u01b0 m\u1ee5c th\u1ee7 c\u00f4ng. Tuy nhi\u00ean, vi\u1ec7c n\u00e0y t\u1ed1n th\u1eddi gian h\u01a1n, d\u1ec5 x\u1ea3y ra l\u1ed7i v\u00e0 kh\u00f4ng \u0111\u01b0\u1ee3c khuy\u1ebfn kh\u00edch, \u0111\u1eb7c bi\u1ec7t l\u00e0 \u0111\u1ed1i v\u1edbi ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u. Spring Initializr gi\u00fap chu\u1ea9n h\u00f3a v\u00e0 \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh n\u00e0y.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dependencies-trong-spring-initializr-la-gi\"><strong>&#8220;Dependencies&#8221; trong Spring Initializr l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>&#8220;Dependencies&#8221; trong Spring Initializr ch\u00ednh l\u00e0 c\u00e1c Spring Boot Starters ho\u1eb7c c\u00e1c th\u01b0 vi\u1ec7n kh\u00e1c m\u00e0 b\u1ea1n mu\u1ed1n th\u00eam v\u00e0o d\u1ef1 \u00e1n c\u1ee7a m\u00ecnh. V\u00ed d\u1ee5, n\u1ebfu b\u1ea1n mu\u1ed1n x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web, b\u1ea1n s\u1ebd th\u00eam dependency &#8220;Spring Web&#8221;.<\/p>\n\n\n\n<p>N\u1ebfu mu\u1ed1n l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u JPA, b\u1ea1n th\u00eam &#8220;Spring Data JPA&#8221;. Spring Initializr s\u1ebd t\u1ef1 \u0111\u1ed9ng th\u00eam c\u00e1c khai b\u00e1o c\u1ea7n thi\u1ebft v\u00e0o file pom.xml (Maven) ho\u1eb7c build.gradle (Gradle) c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-k\u1ebft\"><span class=\"ez-toc-section\" id=\"Tong_ket\"><\/span><strong>T\u1ed5ng k\u1ebft<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Spring Boot \u0111\u00e3 c\u00e1ch m\u1ea1ng h\u00f3a c\u00e1ch ch\u00fang ta ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng Java b\u1eb1ng c\u00e1ch lo\u1ea1i b\u1ecf ph\u1ea7n l\u1edbn c\u1ea5u h\u00ecnh boilerplate v\u00e0 cung c\u1ea5p m\u1ed9t c\u00e1ch ti\u1ebfp c\u1eadn &#8220;c\u00f3 quan \u0111i\u1ec3m&#8221; \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho production. V\u1edbi c\u00e1c t\u00ednh n\u0103ng m\u1ea1nh m\u1ebd nh\u01b0 t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh, starter dependencies, m\u00e1y ch\u1ee7 nh\u00fang v\u00e0 Actuator, Spring Boot gi\u00fap l\u1eadp tr\u00ecnh vi\u00ean t\u1eadp trung v\u00e0o vi\u1ec7c vi\u1ebft business logic, t\u1eeb \u0111\u00f3 t\u0103ng t\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n v\u00e0 n\u00e2ng cao n\u0103ng su\u1ea5t.<\/p>\n\n\n\n<p>Qua h\u01b0\u1edbng d\u1eabn n\u00e0y, b\u1ea1n \u0111\u00e3 l\u00e0m quen v\u1edbi c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i, c\u00e1ch x\u00e2y d\u1ef1ng m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u01a1n gi\u1ea3n v\u00e0 hi\u1ec3u \u0111\u01b0\u1ee3c v\u1ecb tr\u00ed c\u1ee7a Spring Boot trong h\u1ec7 sinh th\u00e1i Spring r\u1ed9ng l\u1edbn. \u0110\u00e2y ch\u1ec9 l\u00e0 b\u01b0\u1edbc kh\u1edfi \u0111\u1ea7u. Spring Boot c\u00f2n r\u1ea5t nhi\u1ec1u ti\u1ec1m n\u0103ng \u0111\u1ec3 b\u1ea1n kh\u00e1m ph\u00e1 v\u00e0 \u1ee9ng d\u1ee5ng v\u00e0o c\u00e1c d\u1ef1 \u00e1n ph\u1ee9c t\u1ea1p h\u01a1n, t\u1eeb c\u00e1c \u1ee9ng d\u1ee5ng web truy\u1ec1n th\u1ed1ng \u0111\u1ebfn c\u00e1c h\u1ec7 th\u1ed1ng microservices hi\u1ec7n \u0111\u1ea1i.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc th\u00eam: <strong><a href=\"https:\/\/itviec.com\/blog\/spring-java-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Java l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn chi ti\u1ebft c\u00e1ch b\u1eaft \u0111\u1ea7u v\u1edbi Spring<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot l\u00e0 m\u1ed9t framework gi\u00fap b\u1ea1n nhanh ch\u00f3ng v\u00e0 d\u1ec5 d\u00e0ng x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho m\u00f4i tr\u01b0\u1eddng production. N\u1ebfu b\u1ea1n l\u00e0 l\u1eadp tr\u00ecnh vi\u00ean Java mu\u1ed1n t\u00ecm hi\u1ec3u m\u1ed9t ph\u01b0\u01a1ng ph\u00e1p ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng hi\u1ec7n \u0111\u1ea1i, b\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u00fap b\u1ea1n n\u1eafm \u0111\u01b0\u1ee3c ki\u1ebfn th\u1ee9c [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":88885,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109],"tags":[],"class_list":["post-88878","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Hi\u1ec3u r\u00f5 Spring Boot l\u00e0 g\u00ec t\u1eeb c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i \u0111\u1ebfn c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Java nhanh ch\u00f3ng, \u0111\u01a1n gi\u1ea3n m\u00e0 c\u00f3 th\u1ec3 \u00e1p d\u1ee5ng ngay.\" \/>\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-boot-la-gi\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot\" \/>\n<meta property=\"og:description\" content=\"Spring Boot l\u00e0 m\u1ed9t framework gi\u00fap b\u1ea1n nhanh ch\u00f3ng v\u00e0 d\u1ec5 d\u00e0ng x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho m\u00f4i tr\u01b0\u1eddng production. N\u1ebfu b\u1ea1n l\u00e0 l\u1eadp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/\" \/>\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-01T15:11:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-02T02:22:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"421\" \/>\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=\"32 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot - ITviec Blog","description":"Hi\u1ec3u r\u00f5 Spring Boot l\u00e0 g\u00ec t\u1eeb c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i \u0111\u1ebfn c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Java nhanh ch\u00f3ng, \u0111\u01a1n gi\u1ea3n m\u00e0 c\u00f3 th\u1ec3 \u00e1p d\u1ee5ng ngay.","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-boot-la-gi\/","og_locale":"vi_VN","og_type":"article","og_title":"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot","og_description":"Spring Boot l\u00e0 m\u1ed9t framework gi\u00fap b\u1ea1n nhanh ch\u00f3ng v\u00e0 d\u1ec5 d\u00e0ng x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho m\u00f4i tr\u01b0\u1eddng production. N\u1ebfu b\u1ea1n l\u00e0 l\u1eadp","og_url":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-07-01T15:11:22+00:00","article_modified_time":"2025-07-02T02:22:29+00:00","og_image":[{"width":800,"height":421,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-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":"32 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/"},"author":{"name":"Tien Tran","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/1595d671c49cfa2a48cd3c0a047a1298"},"headline":"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot","datePublished":"2025-07-01T15:11:22+00:00","dateModified":"2025-07-02T02:22:29+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/"},"wordCount":8298,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/","url":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/","name":"Spring Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-scaled.png","datePublished":"2025-07-01T15:11:22+00:00","dateModified":"2025-07-02T02:22:29+00:00","description":"Hi\u1ec3u r\u00f5 Spring Boot l\u00e0 g\u00ec t\u1eeb c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i \u0111\u1ebfn c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Java nhanh ch\u00f3ng, \u0111\u01a1n gi\u1ea3n m\u00e0 c\u00f3 th\u1ec3 \u00e1p d\u1ee5ng ngay.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/spring-boot-la-gi\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/spring-boot-la-gi-vippro-scaled.png","width":800,"height":421,"caption":"spring boot l\u00e0 g\u00ec - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/#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 Boot l\u00e0 g\u00ec: Chi ti\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Spring Boot"}]},{"@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\/88878","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=88878"}],"version-history":[{"count":5,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/88878\/revisions"}],"predecessor-version":[{"id":88901,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/88878\/revisions\/88901"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/88885"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=88878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=88878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=88878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}