{"id":92118,"date":"2025-11-27T15:23:35","date_gmt":"2025-11-27T08:23:35","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=92118"},"modified":"2025-11-27T15:23:39","modified_gmt":"2025-11-27T08:23:39","slug":"cau-hoi-phong-van-spring","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/","title":{"rendered":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior"},"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\/cau-hoi-phong-van-spring\/#Tong_hop_cac_nhom_kien_thuc_thuong_gap\" >T\u1ed5ng h\u1ee3p c\u00e1c nh\u00f3m ki\u1ebfn th\u1ee9c th\u01b0\u1eddng g\u1eb7p<\/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\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Cac_nguyen_tac_cot_loi_%E2%80%93_IoC_DI_va_Spring_Beans\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: C\u00e1c nguy\u00ean t\u1eafc c\u1ed1t l\u00f5i &#8211; IoC, DI, v\u00e0 Spring Beans<\/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\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Xay_dung_ung_dung_Web_va_API_voi_Spring_MVC\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Web v\u00e0 API v\u1edbi 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\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Kien_thuc_ve_Spring_Boot\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: Ki\u1ebfn th\u1ee9c 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-5\" href=\"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Tuong_tac_du_lieu_va_tinh_toan_ven_giao_dich\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: T\u01b0\u01a1ng t\u00e1c d\u1eef li\u1ec7u v\u00e0 t\u00ednh to\u00e0n v\u1eb9n giao d\u1ecbch<\/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\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Cac_chu_de_nang_cao_trong_kien_truc_ung_dung\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: C\u00e1c ch\u1ee7 \u0111\u1ec1 n\u00e2ng cao trong ki\u1ebfn tr\u00fac \u1ee9ng d\u1ee5ng<\/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\/cau-hoi-phong-van-spring\/#Cau_hoi_phong_van_Spring_Spring_trong_boi_canh_Cloud-Native_hien_dai\" >C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: Spring trong b\u1ed1i c\u1ea3nh Cloud-Native hi\u1ec7n \u0111\u1ea1i<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Spring Framework l\u00e0 m\u1ed9t trong nh\u1eefng k\u1ef9 n\u0103ng quan tr\u1ecdng v\u00e0 \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u nhi\u1ec1u nh\u1ea5t \u0111\u1ed1i v\u1edbi c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java, d\u00f9 b\u1ea1n m\u1edbi ra tr\u01b0\u1eddng hay l\u00e0 m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 d\u00e0y d\u1eb7n kinh nghi\u1ec7m. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd t\u1ed5ng h\u1ee3p 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring <strong><em>th\u01b0\u1eddng g\u1eb7p<\/em><\/strong>, ph\u00e2n lo\u1ea1i theo t\u1eebng nh\u00f3m ki\u1ebfn th\u1ee9c v\u00e0 c\u1ea5p \u0111\u1ed9 t\u1eeb Junior \u0111\u1ebfn Senior, gi\u00fap b\u1ea1n h\u1ec7 th\u1ed1ng h\u00f3a ki\u1ebfn th\u1ee9c v\u00e0 t\u1ef1 tin \u201cchinh ph\u1ee5c\u201d c\u00e1c bu\u1ed5i ph\u1ecfng v\u1ea5n s\u1eafp t\u1edbi.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-h\u1ee3p-cac-nhom-ki\u1ebfn-th\u1ee9c-th\u01b0\u1eddng-g\u1eb7p\"><span class=\"ez-toc-section\" id=\"Tong_hop_cac_nhom_kien_thuc_thuong_gap\"><\/span><strong>T\u1ed5ng h\u1ee3p c\u00e1c nh\u00f3m ki\u1ebfn th\u1ee9c th\u01b0\u1eddng g\u1eb7p<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>M\u1ed9t bu\u1ed5i ph\u1ecfng v\u1ea5n v\u1ec1 Spring th\u01b0\u1eddng xoay quanh c\u00e1c nh\u00f3m ch\u1ee7 \u0111\u1ec1 ch\u00ednh sau \u0111\u00e2y:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>C\u00e1c nguy\u00ean t\u1eafc c\u1ed1t l\u00f5i:<\/strong> \u0110\u00e2y l\u00e0 n\u1ec1n t\u1ea3ng c\u1ee7a Spring, bao g\u1ed3m Inversion of Control (IoC), Dependency Injection (DI), v\u00e0 c\u00e1ch Spring qu\u1ea3n l\u00fd c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng (Beans). \u0110\u00e2y l\u00e0 ph\u1ea7n kh\u00f4ng th\u1ec3 thi\u1ebfu trong b\u1ea5t k\u1ef3 cu\u1ed9c ph\u1ecfng v\u1ea5n n\u00e0o.<\/li>\n\n\n\n<li><strong>X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Web\/API:<\/strong> T\u1eadp trung v\u00e0o Spring MVC, c\u00e1ch n\u00f3 x\u1eed l\u00fd c\u00e1c HTTP request, c\u00e1c annotations quan tr\u1ecdng v\u00e0 ki\u1ebfn tr\u00fac t\u1ed5ng th\u1ec3.<\/li>\n\n\n\n<li><strong>T\u01b0\u01a1ng t\u00e1c d\u1eef li\u1ec7u v\u00e0 Giao d\u1ecbch:<\/strong> Khai th\u00e1c kh\u1ea3 n\u0103ng l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u c\u1ee7a Spring, \u0111\u1eb7c bi\u1ec7t l\u00e0 Spring Data JPA v\u00e0 c\u00e1ch qu\u1ea3n l\u00fd t\u00ednh to\u00e0n v\u1eb9n d\u1eef li\u1ec7u v\u1edbi @Transactional.<\/li>\n\n\n\n<li><strong>Spring Boot:<\/strong> Spring Boot \u0111\u00e3 tr\u1edf th\u00e0nh ti\u00eau chu\u1ea9n de-facto. C\u00e1c c\u00e2u h\u1ecfi s\u1ebd xoay quanh c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh (auto-configuration), starters, v\u00e0 c\u00e1c t\u00ednh n\u0103ng gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c ph\u00e1t tri\u1ec3n.<\/li>\n\n\n\n<li><strong>C\u00e1c ch\u1ee7 \u0111\u1ec1 n\u00e2ng cao:<\/strong> D\u00e0nh cho c\u00e1c v\u1ecb tr\u00ed Middle v\u00e0 Senior, bao g\u1ed3m L\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP), b\u1ea3o m\u1eadt v\u1edbi Spring Security, v\u00e0 Caching.<\/li>\n\n\n\n<li><strong>Ki\u1ebfn tr\u00fac hi\u1ec7n \u0111\u1ea1i v\u00e0 Cloud-Native:<\/strong> V\u1edbi s\u1ef1 tr\u1ed7i d\u1eady c\u1ee7a microservices, c\u00e1c ki\u1ebfn th\u1ee9c v\u1ec1 Spring Cloud, Reactive Programming (WebFlux) ng\u00e0y c\u00e0ng \u0111\u01b0\u1ee3c coi tr\u1ecdng, \u0111\u1eb7c bi\u1ec7t cho c\u00e1c v\u1ecb tr\u00ed Senior v\u00e0 Architect.<\/li>\n<\/ol>\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-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-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-cac-nguyen-t\u1eafc-c\u1ed1t-loi-ioc-di-va-spring-beans\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Cac_nguyen_tac_cot_loi_%E2%80%93_IoC_DI_va_Spring_Beans\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: C\u00e1c nguy\u00ean t\u1eafc c\u1ed1t l\u00f5i &#8211; IoC, DI, v\u00e0 Spring Beans<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Nh\u00f3m c\u00e2u h\u1ecfi n\u00e0y l\u00e0 n\u1ec1n t\u1ea3ng v\u00e0 th\u01b0\u1eddng d\u00e0nh cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean \u1edf m\u1ecdi c\u1ea5p \u0111\u1ed9, \u0111\u1eb7c bi\u1ec7t l\u00e0 <\/em><strong><em>Junior<\/em><\/strong><em> \u0111\u1ec3 ki\u1ec3m tra ki\u1ebfn th\u1ee9c c\u01a1 b\u1ea3n nh\u1ea5t.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-1-inversion-of-control-ioc-va-dependency-injection-di-la-gi-gi\u1ea3i-thich-nguyen-t\u1eafc-d\u1ea3o-ng\u01b0\u1ee3c-ph\u1ee5-thu\u1ed9c-dependency-inversion-principle-dip\"><strong>1. Inversion of Control (IoC) v\u00e0 Dependency Injection (DI) l\u00e0 g\u00ec? Gi\u1ea3i th\u00edch Nguy\u00ean t\u1eafc \u0110\u1ea3o ng\u01b0\u1ee3c Ph\u1ee5 thu\u1ed9c (Dependency Inversion Principle &#8211; DIP).<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-inversion-of-control-ioc\"><strong>Inversion of Control (IoC)<\/strong><\/h4>\n\n\n\n<p>L\u00e0 m\u1ed9t nguy\u00ean t\u1eafc thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m, trong \u0111\u00f3 quy\u1ec1n ki\u1ec3m so\u00e1t (control) vi\u1ec7c kh\u1edfi t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c &#8220;\u0111\u1ea3o ng\u01b0\u1ee3c&#8221; t\u1eeb code c\u1ee7a l\u1eadp tr\u00ecnh vi\u00ean sang cho m\u1ed9t framework ho\u1eb7c container. Thay v\u00ec b\u1ea1n t\u1ef1 t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng b\u1eb1ng t\u1eeb kh\u00f3a new, Spring Container s\u1ebd l\u00e0m \u0111i\u1ec1u \u0111\u00f3 cho b\u1ea1n.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-dependency-injection-di\"><strong>Dependency Injection (DI)<\/strong><\/h4>\n\n\n\n<p>L\u00e0 m\u1ed9t c\u00e1ch tri\u1ec3n khai c\u1ee5 th\u1ec3 c\u1ee7a IoC. Thay v\u00ec m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng t\u1ef1 t\u00ecm ki\u1ebfm ho\u1eb7c kh\u1edfi t\u1ea1o c\u00e1c <em>ph\u1ee5 thu\u1ed9c<\/em> (dependencies &#8211; c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng kh\u00e1c m\u00e0 n\u00f3 c\u1ea7n), c\u00e1c ph\u1ee5 thu\u1ed9c n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c &#8220;ti\u00eam&#8221; (inject) v\u00e0o \u0111\u1ed1i t\u01b0\u1ee3ng t\u1eeb b\u00ean ngo\u00e0i b\u1edfi Spring Container.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-dependency-inversion-principle-dip\"><strong>Dependency Inversion Principle (DIP)<\/strong><\/h4>\n\n\n\n<p>L\u00e0 m\u1ed9t trong n\u0103m <strong><a href=\"https:\/\/itviec.com\/blog\/solid-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">nguy\u00ean t\u1eafc SOLID<\/a><\/strong>, DIP cho r\u1eb1ng:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>C\u00e1c module c\u1ea5p cao kh\u00f4ng n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o c\u00e1c module c\u1ea5p th\u1ea5p. C\u1ea3 hai n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o m\u1ed9t l\u1edbp tr\u1eebu t\u01b0\u1ee3ng (abstraction, th\u01b0\u1eddng l\u00e0 interface).<\/li>\n\n\n\n<li>C\u00e1c l\u1edbp tr\u1eebu t\u01b0\u1ee3ng kh\u00f4ng n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o chi ti\u1ebft. Chi ti\u1ebft n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o tr\u1eebu t\u01b0\u1ee3ng. DI ch\u00ednh l\u00e0 m\u1ed9t c\u01a1 ch\u1ebf gi\u00fap tu\u00e2n th\u1ee7 nguy\u00ean t\u1eafc DIP m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2-spring-bean-la-gi-scope-m\u1eb7c-d\u1ecbnh-c\u1ee7a-m\u1ed9t-spring-bean-la-gi\"><strong>2. Spring Bean l\u00e0 g\u00ec? Scope m\u1eb7c \u0111\u1ecbnh c\u1ee7a m\u1ed9t Spring Bean l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>Spring Bean: L\u00e0 m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o, l\u1eafp r\u00e1p v\u00e0 qu\u1ea3n l\u00fd b\u1edfi Spring IoC Container. Ch\u00fang l\u00e0 x\u01b0\u01a1ng s\u1ed1ng c\u1ee7a b\u1ea5t k\u1ef3 \u1ee9ng d\u1ee5ng Spring n\u00e0o.<\/p>\n\n\n\n<p>Scope m\u1eb7c \u0111\u1ecbnh l\u00e0 Singleton. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 trong to\u00e0n b\u1ed9 IoC container, ch\u1ec9 c\u00f3 m\u1ed9t v\u00e0 ch\u1ec9 m\u1ed9t instance c\u1ee7a bean \u0111\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra. M\u1ecdi y\u00eau c\u1ea7u \u0111\u1ebfn bean n\u00e0y \u0111\u1ec1u s\u1ebd nh\u1eadn v\u1ec1 c\u00f9ng m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3-co-nh\u1eefng-cach-nao-d\u1ec3-c\u1ea5u-hinh-m\u1ed9t-\u1ee9ng-d\u1ee5ng-spring-b\u1ea1n-\u01b0a-thich-cach-nao-va-t\u1ea1i-sao\"><strong>3. C\u00f3 nh\u1eefng c\u00e1ch n\u00e0o \u0111\u1ec3 c\u1ea5u h\u00ecnh m\u1ed9t \u1ee9ng d\u1ee5ng Spring? B\u1ea1n \u01b0a th\u00edch c\u00e1ch n\u00e0o v\u00e0 t\u1ea1i sao?<\/strong><\/h3>\n\n\n\n<p>C\u00f3 ba c\u00e1ch ch\u00ednh:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>C\u1ea5u h\u00ecnh b\u1eb1ng XML (XML-based configuration):<\/strong> C\u00e1ch ti\u1ebfp c\u1eadn truy\u1ec1n th\u1ed1ng.<\/li>\n\n\n\n<li><strong>C\u1ea5u h\u00ecnh b\u1eb1ng Annotation (Annotation-based configuration):<\/strong> S\u1eed d\u1ee5ng c\u00e1c annotation nh\u01b0 @Component, @Service, @Autowired.<\/li>\n\n\n\n<li><strong>C\u1ea5u h\u00ecnh b\u1eb1ng Java (Java-based configuration):<\/strong> S\u1eed d\u1ee5ng c\u00e1c l\u1edbp @Configuration v\u00e0 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c @Bean.<\/li>\n<\/ol>\n\n\n\n<p><strong>Trong <\/strong>h\u1ea7u h\u1ebft c\u00e1c d\u1ef1 \u00e1n hi\u1ec7n \u0111\u1ea1i, l\u1ef1a ch\u1ecdn \u01b0a th\u00edch c\u1ee7a t\u00f4i l\u00e0 c\u1ea5u h\u00ecnh b\u1eb1ng Annotation k\u1ebft h\u1ee3p v\u1edbi Java-based. L\u00fd do l\u00e0 n\u00f3 gi\u00fap gi\u1ea3m thi\u1ec3u s\u1ef1 d\u00e0i d\u00f2ng c\u1ee7a XML, gi\u1eef c\u1ea5u h\u00ecnh g\u1ea7n v\u1edbi code logic h\u01a1n, d\u1ec5 d\u00e0ng refactor v\u00e0 t\u1eadn d\u1ee5ng \u0111\u01b0\u1ee3c s\u1ef1 an to\u00e0n ki\u1ec3u (type-safety) c\u1ee7a Java.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-gi\u1ea3i-thich-ba-lo\u1ea1i-dependency-injection-lo\u1ea1i-nao-d\u01b0\u1ee3c-d\u1ed9i-ngu-spring-khuy\u1ebfn-ngh\u1ecb-va-t\u1ea1i-sao\"><strong>4. Gi\u1ea3i th\u00edch ba lo\u1ea1i Dependency Injection. Lo\u1ea1i n\u00e0o \u0111\u01b0\u1ee3c \u0111\u1ed9i ng\u0169 Spring khuy\u1ebfn ngh\u1ecb v\u00e0 t\u1ea1i sao?<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Constructor Injection:<\/strong> Ph\u1ee5 thu\u1ed9c \u0111\u01b0\u1ee3c truy\u1ec1n v\u00e0o qua constructor.<\/li>\n\n\n\n<li><strong>Setter Injection:<\/strong> Ph\u1ee5 thu\u1ed9c \u0111\u01b0\u1ee3c truy\u1ec1n v\u00e0o qua m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c setter.<\/li>\n\n\n\n<li><strong>Field Injection:<\/strong> Ph\u1ee5 thu\u1ed9c \u0111\u01b0\u1ee3c ti\u00eam tr\u1ef1c ti\u1ebfp v\u00e0o tr\u01b0\u1eddng.<\/li>\n<\/ol>\n\n\n\n<p>Lo\u1ea1i \u0111\u01b0\u1ee3c khuy\u1ebfn ngh\u1ecb l\u00e0 Constructor Injection v\u00ec c\u00f3 c\u00e1c \u01b0u \u0111i\u1ec3m sau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u1ea5t bi\u1ebfn (Immutability): Cho ph\u00e9p khai b\u00e1o c\u00e1c tr\u01b0\u1eddng l\u00e0 final.<\/li>\n\n\n\n<li>\u0110\u1ea3m b\u1ea3o s\u1ef1 t\u1ed3n t\u1ea1i: \u0110\u1ed1i t\u01b0\u1ee3ng lu\u00f4n \u0111\u01b0\u1ee3c t\u1ea1o ra v\u1edbi \u0111\u1ea7y \u0111\u1ee7 c\u00e1c ph\u1ee5 thu\u1ed9c c\u1ea7n thi\u1ebft.<\/li>\n\n\n\n<li>D\u1ec5 d\u00e0ng cho vi\u1ec7c test: D\u1ec5 d\u00e0ng kh\u1edfi t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng v\u1edbi c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng gi\u1ea3 (mock).<\/li>\n\n\n\n<li>Tr\u00e1nh ph\u1ee5 thu\u1ed9c v\u00f2ng (Circular Dependencies): Spring s\u1ebd b\u00e1o l\u1ed7i ngay khi kh\u1edfi \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-5-spring-h\u1ed7-tr\u1ee3-nh\u1eefng-bean-scope-nao-gi\u1ea3i-thich-t\u1eebng-lo\u1ea1i\"><strong>5. Spring h\u1ed7 tr\u1ee3 nh\u1eefng bean scope n\u00e0o? Gi\u1ea3i th\u00edch t\u1eebng lo\u1ea1i.<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>singleton:<\/strong> (M\u1eb7c \u0111\u1ecbnh) Ch\u1ec9 m\u1ed9t instance duy nh\u1ea5t cho m\u1ed7i container.<\/li>\n\n\n\n<li><strong>prototype:<\/strong> M\u1ed9t instance m\u1edbi \u0111\u01b0\u1ee3c t\u1ea1o ra m\u1ed7i khi c\u00f3 y\u00eau c\u1ea7u.<\/li>\n\n\n\n<li><strong>request:<\/strong> (Web) M\u1ed9t instance cho m\u1ed7i HTTP request.<\/li>\n\n\n\n<li><strong>session:<\/strong> (Web) M\u1ed9t instance cho m\u1ed7i HTTP session.<\/li>\n\n\n\n<li><strong>application:<\/strong> (Web) M\u1ed9t instance cho ServletContext.<\/li>\n\n\n\n<li><strong>websocket:<\/strong> (Web) M\u1ed9t instance cho WebSocket session.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-6-s\u1ef1-khac-bi\u1ec7t-gi\u1eefa-beanfactory-va-applicationcontext-la-gi\"><strong>6. S\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa BeanFactory v\u00e0 ApplicationContext l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BeanFactory:<\/strong> L\u00e0 giao di\u1ec7n g\u1ed1c, cung c\u1ea5p ch\u1ee9c n\u0103ng c\u01a1 b\u1ea3n c\u1ee7a IoC container, s\u1eed d\u1ee5ng c\u01a1 ch\u1ebf kh\u1edfi t\u1ea1o l\u01b0\u1eddi bi\u1ebfng (lazy initialization).<\/li>\n\n\n\n<li><strong>ApplicationContext:<\/strong> L\u00e0 m\u1ed9t giao di\u1ec7n con c\u1ee7a BeanFactory, cung c\u1ea5p nhi\u1ec1u t\u00ednh n\u0103ng c\u1ea5p cao h\u01a1n (AOP, i18n, event propagation) v\u00e0 m\u1eb7c \u0111\u1ecbnh s\u1eed d\u1ee5ng c\u01a1 ch\u1ebf kh\u1edfi t\u1ea1o s\u1edbm (eager initialization) cho c\u00e1c bean singleton.<\/li>\n<\/ul>\n\n\n\n<p>Trong h\u1ea7u h\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng, ApplicationContext l\u00e0 l\u1ef1a ch\u1ecdn \u0111\u01b0\u1ee3c \u01b0u ti\u00ean.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-7-gi\u1ea3i-thich-toan-b\u1ed9-vong-d\u1eddi-c\u1ee7a-m\u1ed9t-spring-bean\"><strong>7. Gi\u1ea3i th\u00edch to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi c\u1ee7a m\u1ed9t Spring Bean.<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Kh\u1edfi t\u1ea1o (Instantiation):<\/strong> Spring Container kh\u1edfi t\u1ea1o instance c\u1ee7a bean.<\/li>\n\n\n\n<li><strong>Ti\u00eam thu\u1ed9c t\u00ednh (Populate Properties):<\/strong> Spring ti\u00eam c\u00e1c ph\u1ee5 thu\u1ed9c (DI).<\/li>\n\n\n\n<li><strong>Nh\u1eadn bi\u1ebft (Awareness):<\/strong> N\u1ebfu bean implement c\u00e1c interface Aware (nh\u01b0 BeanNameAware), c\u00e1c ph\u01b0\u01a1ng th\u1ee9c t\u01b0\u01a1ng \u1ee9ng s\u1ebd \u0111\u01b0\u1ee3c g\u1ecdi.<\/li>\n\n\n\n<li><strong>X\u1eed l\u00fd tr\u01b0\u1edbc kh\u1edfi t\u1ea1o (Pre-initialization):<\/strong> C\u00e1c BeanPostProcessor \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng (postProcessBeforeInitialization).<\/li>\n\n\n\n<li><strong>Kh\u1edfi t\u1ea1o (Initialization):<\/strong> C\u00e1c callback kh\u1edfi t\u1ea1o \u0111\u01b0\u1ee3c g\u1ecdi (v\u00ed d\u1ee5: afterPropertiesSet() c\u1ee7a InitializingBean ho\u1eb7c init-method).<\/li>\n\n\n\n<li><strong>X\u1eed l\u00fd sau kh\u1edfi t\u1ea1o (Post-initialization):<\/strong> C\u00e1c BeanPostProcessor \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng (postProcessAfterInitialization).<\/li>\n\n\n\n<li><strong>S\u1eb5n s\u00e0ng s\u1eed d\u1ee5ng (Bean is ready).<\/strong><\/li>\n\n\n\n<li><strong>H\u1ee7y (Destruction):<\/strong> Khi container \u0111\u00f3ng l\u1ea1i, c\u00e1c callback h\u1ee7y \u0111\u01b0\u1ee3c g\u1ecdi (v\u00ed d\u1ee5: destroy() c\u1ee7a DisposableBean ho\u1eb7c destroy-method).<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-xay-d\u1ef1ng-\u1ee9ng-d\u1ee5ng-web-va-api-v\u1edbi-spring-mvc\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Xay_dung_ung_dung_Web_va_API_voi_Spring_MVC\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng Web v\u00e0 API v\u1edbi Spring MVC<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Nh\u00f3m c\u00e2u h\u1ecfi n\u00e0y ki\u1ec3m tra k\u1ef9 n\u0103ng x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web, th\u01b0\u1eddng d\u00e0nh cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean <\/em><strong><em>Junior<\/em><\/strong><em> v\u00e0 <\/em><strong><em>Middle<\/em><\/strong><em>.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-8-gi\u1ea3i-thich-ki\u1ebfn-truc-c\u1ee7a-spring-mvc-va-vai-tro-c\u1ee7a-dispatcherservlet\"><strong>8. Gi\u1ea3i th\u00edch ki\u1ebfn tr\u00fac c\u1ee7a Spring MVC v\u00e0 vai tr\u00f2 c\u1ee7a DispatcherServlet.<\/strong><\/h3>\n\n\n\n<p>Ki\u1ebfn tr\u00fac c\u1ee7a Spring MVC xoay quanh m\u1eabu thi\u1ebft k\u1ebf &#8220;Front Controller&#8221;. DispatcherServlet ch\u00ednh l\u00e0 Front Controller. N\u00f3 l\u00e0 servlet trung t\u00e2m, nh\u1eadn t\u1ea5t c\u1ea3 c\u00e1c HTTP request \u0111\u1ebfn v\u00e0 \u0111i\u1ec1u ph\u1ed1i ch\u00fang \u0111\u1ebfn c\u00e1c th\u00e0nh ph\u1ea7n x\u1eed l\u00fd ph\u00f9 h\u1ee3p (HandlerMapping, HandlerAdapter, ViewResolver&#8230;). Vai tr\u00f2 c\u1ee7a n\u00f3 l\u00e0 &#8220;nh\u1ea1c tr\u01b0\u1edfng&#8221; c\u1ee7a to\u00e0n b\u1ed9 lu\u1ed3ng x\u1eed l\u00fd request.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-9-mo-t\u1ea3-lu\u1ed3ng-di-c\u1ee7a-http-request-t\u1eeb-khi-no-d\u01b0\u1ee3c-g\u1eedi-di-cho-d\u1ebfn-khi-no-d\u1ebfn-d\u01b0\u1ee3c-ham-x\u1eed-ly-action-t\u01b0\u01a1ng-\u1ee9ng-trong-controller-\u1edf-phia-server\"><strong>9. M\u00f4 t\u1ea3 lu\u1ed3ng \u0111i c\u1ee7a HTTP request t\u1eeb khi n\u00f3 \u0111\u01b0\u1ee3c g\u1eedi \u0111i cho \u0111\u1ebfn khi n\u00f3 \u0111\u1ebfn \u0111\u01b0\u1ee3c h\u00e0m x\u1eed l\u00fd (action) t\u01b0\u01a1ng \u1ee9ng trong Controller \u1edf ph\u00eda server.<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Client g\u1eedi request.<\/li>\n\n\n\n<li>DispatcherServlet nh\u1eadn request.<\/li>\n\n\n\n<li>DispatcherServlet h\u1ecfi HandlerMapping \u0111\u1ec3 t\u00ecm controller x\u1eed l\u00fd.<\/li>\n\n\n\n<li>DispatcherServlet t\u00ecm m\u1ed9t HandlerAdapter ph\u00f9 h\u1ee3p \u0111\u1ec3 th\u1ef1c thi controller.<\/li>\n\n\n\n<li>HandlerAdapter g\u1ecdi ph\u01b0\u01a1ng th\u1ee9c trong Controller.<\/li>\n\n\n\n<li>Controller x\u1eed l\u00fd v\u00e0 tr\u1ea3 v\u1ec1 ModelAndView (ho\u1eb7c \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c serialize).<\/li>\n\n\n\n<li>ViewResolver (n\u1ebfu c\u00f3) t\u00ecm view t\u01b0\u01a1ng \u1ee9ng.<\/li>\n\n\n\n<li>View \u0111\u01b0\u1ee3c render v\u00e0 tr\u1ea3 v\u1ec1 HTTP response cho client.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-10-s\u1ef1-khac-bi\u1ec7t-gi\u1eefa-controller-va-restcontroller-la-gi\"><strong>10. S\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa @Controller v\u00e0 @RestController l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>@Controller:<\/strong> \u0110\u00e1nh d\u1ea5u m\u1ed9t l\u1edbp l\u00e0 m\u1ed9t controller MVC. C\u00e1c ph\u01b0\u01a1ng th\u1ee9c th\u01b0\u1eddng tr\u1ea3 v\u1ec1 t\u00ean view logic \u0111\u1ec3 ViewResolver x\u1eed l\u00fd.<\/li>\n\n\n\n<li><strong>@RestController:<\/strong> L\u00e0 s\u1ef1 k\u1ebft h\u1ee3p gi\u1eefa @Controller v\u00e0 @ResponseBody. M\u1ecdi ph\u01b0\u01a1ng th\u1ee9c trong l\u1edbp n\u00e0y \u0111\u1ec1u m\u1eb7c \u0111\u1ecbnh serialize gi\u00e1 tr\u1ecb tr\u1ea3 v\u1ec1 th\u00e0nh JSON\/XML v\u00e0 ghi v\u00e0o HTTP response body, th\u00edch h\u1ee3p cho vi\u1ec7c x\u00e2y d\u1ef1ng RESTful API.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-11-gi\u1ea3i-thich-m\u1ee5c-dich-c\u1ee7a-requestmapping-va-cac-annotation-lien-quan\"><strong>11. Gi\u1ea3i th\u00edch m\u1ee5c \u0111\u00edch c\u1ee7a @RequestMapping v\u00e0 c\u00e1c annotation li\u00ean quan.<\/strong><\/h3>\n\n\n\n<p><strong>@RequestMapping<\/strong> d\u00f9ng \u0111\u1ec3 \u00e1nh x\u1ea1 c\u00e1c HTTP request \u0111\u1ebfn c\u00e1c ph\u01b0\u01a1ng th\u1ee9c x\u1eed l\u00fd trong controller. N\u00f3 c\u00f3 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh URL path, HTTP method, consumes\/produces media types&#8230;<\/p>\n\n\n\n<p><strong>C\u00e1c annotation li\u00ean quan:<\/strong> @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping l\u00e0 c\u00e1c annotation vi\u1ebft t\u1eaft chuy\u00ean bi\u1ec7t cho t\u1eebng HTTP method, gi\u00fap code ng\u1eafn g\u1ecdn v\u00e0 r\u00f5 r\u00e0ng h\u01a1n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-12-s\u1ef1-khac-bi\u1ec7t-gi\u1eefa-requestparam-va-pathvariable-la-gi\"><strong>12. S\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa @RequestParam v\u00e0 @PathVariable l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>@PathVariable:<\/strong> Tr\u00edch xu\u1ea5t gi\u00e1 tr\u1ecb t\u1eeb URI path (v\u00ed d\u1ee5: \/users\/{id}).<\/li>\n\n\n\n<li><strong>@RequestParam:<\/strong> Tr\u00edch xu\u1ea5t gi\u00e1 tr\u1ecb t\u1eeb query parameter trong URL (v\u00ed d\u1ee5: \/users\/search?name=john) ho\u1eb7c t\u1eeb form-data.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-13-trong-spring-mvc-co-nh\u1eefng-cach-nao-d\u1ec3-x\u1eed-ly-exception-ngo\u1ea1i-l\u1ec7\"><strong>13. Trong Spring MVC, c\u00f3 nh\u1eefng c\u00e1ch n\u00e0o \u0111\u1ec3 x\u1eed l\u00fd exception (ngo\u1ea1i l\u1ec7)?<\/strong><\/h3>\n\n\n\n<p>C\u00e1c c\u00e1ch x\u1eed l\u00fd exception trong Spring MVC:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>@ResponseStatus:<\/strong> \u0110\u1eb7t tr\u00ean l\u1edbp exception t\u00f9y ch\u1ec9nh \u0111\u1ec3 tr\u1ea3 v\u1ec1 HTTP status code c\u1ed1 \u0111\u1ecbnh.<\/li>\n\n\n\n<li><strong>@ExceptionHandler:<\/strong> \u0110\u1ecbnh ngh\u0129a m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c trong controller \u0111\u1ec3 x\u1eed l\u00fd exception t\u1eeb ch\u00ednh controller \u0111\u00f3.<\/li>\n\n\n\n<li><strong>@ControllerAdvice \/ @RestControllerAdvice:<\/strong> C\u00e1ch \u0111\u01b0\u1ee3c khuy\u1ebfn ngh\u1ecb nh\u1ea5t. T\u1ea1o m\u1ed9t l\u1edbp to\u00e0n c\u1ee5c \u0111\u1ec3 x\u1eed l\u00fd exception t\u1eeb t\u1ea5t c\u1ea3 c\u00e1c controller, gi\u00fap t\u1eadp trung logic x\u1eed l\u00fd l\u1ed7i.<\/li>\n<\/ol>\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<h2 class=\"wp-block-heading\" id=\"h-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-ki\u1ebfn-th\u1ee9c-v\u1ec1-spring-boot\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Kien_thuc_ve_Spring_Boot\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: Ki\u1ebfn th\u1ee9c v\u1ec1 Spring Boot<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Ki\u1ebfn th\u1ee9c v\u1ec1 Spring Boot l\u00e0 y\u00eau c\u1ea7u c\u01a1 b\u1ea3n d\u00e0nh cho level t\u1eeb Junior. Ngo\u00e0i ra, \u1edf c\u1ea5p \u0111\u1ed9 <\/em><strong><em>Middle<\/em><\/strong><em> tr\u1edf l\u00ean, b\u1ea1n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c h\u1ecfi s\u00e2u v\u1ec1 c\u01a1 ch\u1ebf b\u00ean trong Spring Boot.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-14-spring-boot-la-gi-va-\u01b0u-di\u1ec3m-c\u1ee7a-no\"><strong>14. Spring Boot l\u00e0 g\u00ec v\u00e0 \u01b0u \u0111i\u1ec3m c\u1ee7a n\u00f3?<\/strong><\/h3>\n\n\n\n<p>Spring Boot l\u00e0 m\u1ed9t d\u1ef1 \u00e1n gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring \u0111\u1ed9c l\u1eadp, s\u1eb5n s\u00e0ng cho production.<\/p>\n\n\n\n<p><strong>\u01afu \u0111i\u1ec3m:<\/strong> T\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh (Auto-Configuration), cung c\u1ea5p c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh &#8220;c\u00f3 ch\u00ednh ki\u1ebfn&#8221;, h\u1ec7 th\u1ed1ng Starter Dependencies, t\u00edch h\u1ee3p s\u1eb5n server, v\u00e0 c\u00e1c t\u00ednh n\u0103ng production-ready (Actuator).<\/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<h3 class=\"wp-block-heading\" id=\"h-15-m\u1ee5c-dich-c\u1ee7a-annotation-springbootapplication-la-gi\"><strong>15. M\u1ee5c \u0111\u00edch c\u1ee7a annotation @SpringBootApplication l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>@SpringBootApplication l\u00e0 m\u1ed9t annotation ti\u1ec7n \u00edch, k\u1ebft h\u1ee3p ba annotation kh\u00e1c:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>@SpringBootConfiguration: \u0110\u00e1nh d\u1ea5u l\u1edbp l\u00e0 m\u1ed9t l\u1edbp c\u1ea5u h\u00ecnh.<\/li>\n\n\n\n<li>@EnableAutoConfiguration: K\u00edch ho\u1ea1t c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh.<\/li>\n\n\n\n<li>@ComponentScan: Qu\u00e9t c\u00e1c component t\u1eeb package c\u1ee7a l\u1edbp n\u00e0y tr\u1edf xu\u1ed1ng.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-16-spring-boot-starters-la-gi-cho-m\u1ed9t-vi-d\u1ee5\"><strong>16. Spring Boot Starters l\u00e0 g\u00ec? Cho m\u1ed9t v\u00ed d\u1ee5.<\/strong><\/h3>\n\n\n\n<p>Spring Boot Starters l\u00e0 m\u1ed9t b\u1ed9 c\u00e1c dependency descriptor gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n b\u1eb1ng c\u00e1ch g\u1ed9p c\u00e1c dependency th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng c\u00f9ng nhau v\u00e0o m\u1ed9t g\u00f3i duy nh\u1ea5t.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5: spring-boot-starter-web \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-17-spring-profiles-la-gi-va-lam-th\u1ebf-nao-d\u1ec3-s\u1eed-d\u1ee5ng-chung\"><strong>17. Spring Profiles l\u00e0 g\u00ec v\u00e0 l\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 s\u1eed d\u1ee5ng ch\u00fang?<\/strong><\/h3>\n\n\n\n<p>Spring Profiles l\u00e0 c\u01a1 ch\u1ebf cho ph\u00e9p \u0111\u0103ng k\u00fd c\u00e1c bean ho\u1eb7c file c\u1ea5u h\u00ecnh kh\u00e1c nhau cho c\u00e1c m\u00f4i tr\u01b0\u1eddng kh\u00e1c nhau (dev, staging, prod).<\/p>\n\n\n\n<p>C\u00e1ch s\u1eed d\u1ee5ng: D\u00f9ng @Profile(&#8220;dev&#8221;) tr\u00ean bean, ho\u1eb7c t\u1ea1o c\u00e1c file application-{profile}.properties, v\u00e0 k\u00edch ho\u1ea1t profile b\u1eb1ng thu\u1ed9c t\u00ednh spring.profiles.active.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-18-gi\u1ea3i-thich-c\u01a1-ch\u1ebf-t\u1ef1-d\u1ed9ng-c\u1ea5u-hinh-lam-th\u1ebf-nao-d\u1ec3-lo\u1ea1i-tr\u1eeb-m\u1ed9t-c\u1ea5u-hinh\"><strong>18. Gi\u1ea3i th\u00edch c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh. L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 lo\u1ea1i tr\u1eeb m\u1ed9t c\u1ea5u h\u00ecnh?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>C\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh: <\/strong>Spring Boot qu\u00e9t classpath, v\u00e0 d\u1ef1a tr\u00ean c\u00e1c th\u01b0 vi\u1ec7n c\u00f3 m\u1eb7t, n\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh c\u00e1c bean c\u1ea7n thi\u1ebft b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng c\u00e1c l\u1edbp @Configuration c\u00f3 \u0111i\u1ec1u ki\u1ec7n.<\/li>\n\n\n\n<li><strong>C\u00e1ch lo\u1ea1i tr\u1eeb m\u1ed9t c\u1ea5u h\u00ecnh:<\/strong> S\u1eed d\u1ee5ng thu\u1ed9c t\u00ednh exclude c\u1ee7a annotation @SpringBootApplication ho\u1eb7c @EnableAutoConfiguration.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-19-spring-boot-actuator-la-gi-neu-ten-ba-endpoint-h\u1eefu-ich\"><strong>19. Spring Boot Actuator l\u00e0 g\u00ec? N\u00eau t\u00ean ba endpoint h\u1eefu \u00edch.<\/strong><\/h3>\n\n\n\n<p>Spring Boot Actuator gi\u00fap gi\u00e1m s\u00e1t v\u00e0 qu\u1ea3n l\u00fd \u1ee9ng d\u1ee5ng trong m\u00f4i tr\u01b0\u1eddng production th\u00f4ng qua c\u00e1c endpoint.<\/p>\n\n\n\n<p>Ba endpoint h\u1eefu \u00edch:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\/actuator\/health: Ki\u1ec3m tra &#8220;s\u1ee9c kh\u1ecfe&#8221; c\u1ee7a \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li>\/actuator\/info: Hi\u1ec3n th\u1ecb th\u00f4ng tin t\u00f9y ch\u1ec9nh v\u1ec1 \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li>\/actuator\/metrics: Hi\u1ec3n th\u1ecb c\u00e1c ch\u1ec9 s\u1ed1 c\u1ee7a \u1ee9ng d\u1ee5ng.<\/li>\n<\/ol>\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-actuator-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Boot Actuator l\u00e0 g\u00ec: C\u00e1ch qu\u1ea3n l\u00fd \u1ee9ng d\u1ee5ng tr\u00ean production<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-t\u01b0\u01a1ng-tac-d\u1eef-li\u1ec7u-va-tinh-toan-v\u1eb9n-giao-d\u1ecbch\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Tuong_tac_du_lieu_va_tinh_toan_ven_giao_dich\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: T\u01b0\u01a1ng t\u00e1c d\u1eef li\u1ec7u v\u00e0 t\u00ednh to\u00e0n v\u1eb9n giao d\u1ecbch<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Nh\u00f3m c\u00e2u h\u1ecfi n\u00e0y \u0111i s\u00e2u v\u00e0o vi\u1ec7c l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u, th\u01b0\u1eddng d\u00e0nh cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean c\u1ea5p \u0111\u1ed9 <\/em><strong><em>Middle<\/em><\/strong><em>.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-20-spring-data-jpa-la-gi-m\u1ed1i-quan-h\u1ec7-gi\u1eefa-jpa-spring-data-jpa-va-hibernate-la-gi\"><strong>20. Spring Data JPA l\u00e0 g\u00ec? M\u1ed1i quan h\u1ec7 gi\u1eefa JPA, Spring Data JPA v\u00e0 Hibernate l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JPA (Java Persistence API):<\/strong> L\u00e0 m\u1ed9t \u0111\u1eb7c t\u1ea3 (specification) c\u1ee7a Java, \u0111\u1ecbnh ngh\u0129a API chu\u1ea9n cho ORM.<\/li>\n\n\n\n<li><strong>Hibernate:<\/strong> L\u00e0 m\u1ed9t implementation n\u1ed5i ti\u1ebfng c\u1ee7a JPA.<\/li>\n\n\n\n<li><strong>Spring Data JPA:<\/strong> L\u00e0 m\u1ed9t d\u1ef1 \u00e1n con c\u1ee7a Spring, n\u1eb1m tr\u00ean c\u00f9ng JPA. M\u1ee5c ti\u00eau c\u1ee7a n\u00f3 l\u00e0 l\u00e0m cho vi\u1ec7c tri\u1ec3n khai c\u00e1c repository (l\u1edbp truy c\u1eadp d\u1eef li\u1ec7u) tr\u1edf n\u00ean c\u1ef1c k\u1ef3 \u0111\u01a1n gi\u1ea3n, gi\u1ea3m thi\u1ec3u code boilerplate.<\/li>\n<\/ul>\n\n\n\n<p><strong>M\u1ed1i quan h\u1ec7:<\/strong> Spring Data JPA s\u1eed d\u1ee5ng JPA, v\u00e0 JPA \u0111\u01b0\u1ee3c implement b\u1edfi m\u1ed9t provider nh\u01b0 Hibernate.<\/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-data-jpa-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Data JPA: H\u01b0\u1edbng d\u1eabn to\u00e0n t\u1eadp t\u1eeb c\u01a1 b\u1ea3n \u0111\u1ebfn n\u00e2ng cao<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-21-gi\u1ea3i-thich-giao-di\u1ec7n-jparepository-no-cung-c\u1ea5p-nh\u1eefng-l\u1ee3i-ich-gi\"><strong>21. Gi\u1ea3i th\u00edch giao di\u1ec7n JpaRepository. N\u00f3 cung c\u1ea5p nh\u1eefng l\u1ee3i \u00edch g\u00ec?<\/strong><\/h3>\n\n\n\n<p>JpaRepository l\u00e0 m\u1ed9t giao di\u1ec7n trong Spring Data JPA. Khi k\u1ebf th\u1eeba t\u1eeb JpaRepository&lt;T, ID&gt;, b\u1ea1n s\u1ebd t\u1ef1 \u0111\u1ed9ng c\u00f3 \u0111\u01b0\u1ee3c c\u00e1c ph\u01b0\u01a1ng th\u1ee9c CRUD, ph\u00e2n trang v\u00e0 s\u1eafp x\u1ebfp m\u00e0 kh\u00f4ng c\u1ea7n vi\u1ebft implementation.<\/p>\n\n\n\n<p><strong>L\u1ee3i \u00edch:<\/strong> Gi\u1ea3m code boilerplate, cung c\u1ea5p query-method derivation (t\u1ef1 t\u1ea1o truy v\u1ea5n t\u1eeb t\u00ean ph\u01b0\u01a1ng th\u1ee9c).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-22-m\u1ee5c-dich-c\u1ee7a-annotation-transactional-la-gi-level-middle\"><strong>22. M\u1ee5c \u0111\u00edch c\u1ee7a annotation @Transactional l\u00e0 g\u00ec? (Level: Middle)<\/strong><\/h3>\n\n\n\n<p>@Transactional cho ph\u00e9p Spring qu\u1ea3n l\u00fd c\u00e1c giao d\u1ecbch cho m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c\/l\u1edbp. Spring s\u1ebd t\u1ea1o m\u1ed9t proxy, b\u1eaft \u0111\u1ea7u m\u1ed9t giao d\u1ecbch tr\u01b0\u1edbc khi ph\u01b0\u01a1ng th\u1ee9c ch\u1ea1y. N\u1ebfu ph\u01b0\u01a1ng th\u1ee9c th\u00e0nh c\u00f4ng, giao d\u1ecbch \u0111\u01b0\u1ee3c commit. N\u1ebfu c\u00f3 RuntimeException, giao d\u1ecbch s\u1ebd \u0111\u01b0\u1ee3c rollback.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-23-di\u1ec1u-gi-x\u1ea3y-ra-n\u1ebfu-m\u1ed9t-ph\u01b0\u01a1ng-th\u1ee9c-transactional-g\u1ecdi-m\u1ed9t-ph\u01b0\u01a1ng-th\u1ee9c-transactional-khac-trong-cung-m\u1ed9t-l\u1edbp-m\u1ed9t-giao-d\u1ecbch-m\u1edbi-co-d\u01b0\u1ee3c-t\u1ea1o-ra-khong\"><strong>23. \u0110i\u1ec1u g\u00ec x\u1ea3y ra n\u1ebfu m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c @Transactional g\u1ecdi m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c @Transactional kh\u00e1c trong c\u00f9ng m\u1ed9t l\u1edbp? M\u1ed9t giao d\u1ecbch m\u1edbi c\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p><strong>Kh\u00f4ng, m\u1ed9t giao d\u1ecbch m\u1edbi s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c t\u1ea1o ra.<\/strong> Giao d\u1ecbch hi\u1ec7n t\u1ea1i s\u1ebd \u0111\u01b0\u1ee3c ti\u1ebfp t\u1ee5c s\u1eed d\u1ee5ng. L\u00fd do l\u00e0 c\u00e1c l\u1eddi g\u1ecdi ph\u01b0\u01a1ng th\u1ee9c n\u1ed9i b\u1ed9 (this.otherMethod()) kh\u00f4ng \u0111i qua proxy do Spring t\u1ea1o ra, do \u0111\u00f3 proxy kh\u00f4ng c\u00f3 c\u01a1 h\u1ed9i can thi\u1ec7p \u0111\u1ec3 \u00e1p d\u1ee5ng h\u00e0nh vi c\u1ee7a @Transactional.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-24-gi\u1ea3i-thich-v\u1ec1-lan-truy\u1ec1n-giao-d\u1ecbch-transaction-propagation\"><strong>24. Gi\u1ea3i th\u00edch v\u1ec1 lan truy\u1ec1n giao d\u1ecbch (transaction propagation).<\/strong><\/h3>\n\n\n\n<p>Lan truy\u1ec1n giao d\u1ecbch \u0111\u1ecbnh ngh\u0129a c\u00e1ch m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c @Transactional h\u00e0nh x\u1eed khi \u0111\u01b0\u1ee3c g\u1ecdi t\u1eeb m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c kh\u00e1c c\u0169ng c\u00f3 @Transactional:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>REQUIRED (M\u1eb7c \u0111\u1ecbnh):<\/strong> Tham gia giao d\u1ecbch hi\u1ec7n t\u1ea1i; n\u1ebfu kh\u00f4ng c\u00f3, t\u1ea1o giao d\u1ecbch m\u1edbi.<\/li>\n\n\n\n<li><strong>REQUIRES_NEW:<\/strong> Lu\u00f4n b\u1eaft \u0111\u1ea7u m\u1ed9t giao d\u1ecbch m\u1edbi. Giao d\u1ecbch hi\u1ec7n t\u1ea1i (n\u1ebfu c\u00f3) s\u1ebd \u0111\u01b0\u1ee3c t\u1ea1m d\u1eebng.<\/li>\n\n\n\n<li><strong>NESTED:<\/strong> B\u1eaft \u0111\u1ea7u m\u1ed9t giao d\u1ecbch &#8220;l\u1ed3ng nhau&#8221; s\u1eed d\u1ee5ng savepoint. N\u1ebfu rollback, n\u00f3 ch\u1ec9 quay l\u1ea1i savepoint.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-25-m\u1ee9c-d\u1ed9-co-l\u1eadp-giao-d\u1ecbch-transaction-isolation-levels-la-gi\"><strong>25. M\u1ee9c \u0111\u1ed9 c\u00f4 l\u1eadp giao d\u1ecbch (transaction isolation levels) l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>M\u1ee9c \u0111\u1ed9 c\u00f4 l\u1eadp giao d\u1ecbch \u0111\u1ecbnh ngh\u0129a m\u1ee9c \u0111\u1ed9 m\u1ed9t giao d\u1ecbch b\u1ecb \u1ea3nh h\u01b0\u1edfng b\u1edfi c\u00e1c giao d\u1ecbch kh\u00e1c \u0111ang ch\u1ea1y \u0111\u1ed3ng th\u1eddi, gi\u00fap gi\u1ea3i quy\u1ebft c\u00e1c v\u1ea5n \u0111\u1ec1 nh\u01b0 Dirty Read, Non-Repeatable Read, v\u00e0 Phantom Read.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5: V\u1ea5n \u0111\u1ec1 m\u00e0 <strong>REPEATABLE_READ<\/strong> gi\u1ea3i quy\u1ebft so v\u1edbi <strong>READ_COMMITTED<\/strong> l\u00e0 <strong>&#8220;Non-Repeatable Read&#8221;<\/strong>. N\u00f3 \u0111\u1ea3m b\u1ea3o r\u1eb1ng n\u1ebfu m\u1ed9t giao d\u1ecbch \u0111\u1ecdc m\u1ed9t d\u00f2ng d\u1eef li\u1ec7u nhi\u1ec1u l\u1ea7n, n\u00f3 s\u1ebd lu\u00f4n nh\u1eadn \u0111\u01b0\u1ee3c c\u00f9ng m\u1ed9t gi\u00e1 tr\u1ecb, ngay c\u1ea3 khi c\u00e1c giao d\u1ecbch kh\u00e1c \u0111\u00e3 c\u1eadp nh\u1eadt v\u00e0 commit d\u00f2ng \u0111\u00f3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-cac-ch\u1ee7-d\u1ec1-nang-cao-trong-ki\u1ebfn-truc-\u1ee9ng-d\u1ee5ng\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Cac_chu_de_nang_cao_trong_kien_truc_ung_dung\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: C\u00e1c ch\u1ee7 \u0111\u1ec1 n\u00e2ng cao trong ki\u1ebfn tr\u00fac \u1ee9ng d\u1ee5ng<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Nh\u00f3m c\u00e2u h\u1ecfi n\u00e0y \u0111\u00f2i h\u1ecfi s\u1ef1 hi\u1ec3u bi\u1ebft s\u00e2u s\u1eafc, th\u01b0\u1eddng d\u00e0nh cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean c\u1ea5p \u0111\u1ed9 <\/em><strong><em>Mid-Senior<\/em><\/strong><em> v\u00e0 <\/em><strong><em>Senior<\/em><\/strong><em>.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-26-l\u1eadp-trinh-h\u01b0\u1edbng-khia-c\u1ea1nh-aop-la-gi-no-gi\u1ea3i-quy\u1ebft-v\u1ea5n-d\u1ec1-gi\"><strong>26. L\u1eadp tr\u00ecnh H\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP) l\u00e0 g\u00ec? N\u00f3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AOP <\/strong>l\u00e0 m\u1ed9t m\u00f4 h\u00ecnh l\u1eadp tr\u00ecnh gi\u00fap t\u0103ng t\u00ednh module h\u00f3a b\u1eb1ng c\u00e1ch cho ph\u00e9p t\u00e1ch bi\u1ec7t c\u00e1c m\u1ed1i quan t\u00e2m xuy\u00ean su\u1ed1t (cross-cutting concerns) nh\u01b0 logging, transaction, security.<\/li>\n\n\n\n<li><strong>V\u1ea5n \u0111\u1ec1 gi\u1ea3i quy\u1ebft:<\/strong> AOP gi\u00fap \u0111\u1ecbnh ngh\u0129a c\u00e1c logic n\u00e0y \u1edf m\u1ed9t n\u01a1i duy nh\u1ea5t (Aspect) v\u00e0 \u00e1p d\u1ee5ng ch\u00fang v\u00e0o c\u00e1c \u0111i\u1ec3m c\u1ea7n thi\u1ebft, tr\u00e1nh l\u1eb7p l\u1ea1i code v\u00e0 l\u00e0m cho code nghi\u1ec7p v\u1ee5 s\u1ea1ch h\u01a1n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-27-gi\u1ea3i-thich-cac-khai-ni\u1ec7m-chinh-trong-aop\"><strong>27. Gi\u1ea3i th\u00edch c\u00e1c kh\u00e1i ni\u1ec7m ch\u00ednh trong AOP.<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Aspect:<\/strong> M\u1ed9t module ch\u1ee9a logic c\u1ee7a m\u1ed9t cross-cutting concern.<\/li>\n\n\n\n<li><strong>Join Point:<\/strong> M\u1ed9t \u0111i\u1ec3m trong qu\u00e1 tr\u00ecnh th\u1ef1c thi ch\u01b0\u01a1ng tr\u00ecnh (v\u00ed d\u1ee5: vi\u1ec7c th\u1ef1c thi m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c).<\/li>\n\n\n\n<li><strong>Advice:<\/strong> H\u00e0nh \u0111\u1ed9ng \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n b\u1edfi m\u1ed9t aspect t\u1ea1i m\u1ed9t join point (v\u00ed d\u1ee5: code logging).<\/li>\n\n\n\n<li><strong>Pointcut:<\/strong> M\u1ed9t bi\u1ec3u th\u1ee9c \u0111\u1ec3 ch\u1ecdn ra c\u00e1c join point m\u00e0 advice s\u1ebd \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng.<\/li>\n\n\n\n<li><strong>Weaving:<\/strong> Qu\u00e1 tr\u00ecnh li\u00ean k\u1ebft c\u00e1c aspect v\u1edbi c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng m\u1ee5c ti\u00eau (th\u01b0\u1eddng t\u1ea1i runtime).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-28-cac-lo\u1ea1i-advice-khac-nhau-trong-spring-aop-la-gi\"><strong>28. C\u00e1c lo\u1ea1i advice kh\u00e1c nhau trong Spring AOP l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>@Before: Th\u1ef1c thi tr\u01b0\u1edbc join point.<\/li>\n\n\n\n<li>@AfterReturning: Th\u1ef1c thi sau khi join point ho\u00e0n th\u00e0nh b\u00ecnh th\u01b0\u1eddng.<\/li>\n\n\n\n<li>@AfterThrowing: Th\u1ef1c thi n\u1ebfu join point n\u00e9m ra exception.<\/li>\n\n\n\n<li>@After: Th\u1ef1c thi sau khi join point k\u1ebft th\u00fac (b\u1ea5t k\u1ec3 th\u00e0nh c\u00f4ng hay th\u1ea5t b\u1ea1i).<\/li>\n\n\n\n<li>@Around: Advice m\u1ea1nh m\u1ebd nh\u1ea5t, bao quanh join point, cho ph\u00e9p th\u1ef1c thi logic tr\u01b0\u1edbc v\u00e0 sau khi join point ch\u1ea1y.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-29-authentication-va-authorization-la-gi-spring-security-x\u1eed-ly-chung-nh\u01b0-th\u1ebf-nao\"><strong>29. Authentication v\u00e0 Authorization l\u00e0 g\u00ec? Spring Security x\u1eed l\u00fd ch\u00fang nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Authentication (X\u00e1c th\u1ef1c):<\/strong> L\u00e0 qu\u00e1 tr\u00ecnh x\u00e1c \u0111\u1ecbnh &#8220;b\u1ea1n l\u00e0 ai&#8221;.<\/li>\n\n\n\n<li><strong>Authorization (Ph\u00e2n quy\u1ec1n):<\/strong> L\u00e0 qu\u00e1 tr\u00ecnh x\u00e1c \u0111\u1ecbnh &#8220;b\u1ea1n \u0111\u01b0\u1ee3c ph\u00e9p l\u00e0m g\u00ec&#8221;.<\/li>\n<\/ul>\n\n\n\n<p>Spring Security s\u1eed d\u1ee5ng AuthenticationManager v\u00e0 c\u00e1c AuthenticationProvider \u0111\u1ec3 x\u00e1c th\u1ef1c. Sau \u0111\u00f3, n\u00f3 s\u1eed d\u1ee5ng SecurityContext v\u00e0 c\u00e1c c\u1ea5u h\u00ecnh \u0111\u1ec3 th\u1ef1c hi\u1ec7n ph\u00e2n quy\u1ec1n d\u1ef1a tr\u00ean GrantedAuthority.<\/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-security-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring security: Kh\u00e1m ph\u00e1 framework b\u1ea3o m\u1eadt h\u00e0ng \u0111\u1ea7u cho \u1ee9ng d\u1ee5ng Java<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-30-gi\u1ea3i-thich-vai-tro-c\u1ee7a-securityfilterchain-trong-spring-security\"><strong>30. Gi\u1ea3i th\u00edch vai tr\u00f2 c\u1ee7a SecurityFilterChain trong Spring Security.<\/strong><\/h3>\n\n\n\n<p>SecurityFilterChain l\u00e0 m\u1ed9t chu\u1ed7i c\u00e1c b\u1ed9 l\u1ecdc (filters) m\u00e0 m\u1ed7i HTTP request ph\u1ea3i \u0111i qua. M\u1ed7i b\u1ed9 l\u1ecdc c\u00f3 m\u1ed9t tr\u00e1ch nhi\u1ec7m c\u1ee5 th\u1ec3 (x\u1eed l\u00fd login, ph\u00e2n quy\u1ec1n&#8230;). B\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a nhi\u1ec1u SecurityFilterChain bean, m\u1ed7i bean \u00e1p d\u1ee5ng cho m\u1ed9t nh\u00f3m URL pattern kh\u00e1c nhau, cho ph\u00e9p c\u1ea5u h\u00ecnh b\u1ea3o m\u1eadt r\u1ea5t linh ho\u1ea1t.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-31-csrf-la-gi-va-spring-security-b\u1ea3o-v\u1ec7-ch\u1ed1ng-l\u1ea1i-no-nh\u01b0-th\u1ebf-nao\"><strong>31. CSRF l\u00e0 g\u00ec v\u00e0 Spring Security b\u1ea3o v\u1ec7 ch\u1ed1ng l\u1ea1i n\u00f3 nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p><strong>CSRF (Cross-Site Request Forgery)<\/strong> l\u00e0 m\u1ed9t ki\u1ec3u t\u1ea5n c\u00f4ng bu\u1ed9c ng\u01b0\u1eddi d\u00f9ng \u0111\u00e3 \u0111\u0103ng nh\u1eadp th\u1ef1c hi\u1ec7n m\u1ed9t h\u00e0nh \u0111\u1ed9ng kh\u00f4ng mong mu\u1ed1n.<\/p>\n\n\n\n<p>Spring Security s\u1eed d\u1ee5ng <strong>Synchronizer Token Pattern<\/strong>, t\u1ea1o ra m\u1ed9t token CSRF ng\u1eabu nhi\u00ean, l\u01b0u trong session v\u00e0 ch\u00e8n v\u00e0o form. Khi submit, token n\u00e0y \u0111\u01b0\u1ee3c g\u1eedi v\u00e0 so s\u00e1nh \u1edf ph\u00eda server \u0111\u1ec3 x\u00e1c th\u1ef1c request.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-32-b\u1ea1n-s\u1ebd-b\u1ea3o-m\u1eadt-m\u1ed9t-rest-api-nh\u01b0-th\u1ebf-nao\"><strong>32. B\u1ea1n s\u1ebd b\u1ea3o m\u1eadt m\u1ed9t REST API nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p>T\u00f4i th\u01b0\u1eddng s\u1eed d\u1ee5ng c\u00e1c c\u01a1 ch\u1ebf kh\u00f4ng tr\u1ea1ng th\u00e1i (stateless) nh\u01b0 JWT (JSON Web Tokens) ho\u1eb7c OAuth2.<\/p>\n\n\n\n<p>S\u1ef1 kh\u00e1c bi\u1ec7t so v\u1edbi web truy\u1ec1n th\u1ed1ng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Web truy\u1ec1n th\u1ed1ng th\u01b0\u1eddng d\u00f9ng session (stateful), API th\u01b0\u1eddng stateless.<\/li>\n\n\n\n<li>B\u1ea3o v\u1ec7 CSRF d\u1ef1a tr\u00ean session, th\u01b0\u1eddng b\u1ecb v\u00f4 hi\u1ec7u h\u00f3a cho API stateless.<\/li>\n\n\n\n<li>API th\u01b0\u1eddng c\u1ea7n c\u1ea5u h\u00ecnh CORS (Cross-Origin Resource Sharing).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-33-lam-th\u1ebf-nao-d\u1ec3-kich-ho\u1ea1t-caching-trong-spring\"><strong>33. L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 k\u00edch ho\u1ea1t caching trong Spring?<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 k\u00edch ho\u1ea1t caching, c\u1ea7n th\u00eam annotation @EnableCaching v\u00e0o m\u1ed9t l\u1edbp @Configuration v\u00e0 cung c\u1ea5p m\u1ed9t CacheManager bean. C\u00e1c annotation ph\u1ed5 bi\u1ebfn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>@Cacheable:<\/strong> N\u1ebfu c\u00f3 trong cache, tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3; n\u1ebfu kh\u00f4ng, th\u1ef1c thi ph\u01b0\u01a1ng th\u1ee9c v\u00e0 l\u01b0u k\u1ebft qu\u1ea3 v\u00e0o cache.<\/li>\n\n\n\n<li><strong>@CachePut:<\/strong> Lu\u00f4n th\u1ef1c thi ph\u01b0\u01a1ng th\u1ee9c v\u00e0 c\u1eadp nh\u1eadt gi\u00e1 tr\u1ecb trong cache.<\/li>\n\n\n\n<li><strong>@CacheEvict:<\/strong> X\u00f3a m\u1ed9t ho\u1eb7c nhi\u1ec1u entry kh\u1ecfi cache.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-34-m\u1ed9t-s\u1ed1-chi\u1ebfn-l\u01b0\u1ee3c-caching-ph\u1ed5-bi\u1ebfn-la-gi\"><strong>34. M\u1ed9t s\u1ed1 chi\u1ebfn l\u01b0\u1ee3c caching ph\u1ed5 bi\u1ebfn l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>3 chi\u1ebfn l\u01b0\u1ee3c caching ph\u1ed5 bi\u1ebfn:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-cache-aside-lazy-loading\"><strong>Cache-Aside (Lazy Loading)<\/strong><\/h4>\n\n\n\n<p>\u0110\u00e2y l\u00e0 chi\u1ebfn l\u01b0\u1ee3c ph\u1ed5 bi\u1ebfn v\u00e0 linh ho\u1ea1t nh\u1ea5t. V\u1edbi Cache-Aside, <strong>\u1ee9ng d\u1ee5ng ch\u1ecbu tr\u00e1ch nhi\u1ec7m ch\u00ednh<\/strong> trong vi\u1ec7c qu\u1ea3n l\u00fd cache.<\/p>\n\n\n\n<p><strong>C\u00e1ch ho\u1ea1t \u0111\u1ed9ng:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Khi c\u1ea7n d\u1eef li\u1ec7u, \u1ee9ng d\u1ee5ng s\u1ebd t\u00ecm trong <strong>cache<\/strong> tr\u01b0\u1edbc.<\/li>\n\n\n\n<li>N\u1ebfu c\u00f3 (Cache Hit), d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1 ngay.<\/li>\n\n\n\n<li>N\u1ebfu kh\u00f4ng c\u00f3 (Cache Miss), \u1ee9ng d\u1ee5ng s\u1ebd t\u1ef1 m\u00ecnh truy v\u1ea5n <strong>database<\/strong> \u0111\u1ec3 l\u1ea5y d\u1eef li\u1ec7u.<\/li>\n\n\n\n<li>Sau \u0111\u00f3, \u1ee9ng d\u1ee5ng s\u1ebd ghi d\u1eef li\u1ec7u n\u00e0y v\u00e0o <strong>cache<\/strong> \u0111\u1ec3 c\u00e1c l\u1ea7n g\u1ecdi sau c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng.<\/li>\n\n\n\n<li>Cu\u1ed1i c\u00f9ng, tr\u1ea3 d\u1eef li\u1ec7u cho client.<\/li>\n<\/ul>\n\n\n\n<p><strong>\u01afu &#8211; nh\u01b0\u1ee3c \u0111i\u1ec3m:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u01afu \u0111i\u1ec3m&nbsp;<\/strong><\/td><td><strong>Kh\u1ea3 n\u0103ng ph\u1ee5c h\u1ed3i cao:<\/strong> N\u1ebfu cache b\u1ecb l\u1ed7i, h\u1ec7 th\u1ed1ng v\u1eabn c\u00f3 th\u1ec3 ho\u1ea1t \u0111\u1ed9ng (d\u00f9 ch\u1eadm h\u01a1n) b\u1eb1ng c\u00e1ch \u0111\u1ecdc tr\u1ef1c ti\u1ebfp t\u1eeb database.<strong>Linh ho\u1ea1t:<\/strong> D\u1eef li\u1ec7u trong cache v\u00e0 database kh\u00f4ng nh\u1ea5t thi\u1ebft ph\u1ea3i gi\u1ed1ng h\u1ec7t nhau. Ta c\u00f3 th\u1ec3 cache m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u00e3 \u0111\u01b0\u1ee3c t\u1ed1i \u01b0u cho vi\u1ec7c hi\u1ec3n th\u1ecb (DTO).<\/td><\/tr><tr><td><strong>Nh\u01b0\u1ee3c \u0111i\u1ec3m<\/strong><\/td><td><strong>D\u1eef li\u1ec7u c\u00f3 th\u1ec3 b\u1ecb c\u0169 (Stale Data):<\/strong> N\u1ebfu c\u00f3 m\u1ed9t ti\u1ebfn tr\u00ecnh kh\u00e1c c\u1eadp nh\u1eadt th\u1eb3ng v\u00e0o database, cache s\u1ebd kh\u00f4ng bi\u1ebft v\u00e0 tr\u1edf n\u00ean l\u1ed7i th\u1eddi.\u0110\u1ed9 tr\u1ec5 \u1edf l\u1ea7n \u0111\u1ecdc \u0111\u1ea7u ti\u00ean: Request \u0111\u1ea7u ti\u00ean cho m\u1ed9t d\u1eef li\u1ec7u ch\u01b0a \u0111\u01b0\u1ee3c cache s\u1ebd lu\u00f4n ch\u1eadm h\u01a1n v\u00ec ph\u1ea3i th\u1ef1c hi\u1ec7n c\u1ea3 thao t\u00e1c \u0111\u1ecdc t\u1eeb DB v\u00e0 ghi v\u00e0o cache.<strong>Code ph\u1ee9c t\u1ea1p h\u01a1n: <\/strong>Logic ki\u1ec3m tra cache v\u00e0 \u0111\u1ecdc t\u1eeb DB th\u01b0\u1eddng b\u1ecb l\u1eb7p l\u1ea1i trong m\u00e3 ngu\u1ed3n \u1ee9ng d\u1ee5ng.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Khi n\u00e0o n\u00ean d\u00f9ng:<\/strong> R\u1ea5t ph\u00f9 h\u1ee3p cho c\u00e1c h\u1ec7 th\u1ed1ng <strong>thi\u00ean v\u1ec1 \u0111\u1ecdc (read-heavy)<\/strong> v\u00e0 c\u00f3 th\u1ec3 ch\u1ea5p nh\u1eadn m\u1ed9t \u0111\u1ed9 tr\u1ec5 nh\u1ecf trong vi\u1ec7c c\u1eadp nh\u1eadt d\u1eef li\u1ec7u (v\u00ed d\u1ee5: danh s\u00e1ch s\u1ea3n ph\u1ea9m, b\u00e0i vi\u1ebft blog).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-read-through\"><strong>Read-Through<\/strong><\/h4>\n\n\n\n<p>Cache provider ch\u1ecbu tr\u00e1ch nhi\u1ec7m \u0111\u1ecdc t\u1eeb DB n\u1ebfu cache miss.<\/p>\n\n\n\n<p><strong>C\u00e1ch ho\u1ea1t \u0111\u1ed9ng:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u1ee8ng d\u1ee5ng ch\u1ec9 c\u1ea7n h\u1ecfi <strong>cache<\/strong>.<\/li>\n\n\n\n<li>N\u1ebfu cache c\u00f3 d\u1eef li\u1ec7u, n\u00f3 s\u1ebd tr\u1ea3 v\u1ec1.<\/li>\n\n\n\n<li>N\u1ebfu kh\u00f4ng c\u00f3, <strong>ch\u00ednh cache provider<\/strong> s\u1ebd t\u1ef1 \u0111\u1ed9ng k\u1ebft n\u1ed1i t\u1edbi database, l\u1ea5y d\u1eef li\u1ec7u, l\u01b0u v\u00e0o ch\u00ednh n\u00f3 r\u1ed3i m\u1edbi tr\u1ea3 v\u1ec1 cho \u1ee9ng d\u1ee5ng.<\/li>\n<\/ol>\n\n\n\n<p><strong>\u01afu &#8211; nh\u01b0\u1ee3c \u0111i\u1ec3m:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u01afu \u0111i\u1ec3m&nbsp;<\/strong><\/td><td><strong>M\u00e3 ngu\u1ed3n \u1ee9ng d\u1ee5ng s\u1ea1ch s\u1ebd: <\/strong>Logic \u0111\u1ecdc d\u1eef li\u1ec7u t\u1eeb DB \u0111\u01b0\u1ee3c tr\u1eebu t\u01b0\u1ee3ng h\u00f3a ho\u00e0n to\u00e0n, \u1ee9ng d\u1ee5ng kh\u00f4ng c\u1ea7n quan t\u00e2m \u0111\u1ebfn n\u00f3.<\/td><\/tr><tr><td><strong>Nh\u01b0\u1ee3c \u0111i\u1ec3m<\/strong><\/td><td><strong>K\u00e9m linh ho\u1ea1t:<\/strong> Th\u01b0\u1eddng y\u00eau c\u1ea7u d\u1eef li\u1ec7u trong cache v\u00e0 DB c\u00f3 c\u1ea5u tr\u00fac gi\u1ed1ng nhau.Ph\u1ee5 thu\u1ed9c v\u00e0o cache provider: C\u1ea7n c\u1ea5u h\u00ecnh v\u00e0 ph\u1ee5 thu\u1ed9c v\u00e0o t\u00ednh n\u0103ng c\u1ee7a th\u01b0 vi\u1ec7n cache (v\u00ed d\u1ee5: Hazelcast, EhCache).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Khi n\u00e0o n\u00ean d\u00f9ng:<\/strong> Khi b\u1ea1n mu\u1ed1n m\u1ed9t gi\u1ea3i ph\u00e1p caching g\u1ecdn g\u00e0ng, t\u00e1ch bi\u1ec7t ho\u00e0n to\u00e0n logic cache ra kh\u1ecfi logic nghi\u1ec7p v\u1ee5.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-write-through\"><strong>Write-Through<\/strong><\/h4>\n\n\n\n<p>Cache provider ch\u1ecbu tr\u00e1ch nhi\u1ec7m ghi \u0111\u1ed3ng b\u1ed9 xu\u1ed1ng DB.<\/p>\n\n\n\n<p>L\u1edbp tr\u1eebu t\u01b0\u1ee3ng caching m\u1eb7c \u0111\u1ecbnh c\u1ee7a Spring (@Cacheable) g\u1ea7n gi\u1ed1ng nh\u1ea5t v\u1edbi chi\u1ebfn l\u01b0\u1ee3c <strong>Cache-Aside<\/strong>.<\/p>\n\n\n\n<p><strong>C\u00e1ch ho\u1ea1t \u0111\u1ed9ng:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Khi \u1ee9ng d\u1ee5ng ghi d\u1eef li\u1ec7u, n\u00f3 s\u1ebd ghi v\u00e0o <strong>cache<\/strong>.<\/li>\n\n\n\n<li>Ngay sau \u0111\u00f3, <strong>cache provider s\u1ebd ghi \u0111\u1ed3ng b\u1ed9<\/strong> d\u1eef li\u1ec7u \u0111\u00f3 xu\u1ed1ng <strong>database<\/strong>.<\/li>\n\n\n\n<li>Thao t\u00e1c ch\u1ec9 ho\u00e0n t\u1ea5t khi c\u1ea3 hai n\u01a1i \u0111\u1ec1u \u0111\u00e3 \u0111\u01b0\u1ee3c ghi th\u00e0nh c\u00f4ng.<\/li>\n<\/ol>\n\n\n\n<p><strong>\u01afu &#8211; nh\u01b0\u1ee3c \u0111i\u1ec3m:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>\u01afu \u0111i\u1ec3m&nbsp;<\/strong><\/td><td><strong>T\u00ednh nh\u1ea5t qu\u00e1n d\u1eef li\u1ec7u r\u1ea5t cao: <\/strong>D\u1eef li\u1ec7u trong cache v\u00e0 database lu\u00f4n \u0111\u01b0\u1ee3c \u0111\u1ed3ng b\u1ed9. D\u1eef li\u1ec7u \u0111\u1ecdc ra ngay sau khi ghi lu\u00f4n l\u00e0 d\u1eef li\u1ec7u m\u1edbi nh\u1ea5t.<\/td><\/tr><tr><td><strong>Nh\u01b0\u1ee3c \u0111i\u1ec3m<\/strong><\/td><td><strong>T\u0103ng \u0111\u1ed9 tr\u1ec5 khi ghi (Write Latency): <\/strong>Thao t\u00e1c ghi s\u1ebd ch\u1eadm h\u01a1n v\u00ec ph\u1ea3i th\u1ef1c hi\u1ec7n ghi \u1edf hai n\u01a1i.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Khi n\u00e0o n\u00ean d\u00f9ng:<\/strong> L\u00fd t\u01b0\u1edfng cho c\u00e1c d\u1eef li\u1ec7u quan tr\u1ecdng, y\u00eau c\u1ea7u ph\u1ea3i lu\u00f4n ch\u00ednh x\u00e1c v\u00e0 th\u01b0\u1eddng \u0111\u01b0\u1ee3c \u0111\u1ecdc ngay sau khi ghi (v\u00ed d\u1ee5: th\u00f4ng tin t\u00e0i kho\u1ea3n ng\u01b0\u1eddi d\u00f9ng, s\u1ed1 d\u01b0 v\u00ed).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-35-l\u1edbp-tr\u1eebu-t\u01b0\u1ee3ng-caching-m\u1eb7c-d\u1ecbnh-la-gi\"><strong>35. L\u1edbp tr\u1eebu t\u01b0\u1ee3ng caching m\u1eb7c \u0111\u1ecbnh l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>L\u1edbp tr\u1eebu t\u01b0\u1ee3ng caching c\u1ee7a Spring \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a b\u1edfi hai interface ch\u00ednh: <strong>CacheManager<\/strong> v\u00e0 <strong>Cache<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CacheManager<\/strong>: Qu\u1ea3n l\u00fd c\u00e1c cache.<\/li>\n\n\n\n<li><strong>Cache<\/strong>: \u0110\u1ea1i di\u1ec7n cho m\u1ed9t cache c\u1ee5 th\u1ec3, n\u01a1i b\u1ea1n c\u00f3 th\u1ec3 l\u01b0u tr\u1eef (put), truy xu\u1ea5t (get), v\u00e0 x\u00f3a (evict) d\u1eef li\u1ec7u.<\/li>\n<\/ul>\n\n\n\n<p>Spring kh\u00f4ng cung c\u1ea5p m\u1ed9t c\u01a1 ch\u1ebf caching th\u1ef1c s\u1ef1 trong l\u00f5i c\u1ee7a n\u00f3. Tuy nhi\u00ean, n\u1ebfu b\u1ea1n kh\u00f4ng c\u1ea5u h\u00ecnh b\u1ea5t k\u1ef3 nh\u00e0 cung c\u1ea5p n\u00e0o (nh\u01b0 Redis, EhCache), Spring Boot s\u1ebd t\u1ef1 \u0111\u1ed9ng s\u1eed d\u1ee5ng <strong>ConcurrentMapCacheManager<\/strong>, m\u1ed9t implementation \u0111\u01a1n gi\u1ea3n d\u00f9ng <strong>ConcurrentHashMap<\/strong> \u0111\u1ec3 l\u01b0u tr\u1eef cache trong b\u1ed9 nh\u1edb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cau-h\u1ecfi-ph\u1ecfng-v\u1ea5n-spring-spring-trong-b\u1ed1i-c\u1ea3nh-cloud-native-hi\u1ec7n-d\u1ea1i\"><span class=\"ez-toc-section\" id=\"Cau_hoi_phong_van_Spring_Spring_trong_boi_canh_Cloud-Native_hien_dai\"><\/span><strong>C\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring: Spring trong b\u1ed1i c\u1ea3nh Cloud-Native hi\u1ec7n \u0111\u1ea1i<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><em>Nh\u00f3m c\u00e2u h\u1ecfi n\u00e0y t\u1eadp trung v\u00e0o c\u00e1c ki\u1ebfn tr\u00fac ph\u1ee9c t\u1ea1p, th\u01b0\u1eddng d\u00e0nh cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean <\/em><strong><em>Senior<\/em><\/strong><em> v\u00e0 <\/em><strong><em>Architect<\/em><\/strong><em>.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-36-thach-th\u1ee9c-c\u1ee7a-microservices-va-spring-cloud-gi\u1ea3i-quy\u1ebft-chung-nh\u01b0-th\u1ebf-nao\"><strong>36. Th\u00e1ch th\u1ee9c c\u1ee7a microservices v\u00e0 Spring Cloud gi\u1ea3i quy\u1ebft ch\u00fang nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p>Th\u00e1ch th\u1ee9c: Service Discovery, Configuration Management, Resilience, API Gateway, Distributed Tracing.<\/p>\n\n\n\n<p>Spring Cloud gi\u1ea3i quy\u1ebft: Cung c\u1ea5p c\u00e1c c\u00f4ng c\u1ee5 nh\u01b0 Eureka (Service Discovery), Config Server, Circuit Breaker, API Gateway, Sleuth (Tracing).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-37-api-gateway-la-gi-va-t\u1ea1i-sao-no-quan-tr\u1ecdng-trong-ki\u1ebfn-truc-microservices\"><strong>37. API Gateway l\u00e0 g\u00ec v\u00e0 t\u1ea1i sao n\u00f3 quan tr\u1ecdng trong ki\u1ebfn tr\u00fac microservices?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>API Gateway:<\/strong> L\u00e0 m\u1ed9t server \u0111\u00f3ng vai tr\u00f2 l\u00e0 \u0111i\u1ec3m v\u00e0o duy nh\u1ea5t cho t\u1ea5t c\u1ea3 c\u00e1c request t\u1eeb client \u0111\u1ebfn h\u1ec7 th\u1ed1ng microservices.<\/li>\n\n\n\n<li><strong>M\u1ee5c \u0111\u00edch:<\/strong> \u0110\u01a1n gi\u1ea3n h\u00f3a client, routing, x\u1eed l\u00fd c\u00e1c cross-cutting concerns (authentication, rate limiting), v\u00e0 response aggregation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-38-gi\u1ea3i-thich-m\u1eabu-thi\u1ebft-k\u1ebf-circuit-breaker-la-gi-t\u1ea1i-sao-no-quan-tr\u1ecdng\"><strong>38. Gi\u1ea3i th\u00edch m\u1eabu thi\u1ebft k\u1ebf Circuit Breaker l\u00e0 g\u00ec, t\u1ea1i sao n\u00f3 quan tr\u1ecdng?<\/strong><\/h3>\n\n\n\n<p>L\u00e0 m\u1ed9t m\u1eabu thi\u1ebft k\u1ebf d\u00f9ng \u0111\u1ec3 ng\u0103n ch\u1eb7n l\u1ed7i lan truy\u1ec1n (cascading failures). N\u00f3 c\u00f3 ba tr\u1ea1ng th\u00e1i: CLOSED (cho ph\u00e9p request), OPEN (t\u1eeb ch\u1ed1i request ngay l\u1eadp t\u1ee9c), v\u00e0 HALF-OPEN (th\u1eed cho m\u1ed9t v\u00e0i request \u0111i qua \u0111\u1ec3 ki\u1ec3m tra service \u0111\u00e3 ph\u1ee5c h\u1ed3i ch\u01b0a).<\/p>\n\n\n\n<p>N\u00f3 gi\u00fap h\u1ec7 th\u1ed1ng nhanh ch\u00f3ng th\u1ea5t b\u1ea1i (fail-fast) v\u00e0 t\u0103ng t\u00ednh \u1ed5n \u0111\u1ecbnh.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-39-l\u1eadp-trinh-ph\u1ea3n-\u1ee9ng-reactive-programming-la-gi-spring-h\u1ed7-tr\u1ee3-reactive-programming-nh\u01b0-th\u1ebf-nao\"><strong>39. L\u1eadp tr\u00ecnh Ph\u1ea3n \u1ee9ng (Reactive Programming) l\u00e0 g\u00ec? Spring h\u1ed7 tr\u1ee3 Reactive Programming nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p>Reactive Programming l\u00e0 m\u1ed9t m\u00f4 h\u00ecnh l\u1eadp tr\u00ecnh xoay quanh c\u00e1c <strong>lu\u1ed3ng d\u1eef li\u1ec7u b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/strong> (asynchronous data streams) v\u00e0 vi\u1ec7c lan truy\u1ec1n s\u1ef1 thay \u0111\u1ed5i.<\/p>\n\n\n\n<p>\u0110i\u1ec3m kh\u00e1c bi\u1ec7t ch\u00ednh so v\u1edbi l\u1eadp tr\u00ecnh truy\u1ec1n th\u1ed1ng (imperative):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L\u1eadp tr\u00ecnh truy\u1ec1n th\u1ed1ng (Blocking): B\u1ea1n vi\u1ebft code \u0111\u1ec3 y\u00eau c\u1ea7u d\u1eef li\u1ec7u v\u00e0 ph\u1ea3i ch\u1edd \u0111\u1ee3i (block) cho \u0111\u1ebfn khi nh\u1eadn \u0111\u01b0\u1ee3c k\u1ebft qu\u1ea3 r\u1ed3i m\u1edbi x\u1eed l\u00fd ti\u1ebfp. Gi\u1ed1ng nh\u01b0 b\u1ea1n g\u1ecdi \u0111i\u1ec7n tho\u1ea1i v\u00e0 ph\u1ea3i gi\u1eef m\u00e1y ch\u1edd ng\u01b0\u1eddi kia tr\u1ea3 l\u1eddi.<\/li>\n\n\n\n<li>L\u1eadp tr\u00ecnh ph\u1ea3n \u1ee9ng (Non-blocking): B\u1ea1n \u0111\u1ecbnh ngh\u0129a m\u1ed9t chu\u1ed7i c\u00e1c h\u00e0nh \u0111\u1ed9ng s\u1ebd \u0111\u01b0\u1ee3c th\u1ef1c thi khi d\u1eef li\u1ec7u \u0111\u1ebfn. H\u1ec7 th\u1ed1ng s\u1ebd \u0111\u01b0\u1ee3c th\u00f4ng b\u00e1o khi c\u00f3 d\u1eef li\u1ec7u \u0111\u1ec3 x\u1eed l\u00fd m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i ch\u1edd \u0111\u1ee3i. Gi\u1ed1ng nh\u01b0 b\u1ea1n g\u1eedi m\u1ed9t tin nh\u1eafn v\u00e0 s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c th\u00f4ng b\u00e1o khi c\u00f3 ng\u01b0\u1eddi tr\u1ea3 l\u1eddi, trong th\u1eddi gian \u0111\u00f3 b\u1ea1n c\u00f3 th\u1ec3 l\u00e0m vi\u1ec7c kh\u00e1c.<\/li>\n<\/ul>\n\n\n\n<p>M\u00f4 h\u00ecnh n\u00e0y \u0111\u1eb7c bi\u1ec7t hi\u1ec7u qu\u1ea3 trong vi\u1ec7c x\u00e2y d\u1ef1ng c\u00e1c h\u1ec7 th\u1ed1ng c\u00f3 t\u00ednh \u0111\u00e1p \u1ee9ng cao, kh\u1ea3 n\u0103ng ch\u1ecbu t\u1ea3i t\u1ed1t v\u00e0 s\u1eed d\u1ee5ng t\u00e0i nguy\u00ean hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-spring-h\u1ed7-tr\u1ee3-reactive-programming-nh\u01b0-th\u1ebf-nao-nbsp\"><strong>Spring h\u1ed7 tr\u1ee3 Reactive Programming nh\u01b0 th\u1ebf n\u00e0o?&nbsp;<\/strong><\/h4>\n\n\n\n<p>Spring h\u1ed7 tr\u1ee3 m\u00f4 h\u00ecnh n\u00e0y ch\u1ee7 y\u1ebfu th\u00f4ng qua <strong>Spring WebFlux<\/strong> &#8211; m\u1ed9t web framework ho\u00e0n to\u00e0n non-blocking, \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng d\u1ef1a tr\u00ean th\u01b0 vi\u1ec7n <strong>Project Reactor<\/strong>. N\u00f3 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 x\u1eed l\u00fd m\u1ed9t l\u01b0\u1ee3ng l\u1edbn c\u00e1c k\u1ebft n\u1ed1i \u0111\u1ed3ng th\u1eddi v\u1edbi s\u1ed1 l\u01b0\u1ee3ng lu\u1ed3ng (thread) t\u1ed1i thi\u1ec3u, thay th\u1ebf cho m\u00f4 h\u00ecnh blocking c\u1ee7a Spring MVC truy\u1ec1n th\u1ed1ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-40-gi\u1ea3i-thich-cac-khai-ni\u1ec7m-mono-va-flux-trong-spring-webflux\"><strong>40. Gi\u1ea3i th\u00edch c\u00e1c kh\u00e1i ni\u1ec7m Mono v\u00e0 Flux trong Spring WebFlux<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi c\u00e1c lu\u1ed3ng d\u1eef li\u1ec7u, WebFlux s\u1eed d\u1ee5ng hai ki\u1ec3u &#8220;Publisher&#8221; ch\u00ednh t\u1eeb Project Reactor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mono&lt;T><\/strong>: \u0110\u1ea1i di\u1ec7n cho m\u1ed9t lu\u1ed3ng d\u1eef li\u1ec7u b\u1ea5t \u0111\u1ed3ng b\u1ed9 ch\u1ee9a <strong>0 ho\u1eb7c 1<\/strong> ph\u1ea7n t\u1eed. R\u1ea5t ph\u00f9 h\u1ee3p cho c\u00e1c API ch\u1ec9 tr\u1ea3 v\u1ec1 m\u1ed9t k\u1ebft qu\u1ea3 duy nh\u1ea5t (ho\u1eb7c kh\u00f4ng c\u00f3 g\u00ec), v\u00ed d\u1ee5: <code>getUserById(id)<\/code>.<\/li>\n\n\n\n<li><strong>Flux&lt;T><\/strong>: \u0110\u1ea1i di\u1ec7n cho m\u1ed9t lu\u1ed3ng d\u1eef li\u1ec7u b\u1ea5t \u0111\u1ed3ng b\u1ed9 ch\u1ee9a <strong>0 \u0111\u1ebfn N<\/strong> ph\u1ea7n t\u1eed. Th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng cho c\u00e1c API tr\u1ea3 v\u1ec1 m\u1ed9t t\u1eadp h\u1ee3p d\u1eef li\u1ec7u, v\u00ed d\u1ee5: <code>getAllUsers()<\/code>.<\/li>\n<\/ul>\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>\u0110\u1ec3 \u00f4n luy\u1ec7n ph\u1ecfng v\u1ea5n Spring b\u00e0i b\u1ea3n, hi\u1ec7u qu\u1ea3, b\u1ea1n c\u1ea7n \u0111i t\u1eeb nh\u1eefng kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i nh\u1ea5t m\u00e0 b\u1ea5t k\u1ef3 l\u1eadp tr\u00ecnh vi\u00ean Java n\u00e0o c\u0169ng c\u1ea7n bi\u1ebft, \u0111\u1ebfn nh\u1eefng ki\u1ebfn tr\u00fac ph\u1ee9c t\u1ea1p trong th\u1ebf gi\u1edbi cloud-native. Hy v\u1ecdng r\u1eb1ng v\u1edbi b\u1ed9 c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring k\u00e8m c\u00e2u tr\u1ea3 l\u1eddi chi ti\u1ebft n\u00e0y, b\u1ea1n \u0111\u00e3 c\u00f3 m\u1ed9t c\u00e1i nh\u00ecn t\u1ed5ng quan v\u00e0 h\u1ec7 th\u1ed1ng h\u01a1n v\u1ec1 nh\u1eefng g\u00ec nh\u00e0 tuy\u1ec3n d\u1ee5ng mong \u0111\u1ee3i.<\/p>\n\n\n\n<p>H\u00e3y nh\u1edb r\u1eb1ng, vi\u1ec7c hi\u1ec3u s\u00e2u b\u1ea3n ch\u1ea5t v\u1ea5n \u0111\u1ec1 quan tr\u1ecdng h\u01a1n l\u00e0 ch\u1ec9 thu\u1ed9c l\u00f2ng c\u00e2u tr\u1ea3 l\u1eddi. Ch\u00fac b\u1ea1n c\u00f3 m\u1ed9t bu\u1ed5i ph\u1ecfng v\u1ea5n th\u00e0nh c\u00f4ng!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring Framework l\u00e0 m\u1ed9t trong nh\u1eefng k\u1ef9 n\u0103ng quan tr\u1ecdng v\u00e0 \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u nhi\u1ec1u nh\u1ea5t \u0111\u1ed1i v\u1edbi c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java, d\u00f9 b\u1ea1n m\u1edbi ra tr\u01b0\u1eddng hay l\u00e0 m\u1ed9t ki\u1ebfn tr\u00fac s\u01b0 d\u00e0y d\u1eb7n kinh nghi\u1ec7m. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd t\u1ed5ng h\u1ee3p 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring th\u01b0\u1eddng g\u1eb7p, ph\u00e2n lo\u1ea1i theo [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":93303,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109,10350],"tags":[],"class_list":["post-92118","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it","category-java"],"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>Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Luy\u1ec7n t\u1eadp v\u1edbi 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring th\u01b0\u1eddng g\u1eb7p, theo nh\u00f3m ki\u1ebfn th\u1ee9c v\u00e0 c\u1ea5p \u0111\u1ed9, gi\u00fap h\u1ec7 th\u1ed1ng h\u00f3a ki\u1ebfn th\u1ee9c cho c\u00e1c bu\u1ed5i ph\u1ecfng v\u1ea5n.\" \/>\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\/cau-hoi-phong-van-spring\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior\" \/>\n<meta property=\"og:description\" content=\"Spring Framework l\u00e0 m\u1ed9t trong nh\u1eefng k\u1ef9 n\u0103ng quan tr\u1ecdng v\u00e0 \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u nhi\u1ec1u nh\u1ea5t \u0111\u1ed1i v\u1edbi c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java, d\u00f9 b\u1ea1n m\u1edbi ra tr\u01b0\u1eddng hay l\u00e0 m\u1ed9t ki\u1ebfn\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/\" \/>\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-11-27T08:23:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T08:23:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-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=\"26 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior - ITviec Blog","description":"Luy\u1ec7n t\u1eadp v\u1edbi 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring th\u01b0\u1eddng g\u1eb7p, theo nh\u00f3m ki\u1ebfn th\u1ee9c v\u00e0 c\u1ea5p \u0111\u1ed9, gi\u00fap h\u1ec7 th\u1ed1ng h\u00f3a ki\u1ebfn th\u1ee9c cho c\u00e1c bu\u1ed5i ph\u1ecfng v\u1ea5n.","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\/cau-hoi-phong-van-spring\/","og_locale":"vi_VN","og_type":"article","og_title":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior","og_description":"Spring Framework l\u00e0 m\u1ed9t trong nh\u1eefng k\u1ef9 n\u0103ng quan tr\u1ecdng v\u00e0 \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u nhi\u1ec1u nh\u1ea5t \u0111\u1ed1i v\u1edbi c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java, d\u00f9 b\u1ea1n m\u1edbi ra tr\u01b0\u1eddng hay l\u00e0 m\u1ed9t ki\u1ebfn","og_url":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-11-27T08:23:35+00:00","article_modified_time":"2025-11-27T08:23:39+00:00","og_image":[{"width":800,"height":421,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-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":"26 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/"},"author":{"name":"Tien Tran","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/1595d671c49cfa2a48cd3c0a047a1298"},"headline":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior","datePublished":"2025-11-27T08:23:35+00:00","dateModified":"2025-11-27T08:23:39+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/"},"wordCount":6802,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT","Java"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/","url":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/","name":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-scaled.png","datePublished":"2025-11-27T08:23:35+00:00","dateModified":"2025-11-27T08:23:39+00:00","description":"Luy\u1ec7n t\u1eadp v\u1edbi 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring th\u01b0\u1eddng g\u1eb7p, theo nh\u00f3m ki\u1ebfn th\u1ee9c v\u00e0 c\u1ea5p \u0111\u1ed9, gi\u00fap h\u1ec7 th\u1ed1ng h\u00f3a ki\u1ebfn th\u1ee9c cho c\u00e1c bu\u1ed5i ph\u1ecfng v\u1ea5n.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/cau-hoi-phong-van-spring-scaled.png","width":800,"height":421,"caption":"c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n spring - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/cau-hoi-phong-van-spring\/#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":"Top 40+ c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n Spring d\u00e0nh cho Junior \u0111\u1ebfn Senior"}]},{"@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\/92118","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=92118"}],"version-history":[{"count":3,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/92118\/revisions"}],"predecessor-version":[{"id":93304,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/92118\/revisions\/93304"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/93303"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=92118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=92118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=92118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}