{"id":91560,"date":"2025-11-24T15:35:50","date_gmt":"2025-11-24T08:35:50","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=91560"},"modified":"2025-11-24T15:35:53","modified_gmt":"2025-11-24T08:35:53","slug":"spring-core-la-gi","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/","title":{"rendered":"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework"},"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-core-la-gi\/#Cac_nguyen_ly_thiet_ke_nen_tang\" >C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf n\u1ec1n t\u1ea3ng<\/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-core-la-gi\/#IoC_Container_va_Quan_ly_Beans\" >IoC Container v\u00e0 Qu\u1ea3n l\u00fd 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\/spring-core-la-gi\/#Lap_trinh_huong_khia_canh_AOP\" >L\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP)<\/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-core-la-gi\/#Cac_nguyen_tac_va_thuc_hanh_tot_nhat_voi_Spring_Core\" >C\u00e1c nguy\u00ean t\u1eafc v\u00e0 th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t v\u1edbi Spring Core<\/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-core-la-gi\/#Cac_cau_hoi_thuong_gap_ve_Spring_Core\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring Core<\/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-core-la-gi\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Khi l\u00e0m vi\u1ec7c v\u1edbi Spring Framework, c\u00f3 th\u1ec3 b\u1ea1n \u0111\u00e3 quen thu\u1ed9c v\u1edbi c\u00e1c module nh\u01b0 Spring Boot gi\u00fap kh\u1edfi t\u1ea1o \u1ee9ng d\u1ee5ng nhanh ch\u00f3ng hay Spring MVC \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c API web. Nh\u01b0ng \u0111\u00e3 bao gi\u1edd b\u1ea1n t\u1ef1 h\u1ecfi, \u0111i\u1ec1u g\u00ec n\u1eb1m \u1edf trung t\u00e2m, v\u1eadn h\u00e0nh c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng k\u1ebft n\u1ed1i c\u00e1c th\u00e0nh ph\u1ea7n (dependency) l\u1ea1i v\u1edbi nhau? C\u00e2u tr\u1ea3 l\u1eddi n\u1eb1m \u1edf Spring Core.\u00a0<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u00e2y kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t module ri\u00eang l\u1ebb b\u1ea1n c\u1ea7n th\u00eam v\u00e0o d\u1ef1 \u00e1n, m\u00e0 l\u00e0 tr\u00e1i tim c\u1ee7a c\u1ea3 h\u1ec7 sinh th\u00e1i Spring. M\u1ecdi module kh\u00e1c, t\u1eeb <a href=\"https:\/\/itviec.com\/blog\/spring-boot-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Boot<\/a>, Spring Data cho \u0111\u1ebfn <a href=\"https:\/\/itviec.com\/blog\/spring-security-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Security<\/a>, \u0111\u1ec1u \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng tr\u00ean n\u1ec1n t\u1ea3ng v\u1eefng ch\u1eafc m\u00e0 Spring Core cung c\u1ea5p. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd c\u00f9ng b\u1ea1n b\u00f3c t\u00e1ch c\u00e1c kh\u00e1i ni\u1ec7m v\u00e0 c\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng b\u00ean trong c\u1ee7a Spring Core, gi\u00fap b\u1ea1n hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1 c\u00e1ch Spring qu\u1ea3n l\u00fd v\u00e0 li\u00ean k\u1ebft c\u00e1c th\u00e0nh ph\u1ea7n trong \u1ee9ng d\u1ee5ng c\u1ee7a m\u00ecnh.<\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft n\u00e0y \u0111\u1ec3 hi\u1ec3u r\u00f5 v\u1ec1:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf n\u1ec1n t\u1ea3ng<\/li>\n\n\n\n<li>IoC Container v\u00e0 Qu\u1ea3n L\u00fd Beans<\/li>\n\n\n\n<li>C\u00e1c ph\u01b0\u01a1ng ph\u00e1p c\u1ea5u h\u00ecnh<\/li>\n\n\n\n<li>T\u1ed5ng quan v\u1ec1 l\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP)<\/li>\n\n\n\n<li>C\u00e1c nguy\u00ean t\u1eafc v\u00e0 th\u1ef1c h\u00e0nh<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-nguyen-ly-thi\u1ebft-k\u1ebf-n\u1ec1n-t\u1ea3ng\"><span class=\"ez-toc-section\" id=\"Cac_nguyen_ly_thiet_ke_nen_tang\"><\/span><strong>C\u00e1c nguy\u00ean l\u00fd thi\u1ebft k\u1ebf n\u1ec1n t\u1ea3ng<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Tr\u1ecdng t\u00e2m c\u1ee7a Spring Core xoay quanh hai kh\u00e1i ni\u1ec7m n\u1ec1n t\u1ea3ng: <strong>Inversion of Control (IoC)<\/strong> v\u00e0 <strong>Dependency Injection (DI)<\/strong>. Ch\u00fang kh\u00f4ng ph\u1ea3i l\u00e0 nh\u1eefng kh\u00e1i ni\u1ec7m cao si\u00eau, m\u00e0 l\u00e0 s\u1ef1 thay \u0111\u1ed5i trong t\u01b0 duy thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m.<\/p>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3u l\u00e0: Thay v\u00ec l\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i t\u1ef1 qu\u1ea3n l\u00fd v\u00f2ng \u0111\u1eddi v\u00e0 s\u1ef1 ph\u1ee5 thu\u1ed9c c\u1ee7a c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng (object), ch\u00fang ta &#8220;\u1ee7y th\u00e1c&#8221; c\u00f4ng vi\u1ec7c \u0111\u00f3 cho Spring Container.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-inversion-of-control-ioc-d\u1ea3o-ng\u01b0\u1ee3c-quy\u1ec1n-di\u1ec1u-khi\u1ec3n\"><strong>Inversion of Control (IoC) &#8211; \u0110\u1ea3o ng\u01b0\u1ee3c quy\u1ec1n \u0111i\u1ec1u khi\u1ec3n<\/strong><\/h3>\n\n\n\n<p>Trong c\u00e1ch l\u1eadp tr\u00ecnh truy\u1ec1n th\u1ed1ng, m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng s\u1ebd t\u1ef1 ch\u1ecbu tr\u00e1ch nhi\u1ec7m trong vi\u1ec7c t\u00ecm ki\u1ebfm, kh\u1edfi t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng ph\u1ee5 thu\u1ed9c m\u00e0 n\u00f3 c\u1ea7n.<\/p>\n\n\n\n<p><strong>M\u00f4 h\u00ecnh \u0111i\u1ec1u khi\u1ec3n truy\u1ec1n th\u1ed1ng<\/strong><\/p>\n\n\n\n<p>H\u00e3y h\u00ecnh dung m\u1ed9t l\u1edbp <code>OrderService<\/code> c\u1ea7n s\u1eed d\u1ee5ng <code>OrderRepository<\/code> \u0111\u1ec3 t\u01b0\u01a1ng t\u00e1c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u. Theo c\u00e1ch ti\u1ebfp c\u1eadn th\u00f4ng th\u01b0\u1eddng, <code>OrderService<\/code> s\u1ebd ph\u1ea3i t\u1ef1 t\u1ea1o ra instance c\u1ee7a <code>OrderRepository<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class OrderService {\n    \/\/ OrderService t\u1ef1 t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd dependency c\u1ee7a n\u00f3\n    private OrderRepository orderRepository = new OrderRepositoryImpl();\n\n    public void processOrder() {\n        \/\/ ... s\u1eed d\u1ee5ng orderRepository\n    }\n}<\/code><\/pre>\n\n\n\n<p>C\u00e1ch l\u00e0m n\u00e0y t\u1ea1o ra m\u1ed9t li\u00ean k\u1ebft ch\u1eb7t ch\u1ebd (tight coupling). L\u1edbp O<code>rderService<\/code> b\u1ecb &#8220;bu\u1ed9c c\u1ee9ng&#8221; v\u00e0o m\u1ed9t tri\u1ec3n khai c\u1ee5 th\u1ec3 l\u00e0 <code>OrderRepositoryImpl<\/code>. N\u1ebfu sau n\u00e0y ch\u00fang ta mu\u1ed1n \u0111\u1ed5i sang d\u00f9ng <code>MongoOrderRepository<\/code> hay \u0111\u01a1n gi\u1ea3n l\u00e0 vi\u1ebft unit test v\u1edbi m\u1ed9t phi\u00ean b\u1ea3n mock, ch\u00fang ta s\u1ebd ph\u1ea3i s\u1eeda \u0111\u1ed5i tr\u1ef1c ti\u1ebfp code c\u1ee7a <code>OrderService<\/code>.<\/p>\n\n\n\n<p><strong>Nguy\u00ean l\u00fd IoC<\/strong><\/p>\n\n\n\n<p>IoC \u0111\u1ea3o ng\u01b0\u1ee3c ho\u00e0n to\u00e0n lu\u1ed3ng \u0111i\u1ec1u khi\u1ec3n n\u00e0y. Thay v\u00ec \u0111\u1ed1i t\u01b0\u1ee3ng t\u1ef1 \u0111i t\u00ecm th\u1ee9 n\u00f3 c\u1ea7n, n\u00f3 s\u1ebd \u0111\u01b0\u1ee3c cung c\u1ea5p th\u1ee9 n\u00f3 c\u1ea7n b\u1edfi m\u1ed9t b\u00ean th\u1ee9 ba. Tr\u00e1ch nhi\u1ec7m kh\u1edfi t\u1ea1o v\u00e0 qu\u1ea3n l\u00fd v\u00f2ng \u0111\u1eddi c\u1ee7a c\u00e1c dependency \u0111\u01b0\u1ee3c chuy\u1ec3n giao cho m\u1ed9t th\u1ef1c th\u1ec3 b\u00ean ngo\u00e0i, \u0111\u00f3 ch\u00ednh l\u00e0 <strong>IoC Container<\/strong> (hay Spring Container).<\/p>\n\n\n\n<p>Container s\u1ebd \u0111\u1ecdc c\u00e1c c\u1ea5u h\u00ecnh ho\u1eb7c c\u00e1c ch\u1ec9 d\u1eabn (annotation) \u0111\u1ec3 bi\u1ebft <code>OrderService<\/code> c\u1ea7n m\u1ed9t <code>OrderRepository<\/code>. Sau \u0111\u00f3, n\u00f3 s\u1ebd t\u1ea1o ra m\u1ed9t instance c\u1ee7a <code>OrderRepositoryImpl<\/code> v\u00e0 &#8220;trao&#8221; n\u00f3 cho <code>OrderService<\/code> khi <code>OrderService<\/code> \u0111\u01b0\u1ee3c t\u1ea1o. L\u1edbp <code>OrderService<\/code> gi\u1edd \u0111\u00e2y kh\u00f4ng c\u1ea7n bi\u1ebft <code>OrderRepository<\/code> \u0111\u01b0\u1ee3c t\u1ea1o ra nh\u01b0 th\u1ebf n\u00e0o hay n\u00f3 l\u00e0 implementation c\u1ee5 th\u1ec3 n\u00e0o.<\/p>\n\n\n\n<p>Vi\u1ec7c \u00e1p d\u1ee5ng IoC mang l\u1ea1i c\u00e1c \u01b0u \u0111i\u1ec3m k\u1ef9 thu\u1eadt r\u00f5 r\u1ec7t:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gi\u1ea3m thi\u1ec3u s\u1ef1 ph\u1ee5 thu\u1ed9c tr\u1ef1c ti\u1ebfp:<\/strong> C\u00e1c component kh\u00f4ng c\u00f2n bi\u1ebft v\u1ec1 vi\u1ec7c kh\u1edfi t\u1ea1o l\u1eabn nhau, ch\u1ec9 t\u01b0\u01a1ng t\u00e1c qua c\u00e1c interface.<\/li>\n\n\n\n<li><strong>T\u0103ng c\u01b0\u1eddng t\u00ednh module h\u00f3a:<\/strong> C\u00e1c th\u00e0nh ph\u1ea7n tr\u1edf n\u00ean \u0111\u1ed9c l\u1eadp h\u01a1n, d\u1ec5 d\u00e0ng ph\u00e1t tri\u1ec3n, b\u1ea3o tr\u00ec v\u00e0 ki\u1ec3m th\u1eed ri\u00eang l\u1ebb.<\/li>\n\n\n\n<li><strong>Linh ho\u1ea1t trong vi\u1ec7c thay th\u1ebf:<\/strong> Ch\u1ec9 c\u1ea7n thay \u0111\u1ed5i c\u1ea5u h\u00ecnh trong Container, b\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng thay \u0111\u1ed5i m\u1ed9t implementation c\u1ee5 th\u1ec3 (v\u00ed d\u1ee5: \u0111\u1ed5i database) m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i bi\u00ean d\u1ecbch l\u1ea1i code.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dependency-injection-di-tiem-ph\u1ee5-thu\u1ed9c\"><strong>Dependency Injection (DI) &#8211; Ti\u00eam Ph\u1ee5 Thu\u1ed9c<\/strong><\/h3>\n\n\n\n<p>N\u1ebfu IoC l\u00e0 m\u1ed9t nguy\u00ean l\u00fd, m\u1ed9t tri\u1ebft l\u00fd thi\u1ebft k\u1ebf, th\u00ec Dependency Injection (DI) l\u00e0 m\u1ed9t trong nh\u1eefng c\u00e1ch ph\u1ed5 bi\u1ebfn nh\u1ea5t \u0111\u1ec3 hi\u1ec7n th\u1ef1c h\u00f3a nguy\u00ean l\u00fd \u0111\u00f3.<\/p>\n\n\n\n<p>DI l\u00e0 m\u1eabu thi\u1ebft k\u1ebf m\u00e0 trong \u0111\u00f3 IoC Container s\u1ebd ch\u1ee7 \u0111\u1ed9ng &#8220;ti\u00eam&#8221; (inject) c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng ph\u1ee5 thu\u1ed9c v\u00e0o m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng, thay v\u00ec \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u00f3 ph\u1ea3i t\u1ef1 t\u00ecm ki\u1ebfm hay kh\u1edfi t\u1ea1o ch\u00fang. H\u00e0nh \u0111\u1ed9ng &#8220;ti\u00eam&#8221; n\u00e0y ch\u00ednh l\u00e0 c\u00e1ch m\u00e0 Container trao quy\u1ec1n \u0111i\u1ec1u khi\u1ec3n cho \u0111\u1ed1i t\u01b0\u1ee3ng.<\/p>\n\n\n\n<p>Spring h\u1ed7 tr\u1ee3 ba ph\u01b0\u01a1ng th\u1ee9c DI ch\u00ednh:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Constructor Injection (Ti\u00eam qua h\u00e0m kh\u1edfi t\u1ea1o):<\/strong> C\u00e1c dependency \u0111\u01b0\u1ee3c cung c\u1ea5p d\u01b0\u1edbi d\u1ea1ng tham s\u1ed1 c\u1ee7a constructor. \u0110\u00e2y l\u00e0 c\u00e1ch \u0111\u01b0\u1ee3c khuy\u1ebfn kh\u00edch cho c\u00e1c dependency b\u1eaft bu\u1ed9c, v\u00ec n\u00f3 \u0111\u1ea3m b\u1ea3o \u0111\u1ed1i t\u01b0\u1ee3ng lu\u00f4n \u1edf tr\u1ea1ng th\u00e1i h\u1ee3p l\u1ec7 ngay sau khi \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o.<\/li>\n\n\n\n<li><strong>Setter Injection (Ti\u00eam qua ph\u01b0\u01a1ng th\u1ee9c setter):<\/strong> Container s\u1ebd g\u1ecdi c\u00e1c ph\u01b0\u01a1ng th\u1ee9c setter c\u1ee7a \u0111\u1ed1i t\u01b0\u1ee3ng sau khi n\u00f3 \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o b\u1eb1ng constructor kh\u00f4ng tham s\u1ed1. Ph\u01b0\u01a1ng ph\u00e1p n\u00e0y th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng cho c\u00e1c dependency kh\u00f4ng b\u1eaft bu\u1ed9c (optional).<\/li>\n\n\n\n<li><strong>Field Injection (Ti\u00eam qua tr\u01b0\u1eddng d\u1eef li\u1ec7u):<\/strong> Dependency \u0111\u01b0\u1ee3c ti\u00eam tr\u1ef1c ti\u1ebfp v\u00e0o tr\u01b0\u1eddng (field) c\u1ee7a l\u1edbp, th\u01b0\u1eddng s\u1eed d\u1ee5ng annotation <code>@Autowired<\/code>. C\u00e1ch n\u00e0y gi\u00fap code ng\u1eafn g\u1ecdn nh\u01b0ng c\u00f3 th\u1ec3 g\u00e2y kh\u00f3 kh\u0103n cho vi\u1ec7c vi\u1ebft unit test v\u00e0 che gi\u1ea5u c\u00e1c ph\u1ee5 thu\u1ed9c c\u1ee7a m\u1ed9t l\u1edbp.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-ioc-container-va-qu\u1ea3n-ly-beans\"><span class=\"ez-toc-section\" id=\"IoC_Container_va_Quan_ly_Beans\"><\/span><strong>IoC Container v\u00e0 Qu\u1ea3n l\u00fd Beans<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ch\u00fang ta \u0111\u00e3 hi\u1ec3u v\u1ec1 nguy\u00ean l\u00fd IoC v\u00e0 DI. B\u00e2y gi\u1edd, h\u00e3y \u0111i v\u00e0o c\u00e1c th\u00e0nh ph\u1ea7n c\u1ee5 th\u1ec3 th\u1ef1c thi nh\u1eefng nguy\u00ean l\u00fd n\u00e0y: <strong>Spring Bean<\/strong> v\u00e0 <strong>IoC Container<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-d\u1ecbnh-nghia-spring-bean\"><strong>\u0110\u1ecbnh ngh\u0129a Spring Bean<\/strong><\/h3>\n\n\n\n<p>Trong h\u1ec7 sinh th\u00e1i Spring, m\u1ed9t <strong>Bean<\/strong> kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t kh\u00e1i ni\u1ec7m ph\u1ee9c t\u1ea1p. N\u00f3 \u0111\u01a1n gi\u1ea3n l\u00e0 m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng (object) m\u00e0 v\u00f2ng \u0111\u1eddi c\u1ee7a n\u00f3 t\u1eeb l\u00fac \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o, c\u1ea5u h\u00ecnh, cho \u0111\u1ebfn l\u00fac b\u1ecb h\u1ee7y \u0111\u1ec1u do Spring IoC Container qu\u1ea3n l\u00fd. Thay v\u00ec b\u1ea1n d\u00f9ng to\u00e1n t\u1eed <code>new<\/code> \u0111\u1ec3 t\u1ea1o object, b\u1ea1n khai b\u00e1o \u0111\u1ec3 Container l\u00e0m \u0111i\u1ec1u \u0111\u00f3 cho b\u1ea1n.<\/p>\n\n\n\n<p>C\u00f3 hai c\u00e1ch ch\u00ednh \u0111\u1ec3 khai b\u00e1o m\u1ed9t l\u1edbp tr\u1edf th\u00e0nh Bean:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>S\u1eed d\u1ee5ng Stereotype Annotations<\/strong>: \u0110\u00e2y l\u00e0 c\u00e1ch ph\u1ed5 bi\u1ebfn nh\u1ea5t. B\u1ea1n \u0111\u00e1nh d\u1ea5u m\u1ed9t l\u1edbp v\u1edbi c\u00e1c annotation nh\u01b0 <code>@Component<\/code>, <code>@Service<\/code> (cho l\u1edbp logic nghi\u1ec7p v\u1ee5), <code>@Repository<\/code> (cho l\u1edbp truy c\u1eadp d\u1eef li\u1ec7u), ho\u1eb7c <code>@Controller<\/code> (cho t\u1ea7ng web). Khi Spring qu\u00e9t qua c\u00e1c g\u00f3i m\u00e3 ngu\u1ed3n, n\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng ph\u00e1t hi\u1ec7n v\u00e0 \u0111\u0103ng k\u00fd c\u00e1c l\u1edbp n\u00e0y l\u00e0m Bean.<\/li>\n\n\n\n<li><strong>S\u1eed d\u1ee5ng <code>@Bean<\/code> trong l\u1edbp c\u1ea5u h\u00ecnh<\/strong>: \u0110\u1ed1i v\u1edbi c\u00e1c tr\u01b0\u1eddng h\u1ee3p b\u1ea1n kh\u00f4ng th\u1ec3 s\u1eeda \u0111\u1ed5i m\u00e3 ngu\u1ed3n c\u1ee7a m\u1ed9t l\u1edbp (v\u00ed d\u1ee5: c\u00e1c th\u01b0 vi\u1ec7n b\u00ean ngo\u00e0i) ho\u1eb7c c\u1ea7n logic kh\u1edfi t\u1ea1o ph\u1ee9c t\u1ea1p, b\u1ea1n c\u00f3 th\u1ec3 vi\u1ebft m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c b\u00ean trong l\u1edbp c\u00f3 \u0111\u00e1nh d\u1ea5u <code>@Configuration<\/code>. Ph\u01b0\u01a1ng th\u1ee9c n\u00e0y s\u1ebd tr\u1ea3 v\u1ec1 m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng, v\u00e0 b\u1ea1n \u0111\u00e1nh d\u1ea5u ph\u01b0\u01a1ng th\u1ee9c \u0111\u00f3 v\u1edbi annotation <code>@Bean<\/code>. Spring s\u1ebd th\u1ef1c thi ph\u01b0\u01a1ng th\u1ee9c n\u00e0y v\u00e0 qu\u1ea3n l\u00fd \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1 nh\u01b0 m\u1ed9t Bean.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-spring-ioc-container\"><strong>Spring IoC Container<\/strong><\/h3>\n\n\n\n<p><strong>IoC Container<\/strong> l\u00e0 tr\u00e1i tim c\u1ee7a Spring Framework. Nhi\u1ec7m v\u1ee5 ch\u00ednh c\u1ee7a n\u00f3 l\u00e0 \u0111\u1ecdc c\u00e1c si\u00eau d\u1eef li\u1ec7u c\u1ea5u h\u00ecnh (configuration metadata) t\u1eeb file XML, annotation ho\u1eb7c Java code, sau \u0111\u00f3 ti\u1ebfn h\u00e0nh kh\u1edfi t\u1ea1o, c\u1ea5u h\u00ecnh v\u00e0 li\u00ean k\u1ebft c\u00e1c bean l\u1ea1i v\u1edbi nhau.<\/p>\n\n\n\n<p>Spring cung c\u1ea5p hai lo\u1ea1i container ch\u00ednh:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BeanFactory<\/strong>: \u0110\u00e2y l\u00e0 giao di\u1ec7n g\u1ed1c, cung c\u1ea5p c\u00e1c ch\u1ee9c n\u0103ng c\u01a1 b\u1ea3n nh\u1ea5t c\u1ee7a m\u1ed9t container, bao g\u1ed3m vi\u1ec7c qu\u1ea3n l\u00fd bean v\u00e0 h\u1ed7 tr\u1ee3 DI. M\u1ed9t \u0111\u1eb7c t\u00ednh quan tr\u1ecdng c\u1ee7a <code>BeanFactory<\/code> l\u00e0 n\u00f3 h\u1ed7 tr\u1ee3 <strong>kh\u1edfi t\u1ea1o l\u01b0\u1eddi (lazy-loading)<\/strong>, ngh\u0129a l\u00e0 bean ch\u1ec9 \u0111\u01b0\u1ee3c t\u1ea1o ra khi c\u00f3 y\u00eau c\u1ea7u truy xu\u1ea5t \u0111\u1ebfn n\u00f3.<\/li>\n\n\n\n<li><strong>ApplicationContext<\/strong>: \u0110\u00e2y l\u00e0 m\u1ed9t giao di\u1ec7n con, k\u1ebf th\u1eeba to\u00e0n b\u1ed9 ch\u1ee9c n\u0103ng c\u1ee7a <code>BeanFactory<\/code> v\u00e0 b\u1ed5 sung th\u00eam nhi\u1ec1u t\u00ednh n\u0103ng cao c\u1ea5p h\u01a1n, ch\u1eb3ng h\u1ea1n nh\u01b0: qu\u1ea3n l\u00fd s\u1ef1 ki\u1ec7n (event propagation), t\u00edch h\u1ee3p v\u1edbi AOP (Aspect-Oriented Programming), v\u00e0 h\u1ed7 tr\u1ee3 qu\u1ed1c t\u1ebf h\u00f3a (i18n). Trong h\u1ea7u h\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng hi\u1ec7n \u0111\u1ea1i, <code>ApplicationContext<\/code> l\u00e0 l\u1ef1a ch\u1ecdn m\u1eb7c \u0111\u1ecbnh v\u00ec n\u00f3 cung c\u1ea5p m\u1ed9t b\u1ed9 c\u00f4ng c\u1ee5 ho\u00e0n ch\u1ec9nh h\u01a1n v\u00e0 th\u01b0\u1eddng <strong>kh\u1edfi t\u1ea1o c\u00e1c bean singleton ngay t\u1eeb \u0111\u1ea7u (eager-loading)<\/strong>, gi\u00fap ph\u00e1t hi\u1ec7n l\u1ed7i c\u1ea5u h\u00ecnh s\u1edbm.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cac-ph\u01b0\u01a1ng-phap-c\u1ea5u-hinh-chinh\"><strong>C\u00e1c ph\u01b0\u01a1ng ph\u00e1p c\u1ea5u h\u00ecnh ch\u00ednh<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 h\u01b0\u1edbng d\u1eabn Container c\u00e1ch qu\u1ea3n l\u00fd c\u00e1c bean, Spring h\u1ed7 tr\u1ee3 ba ph\u01b0\u01a1ng ph\u00e1p c\u1ea5u h\u00ecnh ch\u00ednh:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>XML-Based Configuration<\/strong>: \u0110\u00e2y l\u00e0 ph\u01b0\u01a1ng ph\u00e1p c\u1ea5u h\u00ecnh truy\u1ec1n th\u1ed1ng, n\u01a1i t\u1ea5t c\u1ea3 c\u00e1c bean v\u00e0 c\u00e1c dependency c\u1ee7a ch\u00fang \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a trong c\u00e1c t\u1ec7p tin XML. M\u1eb7c d\u00f9 r\u1ea5t t\u01b0\u1eddng minh, ph\u01b0\u01a1ng ph\u00e1p n\u00e0y tr\u1edf n\u00ean d\u00e0i d\u00f2ng, kh\u00f3 qu\u1ea3n l\u00fd khi d\u1ef1 \u00e1n l\u1edbn l\u00ean v\u00e0 kh\u00f4ng \u0111\u1ea3m b\u1ea3o an to\u00e0n v\u1ec1 ki\u1ec3u (type safety) l\u00fac bi\u00ean d\u1ecbch. Hi\u1ec7n nay n\u00f3 r\u1ea5t \u00edt \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c d\u1ef1 \u00e1n m\u1edbi.<\/li>\n\n\n\n<li><strong>Annotation-Based Configuration<\/strong>: Ph\u01b0\u01a1ng ph\u00e1p n\u00e0y chuy\u1ec3n c\u00e1c khai b\u00e1o t\u1eeb XML v\u00e0o ngay trong m\u00e3 ngu\u1ed3n b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng c\u00e1c annotation nh\u01b0 <code>@Component<\/code>, <code>@Autowired<\/code>. \u0110\u1ec3 k\u00edch ho\u1ea1t c\u01a1 ch\u1ebf n\u00e0y, b\u1ea1n c\u1ea7n khai b\u00e1o <code>@ComponentScan<\/code> \u0111\u1ec3 ch\u1ec9 cho Spring bi\u1ebft c\u1ea7n qu\u00e9t c\u00e1c g\u00f3i n\u00e0o \u0111\u1ec3 t\u00ecm bean.<\/li>\n\n\n\n<li><strong>Java-Based Configuration<\/strong>: \u0110\u00e2y l\u00e0 ph\u01b0\u01a1ng ph\u00e1p hi\u1ec7n \u0111\u1ea1i v\u00e0 \u0111\u01b0\u1ee3c \u01b0a chu\u1ed9ng nh\u1ea5t. B\u1ea1n s\u1eed d\u1ee5ng c\u00e1c l\u1edbp Java th\u00f4ng th\u01b0\u1eddng, \u0111\u00e1nh d\u1ea5u ch\u00fang b\u1eb1ng <code>@Configuration<\/code> v\u00e0 \u0111\u1ecbnh ngh\u0129a c\u00e1c bean b\u1eb1ng c\u00e1c ph\u01b0\u01a1ng th\u1ee9c c\u00f3 annotation <code>@Bean<\/code>. C\u00e1ch ti\u1ebfp c\u1eadn n\u00e0y cung c\u1ea5p \u0111\u1ea7y \u0111\u1ee7 <strong>an to\u00e0n v\u1ec1 ki\u1ec3u<\/strong>, d\u1ec5 d\u00e0ng t\u00e1i c\u1ea5u tr\u00fac (refactor) b\u1eb1ng c\u00e1c c\u00f4ng c\u1ee5 c\u1ee7a IDE v\u00e0 cho ph\u00e9p b\u1ea1n t\u1eadn d\u1ee5ng to\u00e0n b\u1ed9 s\u1ee9c m\u1ea1nh c\u1ee7a ng\u00f4n ng\u1eef Java \u0111\u1ec3 t\u1ea1o ra c\u00e1c c\u1ea5u h\u00ecnh \u0111\u1ed9ng.<\/li>\n<\/ol>\n\n\n\n<p><strong>Khuy\u1ebfn ngh\u1ecb<\/strong>: C\u00e1ch ti\u1ebfp c\u1eadn hi\u1ec7u qu\u1ea3 nh\u1ea5t hi\u1ec7n nay l\u00e0 k\u1ebft h\u1ee3p gi\u1eefa <strong>Java-Based<\/strong> v\u00e0 <strong>Annotation-Based<\/strong>. D\u00f9ng l\u1edbp <code>@Configuration<\/code> \u0111\u1ec3 thi\u1ebft l\u1eadp c\u00e1c c\u1ea5u h\u00ecnh trung t\u00e2m (nh\u01b0 k\u1ebft n\u1ed1i c\u01a1 s\u1edf d\u1eef li\u1ec7u, bean c\u1ee7a th\u01b0 vi\u1ec7n ngo\u00e0i) v\u00e0 d\u00f9ng <code>@ComponentScan<\/code> \u0111\u1ec3 Spring t\u1ef1 \u0111\u1ed9ng nh\u1eadn di\u1ec7n c\u00e1c component, service, repository trong \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. S\u1ef1 k\u1ebft h\u1ee3p n\u00e0y mang l\u1ea1i s\u1ef1 c\u00e2n b\u1eb1ng gi\u1eefa t\u00ednh r\u00f5 r\u00e0ng, an to\u00e0n v\u00e0 kh\u1ea3 n\u0103ng b\u1ea3o tr\u00ec.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-l\u1eadp-trinh-h\u01b0\u1edbng-khia-c\u1ea1nh-aop\"><span class=\"ez-toc-section\" id=\"Lap_trinh_huong_khia_canh_AOP\"><\/span><strong>L\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>B\u00ean c\u1ea1nh IoC v\u00e0 DI, <strong>l\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (Aspect-Oriented Programming &#8211; AOP)<\/strong> l\u00e0 m\u1ed9t tr\u1ee5 c\u1ed9t quan tr\u1ecdng kh\u00e1c c\u1ee7a Spring Core. N\u1ebfu IoC gi\u00fap b\u1ea1n t\u00e1ch r\u1eddi s\u1ef1 ph\u1ee5 thu\u1ed9c gi\u1eefa c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng, th\u00ec AOP gi\u00fap b\u1ea1n t\u00e1ch r\u1eddi c\u00e1c m\u1ed1i quan t\u00e2m (concerns) trong \u1ee9ng d\u1ee5ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cross-cutting-concerns\"><strong>Cross-Cutting Concerns<\/strong><\/h3>\n\n\n\n<p>Trong b\u1ea5t k\u1ef3 \u1ee9ng d\u1ee5ng n\u00e0o, b\u00ean c\u1ea1nh logic nghi\u1ec7p v\u1ee5 ch\u00ednh (business logic), lu\u00f4n t\u1ed3n t\u1ea1i c\u00e1c ch\u1ee9c n\u0103ng h\u1ed7 tr\u1ee3 c\u1ea7n \u0111\u01b0\u1ee3c th\u1ef1c thi \u1edf nhi\u1ec1u n\u01a1i. V\u00ed d\u1ee5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Logging<\/strong>: Ghi l\u1ea1i th\u00f4ng tin khi m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c b\u1eaft \u0111\u1ea7u v\u00e0 k\u1ebft th\u00fac.<\/li>\n\n\n\n<li><strong>Transaction Management<\/strong>: B\u1eaft \u0111\u1ea7u m\u1ed9t giao d\u1ecbch tr\u01b0\u1edbc khi thao t\u00e1c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u v\u00e0 commit ho\u1eb7c rollback sau khi ho\u00e0n th\u00e0nh.<\/li>\n\n\n\n<li><strong>Security<\/strong>: Ki\u1ec3m tra quy\u1ec1n c\u1ee7a ng\u01b0\u1eddi d\u00f9ng tr\u01b0\u1edbc khi cho ph\u00e9p th\u1ef1c thi m\u1ed9t h\u00e0nh \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<p>Nh\u1eefng ch\u1ee9c n\u0103ng n\u00e0y \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 <strong>Cross-Cutting Concerns<\/strong> (m\u1ed1i quan t\u00e2m xuy\u00ean su\u1ed1t) v\u00ec ch\u00fang &#8220;c\u1eaft ngang&#8221; qua nhi\u1ec1u module v\u00e0 l\u1edbp kh\u00e1c nhau trong \u1ee9ng d\u1ee5ng. N\u1ebfu kh\u00f4ng c\u00f3 AOP, b\u1ea1n s\u1ebd ph\u1ea3i l\u1eb7p l\u1ea1i m\u00e3 ngu\u1ed3n x\u1eed l\u00fd c\u00e1c ch\u1ee9c n\u0103ng n\u00e0y \u1edf kh\u1eafp m\u1ecdi n\u01a1i, d\u1eabn \u0111\u1ebfn code b\u1ecb tr\u00f9ng l\u1eb7p, kh\u00f3 b\u1ea3o tr\u00ec v\u00e0 logic nghi\u1ec7p v\u1ee5 b\u1ecb &#8220;nhi\u1ec5u&#8221; b\u1edfi c\u00e1c \u0111o\u1ea1n code kh\u00f4ng li\u00ean quan tr\u1ef1c ti\u1ebfp.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-vai-tro-c\u1ee7a-aop\"><strong>Vai tr\u00f2 c\u1ee7a AOP<\/strong><\/h3>\n\n\n\n<p>AOP ra \u0111\u1eddi \u0111\u1ec3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 n\u00e0y. N\u00f3 cho ph\u00e9p b\u1ea1n module h\u00f3a c\u00e1c cross-cutting concerns th\u00e0nh c\u00e1c \u0111\u01a1n v\u1ecb ri\u00eang bi\u1ec7t \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 aspects. Thay v\u00ec nh\u00fang code logging tr\u1ef1c ti\u1ebfp v\u00e0o c\u00e1c ph\u01b0\u01a1ng th\u1ee9c nghi\u1ec7p v\u1ee5, b\u1ea1n t\u1ea1o ra m\u1ed9t &#8220;logging aspect&#8221; v\u00e0 khai b\u00e1o r\u1eb1ng &#8220;aspect n\u00e0y n\u00ean \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng cho t\u1ea5t c\u1ea3 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c trong t\u1ea7ng service&#8221;.<\/p>\n\n\n\n<p>Spring AOP s\u1ebd t\u1ef1 \u0111\u1ed9ng &#8220;d\u1ec7t&#8221; (weave) logic t\u1eeb c\u00e1c aspect n\u00e0y v\u00e0o c\u00e1c \u0111i\u1ec3m th\u1ef1c thi ph\u00f9 h\u1ee3p trong ch\u01b0\u01a1ng tr\u00ecnh c\u1ee7a b\u1ea1n l\u00fac runtime. K\u1ebft qu\u1ea3 l\u00e0 logic nghi\u1ec7p v\u1ee5 c\u1ee7a b\u1ea1n v\u1eabn gi\u1eef \u0111\u01b0\u1ee3c s\u1ef1 trong s\u00e1ng, ch\u1ec9 t\u1eadp trung v\u00e0o nhi\u1ec7m v\u1ee5 ch\u00ednh c\u1ee7a n\u00f3, trong khi c\u00e1c ch\u1ee9c n\u0103ng xuy\u00ean su\u1ed1t \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd t\u1eadp trung t\u1ea1i m\u1ed9t n\u01a1i.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cac-thu\u1eadt-ng\u1eef-chinh-trong-spring-aop\"><strong>C\u00e1c thu\u1eadt ng\u1eef ch\u00ednh trong Spring AOP<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi AOP, b\u1ea1n c\u1ea7n n\u1eafm v\u1eefng m\u1ed9t s\u1ed1 thu\u1eadt ng\u1eef c\u1ed1t l\u00f5i:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Join Point<\/strong>: M\u1ed9t \u0111i\u1ec3m c\u1ee5 th\u1ec3 trong qu\u00e1 tr\u00ecnh th\u1ef1c thi c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh. Trong Spring AOP, m\u1ed9t join point h\u1ea7u nh\u01b0 lu\u00f4n l\u00e0 vi\u1ec7c th\u1ef1c thi m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c.<\/li>\n\n\n\n<li><strong>Advice<\/strong>: L\u00e0 h\u00e0nh \u0111\u1ed9ng m\u00e0 aspect s\u1ebd th\u1ef1c hi\u1ec7n t\u1ea1i m\u1ed9t join point. \u0110\u00e2y ch\u00ednh l\u00e0 ph\u1ea7n logic c\u1ee7a cross-cutting concern (v\u00ed d\u1ee5: \u0111o\u1ea1n code \u0111\u1ec3 ghi log). C\u00e1c lo\u1ea1i advice ph\u1ed5 bi\u1ebfn bao g\u1ed3m: <code>@Before<\/code> (ch\u1ea1y tr\u01b0\u1edbc khi join point th\u1ef1c thi), <code>@After<\/code> (ch\u1ea1y sau khi join point ho\u00e0n th\u00e0nh, b\u1ea5t k\u1ec3 th\u00e0nh c\u00f4ng hay th\u1ea5t b\u1ea1i), <code>@Around<\/code> (bao quanh join point, cho ph\u00e9p ki\u1ec3m so\u00e1t c\u1ea3 tr\u01b0\u1edbc v\u00e0 sau khi th\u1ef1c thi).<\/li>\n\n\n\n<li><strong>Pointcut<\/strong>: L\u00e0 m\u1ed9t bi\u1ec3u th\u1ee9c d\u00f9ng \u0111\u1ec3 &#8220;l\u1ecdc&#8221; v\u00e0 x\u00e1c \u0111\u1ecbnh m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c join point. N\u00f3 tr\u1ea3 l\u1eddi cho c\u00e2u h\u1ecfi: &#8220;Advice n\u00e0y n\u00ean \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng \u1edf \u0111\u00e2u?&#8221;. V\u00ed d\u1ee5, m\u1ed9t pointcut c\u00f3 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh &#8220;t\u1ea5t c\u1ea3 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c public trong c\u00e1c l\u1edbp c\u00f3 t\u00ean k\u1ebft th\u00fac b\u1eb1ng &#8216;Service'&#8221;.<\/li>\n\n\n\n<li><strong>Aspect<\/strong>: L\u00e0 l\u1edbp ch\u1ee9a \u0111\u1ef1ng v\u00e0 k\u1ebft h\u1ee3p Advice v\u00e0 Pointcut. N\u00f3 \u0111\u1ecbnh ngh\u0129a c\u00e1i g\u00ec (advice) s\u1ebd \u0111\u01b0\u1ee3c th\u1ef1c thi v\u00e0 \u1edf \u0111\u00e2u (pointcut) n\u00f3 s\u1ebd \u0111\u01b0\u1ee3c th\u1ef1c thi.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-nguyen-t\u1eafc-va-th\u1ef1c-hanh-t\u1ed1t-nh\u1ea5t-v\u1edbi-spring-core\"><span class=\"ez-toc-section\" id=\"Cac_nguyen_tac_va_thuc_hanh_tot_nhat_voi_Spring_Core\"><\/span><strong>C\u00e1c nguy\u00ean t\u1eafc v\u00e0 th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t v\u1edbi Spring Core<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Sau khi \u0111\u00e3 n\u1eafm v\u1eefng c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a Spring, vi\u1ec7c \u00e1p d\u1ee5ng ch\u00fang m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3 trong th\u1ef1c t\u1ebf l\u00e0 b\u01b0\u1edbc ti\u1ebfp theo. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 nguy\u00ean t\u1eafc v\u00e0 th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t \u0111\u01b0\u1ee3c c\u1ed9ng \u0111\u1ed3ng khuy\u1ebfn kh\u00edch khi l\u00e0m vi\u1ec7c v\u1edbi Spring Core.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u01b0u-tien-constructor-injection\"><strong>\u01afu ti\u00ean Constructor Injection<\/strong><\/h3>\n\n\n\n<p>Trong ba c\u00e1ch ti\u00eam ph\u1ee5 thu\u1ed9c, <strong>Constructor Injection<\/strong> \u0111\u01b0\u1ee3c xem l\u00e0 ph\u01b0\u01a1ng ph\u00e1p \u01b0u vi\u1ec7t nh\u1ea5t cho c\u00e1c dependency b\u1eaft bu\u1ed9c. L\u00fd do l\u00e0 v\u00ec:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0110\u1ea3m b\u1ea3o t\u00ednh to\u00e0n v\u1eb9n (Immutability):<\/strong> B\u1eb1ng c\u00e1ch y\u00eau c\u1ea7u c\u00e1c dependency ngay t\u1ea1i th\u1eddi \u0111i\u1ec3m kh\u1edfi t\u1ea1o, b\u1ea1n \u0111\u1ea3m b\u1ea3o r\u1eb1ng \u0111\u1ed1i t\u01b0\u1ee3ng s\u1ebd kh\u00f4ng bao gi\u1edd t\u1ed3n t\u1ea1i \u1edf tr\u1ea1ng th\u00e1i ch\u01b0a ho\u00e0n ch\u1ec9nh (thi\u1ebfu dependency). C\u00e1c tr\u01b0\u1eddng ph\u1ee5 thu\u1ed9c c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c khai b\u00e1o l\u00e0 final, \u0111\u1ea3m b\u1ea3o ch\u00fang kh\u00f4ng b\u1ecb thay \u0111\u1ed5i sau khi \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c t\u1ea1o ra.<\/li>\n\n\n\n<li><strong>\u0110\u01a1n gi\u1ea3n h\u00f3a Unit Test:<\/strong> Khi vi\u1ebft test, b\u1ea1n kh\u00f4ng c\u1ea7n \u0111\u1ebfn m\u1ed9t m\u00f4i tr\u01b0\u1eddng Spring ph\u1ee9c t\u1ea1p. B\u1ea1n c\u00f3 th\u1ec3 t\u1ef1 tay kh\u1edfi t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng b\u1eb1ng to\u00e1n t\u1eed new v\u00e0 truy\u1ec1n v\u00e0o c\u00e1c phi\u00ean b\u1ea3n mock c\u1ee7a dependency m\u1ed9t c\u00e1ch tr\u1ef1c ti\u1ebfp. \u0110i\u1ec1u n\u00e0y l\u00e0m cho test tr\u1edf n\u00ean r\u00f5 r\u00e0ng, \u0111\u1ed9c l\u1eadp v\u00e0 d\u1ec5 d\u00e0ng h\u01a1n r\u1ea5t nhi\u1ec1u so v\u1edbi vi\u1ec7c d\u00f9ng Field Injection, v\u1ed1n \u0111\u00f2i h\u1ecfi c\u00e1c k\u1ef9 thu\u1eadt ph\u1ee9c t\u1ea1p h\u01a1n nh\u01b0 reflection.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-s\u1eed-d\u1ee5ng-java-based-configuration\"><strong>S\u1eed d\u1ee5ng Java-Based Configuration<\/strong><\/h3>\n\n\n\n<p>M\u1eb7c d\u00f9 Spring h\u1ed7 tr\u1ee3 nhi\u1ec1u c\u00e1ch c\u1ea5u h\u00ecnh, <strong>Java-Based Configuration<\/strong> (s\u1eed d\u1ee5ng <code>@Configuration<\/code> v\u00e0 <code>@Bean<\/code>) \u0111\u01b0\u1ee3c xem l\u00e0 ti\u00eau chu\u1ea9n cho c\u00e1c \u1ee9ng d\u1ee5ng hi\u1ec7n \u0111\u1ea1i.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>An to\u00e0n v\u1ec1 ki\u1ec3u (Type Safety):<\/strong> C\u1ea5u h\u00ecnh b\u1eb1ng Java \u0111\u01b0\u1ee3c tr\u00ecnh bi\u00ean d\u1ecbch ki\u1ec3m tra. N\u1ebfu b\u1ea1n c\u1ed1 g\u1eafng li\u00ean k\u1ebft m\u1ed9t bean sai ki\u1ec3u, IDE v\u00e0 tr\u00ecnh bi\u00ean d\u1ecbch s\u1ebd b\u00e1o l\u1ed7i ngay l\u1eadp t\u1ee9c, thay v\u00ec ph\u1ea3i ch\u1edd \u0111\u1ebfn l\u00fac ch\u1ea1y \u1ee9ng d\u1ee5ng m\u1edbi ph\u00e1t hi\u1ec7n ra nh\u01b0 v\u1edbi XML.<\/li>\n\n\n\n<li><strong>Kh\u1ea3 n\u0103ng Refactor:<\/strong> C\u00e1c c\u00f4ng c\u1ee5 trong IDE hi\u1ec7n \u0111\u1ea1i h\u1ed7 tr\u1ee3 refactor m\u00e3 Java r\u1ea5t t\u1ed1t. Khi b\u1ea1n \u0111\u1ed5i t\u00ean m\u1ed9t l\u1edbp hay m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c \u0111\u01b0\u1ee3c d\u00f9ng trong c\u1ea5u h\u00ecnh, m\u1ecdi th\u1ee9 s\u1ebd \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt m\u1ed9t c\u00e1ch t\u1ef1 \u0111\u1ed9ng, gi\u00fap vi\u1ec7c b\u1ea3o tr\u00ec code tr\u1edf n\u00ean an to\u00e0n v\u00e0 hi\u1ec7u qu\u1ea3.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-phan-lo\u1ea1i-component-ro-rang\"><strong>Ph\u00e2n lo\u1ea1i component r\u00f5 r\u00e0ng<\/strong><\/h3>\n\n\n\n<p>Spring cung c\u1ea5p c\u00e1c stereotype annotation chuy\u00ean bi\u1ec7t h\u01a1n <code>@Component<\/code> nh\u01b0 <code>@Service<\/code>, <code>@Repository<\/code>, v\u00e0 <code>@Controller<\/code>. Vi\u1ec7c s\u1eed d\u1ee5ng ch\u00fang m\u1ed9t c\u00e1ch c\u00f3 ch\u1ee7 \u0111\u00edch mang l\u1ea1i nhi\u1ec1u l\u1ee3i \u00edch:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u0103ng t\u00ednh minh b\u1ea1ch c\u1ee7a ki\u1ebfn tr\u00fac:<\/strong> Khi nh\u00ecn v\u00e0o m\u1ed9t l\u1edbp \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u <code>@Service<\/code>, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean kh\u00e1c c\u00f3 th\u1ec3 ngay l\u1eadp t\u1ee9c hi\u1ec3u r\u1eb1ng \u0111\u00e2y l\u00e0 n\u01a1i ch\u1ee9a logic nghi\u1ec7p v\u1ee5. T\u01b0\u01a1ng t\u1ef1, <code>@Repository<\/code> ch\u1ec9 r\u00f5 \u0111\u00e2y l\u00e0 l\u1edbp ch\u1ecbu tr\u00e1ch nhi\u1ec7m truy c\u1eadp d\u1eef li\u1ec7u. \u0110i\u1ec1u n\u00e0y gi\u00fap c\u1ea5u tr\u00fac d\u1ef1 \u00e1n tr\u1edf n\u00ean r\u00f5 r\u00e0ng v\u00e0 d\u1ec5 hi\u1ec3u h\u01a1n.<\/li>\n\n\n\n<li><strong>T\u1eadn d\u1ee5ng c\u00e1c t\u00ednh n\u0103ng b\u1ed5 sung:<\/strong> M\u1ed9t s\u1ed1 annotation c\u00f2n \u0111i k\u00e8m v\u1edbi c\u00e1c x\u1eed l\u00fd \u0111\u1eb7c bi\u1ec7t. V\u00ed d\u1ee5, <code>@Repository<\/code> gi\u00fap Spring t\u1ef1 \u0111\u1ed9ng d\u1ecbch c\u00e1c ngo\u1ea1i l\u1ec7 c\u1ee7a t\u1ea7ng database (persistence exceptions) th\u00e0nh m\u1ed9t h\u1ec7 th\u1ed1ng ngo\u1ea1i l\u1ec7 nh\u1ea5t qu\u00e1n c\u1ee7a Spring Data Access.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-qu\u1ea3n-ly-bean-scope-h\u1ee3p-ly\"><strong>Qu\u1ea3n l\u00fd Bean Scope h\u1ee3p l\u00fd<\/strong><\/h3>\n\n\n\n<p>M\u1eb7c \u0111\u1ecbnh, t\u1ea5t c\u1ea3 c\u00e1c bean trong Spring \u0111\u1ec1u l\u00e0 <strong>singleton<\/strong>, ngh\u0129a l\u00e0 ch\u1ec9 c\u00f3 m\u1ed9t instance duy nh\u1ea5t c\u1ee7a bean \u0111\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra v\u00e0 t\u00e1i s\u1eed d\u1ee5ng trong to\u00e0n b\u1ed9 \u1ee9ng d\u1ee5ng. \u0110i\u1ec1u n\u00e0y r\u1ea5t hi\u1ec7u qu\u1ea3 cho c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng kh\u00f4ng tr\u1ea1ng th\u00e1i (stateless) nh\u01b0 service hay repository.<\/p>\n\n\n\n<p>Tuy nhi\u00ean, b\u1ea1n c\u1ea7n hi\u1ec3u v\u00e0 \u00e1p d\u1ee5ng \u0111\u00fang c\u00e1c scope kh\u00e1c khi c\u1ea7n thi\u1ebft:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prototype:<\/strong> M\u1ed7i l\u1ea7n y\u00eau c\u1ea7u m\u1ed9t bean, m\u1ed9t instance m\u1edbi s\u1ebd \u0111\u01b0\u1ee3c t\u1ea1o ra. Scope n\u00e0y h\u1eefu \u00edch cho c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng c\u00f3 tr\u1ea1ng th\u00e1i (stateful) m\u00e0 b\u1ea1n kh\u00f4ng mu\u1ed1n chia s\u1ebb tr\u1ea1ng th\u00e1i \u0111\u00f3 gi\u1eefa c\u00e1c ph\u1ea7n kh\u00e1c nhau c\u1ee7a \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li><strong>Request, Session, Application (trong \u1ee9ng d\u1ee5ng web):<\/strong> C\u00e1c scope n\u00e0y cho ph\u00e9p m\u1ed9t bean t\u1ed3n t\u1ea1i trong v\u00f2ng \u0111\u1eddi c\u1ee7a m\u1ed9t HTTP request, m\u1ed9t phi\u00ean l\u00e0m vi\u1ec7c c\u1ee7a ng\u01b0\u1eddi d\u00f9ng, ho\u1eb7c to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi c\u1ee7a web application.<\/li>\n<\/ul>\n\n\n\n<p>Vi\u1ec7c ch\u1ecdn sai scope c\u00f3 th\u1ec3 d\u1eabn \u0111\u1ebfn nh\u1eefng l\u1ed7i kh\u00f3 l\u01b0\u1eddng, v\u00ed d\u1ee5 nh\u01b0 chia s\u1ebb d\u1eef li\u1ec7u c\u1ee7a m\u1ed9t ng\u01b0\u1eddi d\u00f9ng cho t\u1ea5t c\u1ea3 ng\u01b0\u1eddi d\u00f9ng kh\u00e1c n\u1ebfu m\u1ed9t bean c\u00f3 tr\u1ea1ng th\u00e1i l\u1ea1i \u0111\u01b0\u1ee3c khai b\u00e1o l\u00e0 singleton. Hi\u1ec3u r\u00f5 v\u1ec1 scope gi\u00fap b\u1ea1n t\u1ed1i \u01b0u h\u00f3a vi\u1ec7c s\u1eed d\u1ee5ng t\u00e0i nguy\u00ean v\u00e0 \u0111\u1ea3m b\u1ea3o \u1ee9ng d\u1ee5ng ho\u1ea1t \u0111\u1ed9ng ch\u00ednh x\u00e1c.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-spring-core\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Spring_Core\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Spring Core<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-inversion-of-control-ioc-va-dependency-injection-di-co-ph\u1ea3i-la-m\u1ed9t-khong\"><strong>Inversion of Control (IoC) v\u00e0 Dependency Injection (DI) c\u00f3 ph\u1ea3i l\u00e0 m\u1ed9t kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Kh\u00f4ng ho\u00e0n to\u00e0n. <strong>IoC l\u00e0 m\u1ed9t nguy\u00ean l\u00fd thi\u1ebft k\u1ebf<\/strong> r\u1ed9ng l\u1edbn, trong \u0111\u00f3 quy\u1ec1n \u0111i\u1ec1u khi\u1ec3n lu\u1ed3ng th\u1ef1c thi c\u1ee7a m\u1ed9t ph\u1ea7n ch\u01b0\u01a1ng tr\u00ecnh \u0111\u01b0\u1ee3c chuy\u1ec3n cho m\u1ed9t framework ho\u1eb7c container b\u00ean ngo\u00e0i. Thay v\u00ec code c\u1ee7a b\u1ea1n ch\u1ee7 \u0111\u1ed9ng t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng, container s\u1ebd l\u00e0m \u0111i\u1ec1u \u0111\u00f3.<\/p>\n\n\n\n<p><strong>DI l\u00e0 m\u1ed9t m\u1eabu thi\u1ebft k\u1ebf (design pattern) c\u1ee5 th\u1ec3 \u0111\u1ec3 hi\u1ec7n th\u1ef1c h\u00f3a nguy\u00ean l\u00fd IoC<\/strong>. N\u00f3 l\u00e0 <em>c\u00e1ch th\u1ee9c<\/em> m\u00e0 container cung c\u1ea5p c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng ph\u1ee5 thu\u1ed9c (dependencies) cho m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng kh\u00e1c. C\u00f3 th\u1ec3 n\u00f3i, DI l\u00e0 h\u00e0nh \u0111\u1ed9ng, c\u00f2n IoC l\u00e0 tri\u1ebft l\u00fd \u0111\u1eb1ng sau h\u00e0nh \u0111\u1ed9ng \u0111\u00f3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-s\u1ef1-khac-bi\u1ec7t-chinh-gi\u1eefa-beanfactory-va-applicationcontext-la-gi\"><strong>S\u1ef1 kh\u00e1c bi\u1ec7t ch\u00ednh gi\u1eefa <code>BeanFactory<\/code> v\u00e0 <code>ApplicationContext<\/code> l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p><code>ApplicationContext<\/code> l\u00e0 m\u1ed9t giao di\u1ec7n k\u1ebf th\u1eeba v\u00e0 m\u1edf r\u1ed9ng t\u1eeb <code>BeanFactory<\/code>. <code>ApplicationContext<\/code> bao g\u1ed3m t\u1ea5t c\u1ea3 ch\u1ee9c n\u0103ng c\u1ee7a <code>BeanFactory<\/code> v\u00e0 cung c\u1ea5p th\u00eam nhi\u1ec1u t\u00ednh n\u0103ng cao c\u1ea5p h\u01a1n nh\u01b0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u1ef1 \u0111\u1ed9ng \u0111\u0103ng k\u00fd c\u00e1c bean post-processor.<\/li>\n\n\n\n<li>Qu\u1ea3n l\u00fd v\u00e0 truy\u1ec1n b\u00e1 s\u1ef1 ki\u1ec7n (event propagation).<\/li>\n\n\n\n<li>T\u00edch h\u1ee3p d\u1ec5 d\u00e0ng h\u01a1n v\u1edbi AOP v\u00e0 c\u00e1c t\u00ednh n\u0103ng web.<\/li>\n\n\n\n<li>H\u1ed7 tr\u1ee3 qu\u1ed1c t\u1ebf h\u00f3a (i18n).<\/li>\n<\/ul>\n\n\n\n<p>M\u1ed9t kh\u00e1c bi\u1ec7t quan tr\u1ecdng n\u1eefa l\u00e0 <code>ApplicationContext <\/code>m\u1eb7c \u0111\u1ecbnh s\u1ebd kh\u1edfi t\u1ea1o t\u1ea5t c\u1ea3 c\u00e1c bean c\u00f3 scope singleton ngay khi kh\u1edfi \u0111\u1ed9ng, gi\u00fap ph\u00e1t hi\u1ec7n l\u1ed7i c\u1ea5u h\u00ecnh s\u1edbm. Trong khi \u0111\u00f3, <code>BeanFactory<\/code> s\u1eed d\u1ee5ng c\u01a1 ch\u1ebf lazy-loading, ch\u1ec9 kh\u1edfi t\u1ea1o bean khi n\u00f3 \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u.<\/p>\n\n\n\n<p>Trong h\u1ea7u h\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng, b\u1ea1n n\u00ean lu\u00f4n \u01b0u ti\u00ean s\u1eed d\u1ee5ng <code>ApplicationContext<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-annotation-autowired-ho\u1ea1t-d\u1ed9ng-nh\u01b0-th\u1ebf-nao\"><strong>Annotation <\/strong><strong>@Autowired<\/strong><strong> ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p><code>@Autowired<\/code> l\u00e0 m\u1ed9t annotation \u0111\u00e1nh d\u1ea5u m\u1ed9t \u0111i\u1ec3m c\u1ea7n ti\u00eam ph\u1ee5 thu\u1ed9c (injection point). Khi Spring Container t\u1ea1o m\u1ed9t bean, n\u00f3 s\u1ebd qu\u00e9t qua c\u00e1c tr\u01b0\u1eddng (field), constructor, v\u00e0 ph\u01b0\u01a1ng th\u1ee9c c\u1ee7a bean \u0111\u00f3. N\u1ebfu th\u1ea5y annotation <code>@Autowired<\/code>, n\u00f3 s\u1ebd:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>X\u00e1c \u0111\u1ecbnh ki\u1ec3u d\u1eef li\u1ec7u c\u1ee7a dependency c\u1ea7n ti\u00eam (v\u00ed d\u1ee5: OrderRepository).<\/li>\n\n\n\n<li>T\u00ecm ki\u1ebfm trong context c\u1ee7a n\u00f3 m\u1ed9t bean \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111\u0103ng k\u00fd v\u00e0 c\u00f3 ki\u1ec3u t\u01b0\u01a1ng th\u00edch.<\/li>\n\n\n\n<li>&#8220;Ti\u00eam&#8221; (inject) bean t\u00ecm th\u1ea5y v\u00e0o v\u1ecb tr\u00ed \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u.<\/li>\n<\/ol>\n\n\n\n<p>\u0110\u00e2y ch\u00ednh l\u00e0 c\u01a1 ch\u1ebf DI d\u1ef1a tr\u00ean annotation \u0111ang ho\u1ea1t \u0111\u1ed9ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-t\u1ea1i-sao-nen-\u01b0u-tien-constructor-injection-thay-vi-field-injection\"><strong>T\u1ea1i sao n\u00ean \u01b0u ti\u00ean Constructor Injection thay v\u00ec Field Injection?<\/strong><\/h3>\n\n\n\n<p>M\u1eb7c d\u00f9 Field Injection (d\u00f9ng <code>@Autowired<\/code> tr\u1ef1c ti\u1ebfp tr\u00ean tr\u01b0\u1eddng) c\u00f3 v\u1ebb ng\u1eafn g\u1ecdn h\u01a1n, Constructor Injection \u0111\u01b0\u1ee3c khuy\u1ebfn kh\u00edch m\u1ea1nh m\u1ebd v\u00ec c\u00e1c l\u00fd do sau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T\u00ednh b\u1ea5t bi\u1ebfn (Immutability):<\/strong> C\u00e1c dependency c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c khai b\u00e1o l\u00e0 final, \u0111\u1ea3m b\u1ea3o ch\u00fang kh\u00f4ng th\u1ec3 b\u1ecb thay \u0111\u1ed5i sau khi \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c t\u1ea1o.<\/li>\n\n\n\n<li><strong>\u0110\u1ea3m b\u1ea3o t\u00ednh to\u00e0n v\u1eb9n:<\/strong> \u0110\u1ed1i t\u01b0\u1ee3ng kh\u00f4ng th\u1ec3 \u0111\u01b0\u1ee3c kh\u1edfi t\u1ea1o n\u1ebfu thi\u1ebfu dependency, do \u0111\u00f3 n\u00f3 lu\u00f4n \u1edf tr\u1ea1ng th\u00e1i h\u1ee3p l\u1ec7.<\/li>\n\n\n\n<li><strong>D\u1ec5 d\u00e0ng cho Unit Test:<\/strong> B\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng kh\u1edfi t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng trong c\u00e1c b\u00e0i test b\u1eb1ng c\u00e1ch d\u00f9ng <code>new<\/code> v\u00e0 truy\u1ec1n c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng mock v\u00e0o constructor m\u00e0 kh\u00f4ng c\u1ea7n \u0111\u1ebfn Spring context.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-l\u1eadp-trinh-h\u01b0\u1edbng-khia-c\u1ea1nh-aop-th\u01b0\u1eddng-d\u01b0\u1ee3c-dung-d\u1ec3-lam-gi-trong-th\u1ef1c-t\u1ebf\"><strong>L\u1eadp tr\u00ecnh h\u01b0\u1edbng kh\u00eda c\u1ea1nh (AOP) th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 l\u00e0m g\u00ec trong th\u1ef1c t\u1ebf?<\/strong><\/h3>\n\n\n\n<p>AOP c\u1ef1c k\u1ef3 h\u1eefu \u00edch \u0111\u1ec3 t\u00e1ch bi\u1ec7t c\u00e1c <strong>&#8220;cross-cutting concerns&#8221;<\/strong>. C\u00e1c \u1ee9ng d\u1ee5ng ph\u1ed5 bi\u1ebfn nh\u1ea5t c\u1ee7a n\u00f3 bao g\u1ed3m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Logging v\u00e0 Auditing:<\/strong> Ghi l\u1ea1i log khi v\u00e0o\/ra m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c ho\u1eb7c ghi l\u1ea1i d\u1ea5u v\u1ebft h\u00e0nh \u0111\u1ed9ng c\u1ee7a ng\u01b0\u1eddi d\u00f9ng.<\/li>\n\n\n\n<li><strong>Qu\u1ea3n l\u00fd Transaction:<\/strong> T\u1ef1 \u0111\u1ed9ng b\u1eaft \u0111\u1ea7u, commit ho\u1eb7c rollback c\u00e1c giao d\u1ecbch c\u01a1 s\u1edf d\u1eef li\u1ec7u. (<code>@Transactional<\/code> c\u1ee7a Spring ch\u00ednh l\u00e0 m\u1ed9t v\u00ed d\u1ee5 \u0111i\u1ec3n h\u00ecnh).<\/li>\n\n\n\n<li><strong>Security:<\/strong> Ki\u1ec3m tra quy\u1ec1n truy c\u1eadp tr\u01b0\u1edbc khi th\u1ef1c thi m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c nh\u1ea1y c\u1ea3m.<\/li>\n\n\n\n<li><strong>Caching:<\/strong> L\u01b0u k\u1ebft qu\u1ea3 c\u1ee7a m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c v\u00e0 tr\u1ea3 v\u1ec1 t\u1eeb cache cho c\u00e1c l\u1ea7n g\u1ecdi ti\u1ebfp theo v\u1edbi c\u00f9ng tham s\u1ed1.<\/li>\n\n\n\n<li><strong>Performance Monitoring:<\/strong> \u0110o th\u1eddi gian th\u1ef1c thi c\u1ee7a c\u00e1c ph\u01b0\u01a1ng th\u1ee9c quan tr\u1ecdng.<\/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>Spring Core kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t module k\u1ef9 thu\u1eadt m\u00e0 l\u00e0 n\u1ec1n t\u1ea3ng tri\u1ebft l\u00fd \u0111\u1ecbnh h\u00ecnh n\u00ean to\u00e0n b\u1ed9 Spring Framework. Thay v\u00ec cung c\u1ea5p m\u1ed9t b\u1ed9 c\u00f4ng c\u1ee5 \u0111\u01a1n thu\u1ea7n, n\u00f3 mang \u0111\u1ebfn m\u1ed9t m\u00f4 h\u00ecnh ph\u00e1t tri\u1ec3n d\u1ef1a tr\u00ean c\u00e1c nguy\u00ean t\u1eafc thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m v\u1eefng ch\u1eafc.<\/p>\n\n\n\n<p>Qua b\u00e0i vi\u1ebft n\u00e0y, ch\u00fang ta \u0111\u00e3 b\u00f3c t\u00e1ch c\u00e1c kh\u00e1i ni\u1ec7m tr\u1ecdng t\u00e2m: t\u1eeb <strong>Inversion of Control<\/strong> v\u00e0 <strong>Dependency Injection<\/strong> gi\u00fap t\u1ea1o ra c\u00e1c th\u00e0nh ph\u1ea7n c\u00f3 li\u00ean k\u1ebft l\u1ecfng l\u1ebbo, cho \u0111\u1ebfn vai tr\u00f2 c\u1ee7a <strong>IoC Container<\/strong> trong vi\u1ec7c qu\u1ea3n l\u00fd v\u00f2ng \u0111\u1eddi c\u1ee7a <strong>Beans<\/strong>, v\u00e0 s\u1ee9c m\u1ea1nh c\u1ee7a <strong>AOP<\/strong> trong vi\u1ec7c module h\u00f3a c\u00e1c ch\u1ee9c n\u0103ng xuy\u00ean su\u1ed1t.<\/p>\n\n\n\n<p>Vi\u1ec7c n\u1eafm v\u1eefng Spring Core kh\u00f4ng ch\u1ec9 gi\u00fap b\u1ea1n s\u1eed d\u1ee5ng framework m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3 h\u01a1n, m\u00e0 quan tr\u1ecdng h\u01a1n, n\u00f3 gi\u00fap b\u1ea1n x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c nh\u1eefng \u1ee9ng d\u1ee5ng d\u1ec5 ki\u1ec3m th\u1eed, d\u1ec5 b\u1ea3o tr\u00ec v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng. N\u1ec1n t\u1ea3ng ki\u1ebfn th\u1ee9c v\u1eefng ch\u1eafc v\u1ec1 &#8220;tr\u00e1i tim&#8221; c\u1ee7a Spring s\u1ebd l\u00e0 ch\u00eca kh\u00f3a \u0111\u1ec3 b\u1ea1n t\u1ef1 tin chinh ph\u1ee5c c\u00e1c module v\u00e0 d\u1ef1 \u00e1n ph\u1ee9c t\u1ea1p h\u01a1n trong h\u1ec7 sinh th\u00e1i Spring r\u1ed9ng l\u1edbn.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Khi l\u00e0m vi\u1ec7c v\u1edbi Spring Framework, c\u00f3 th\u1ec3 b\u1ea1n \u0111\u00e3 quen thu\u1ed9c v\u1edbi c\u00e1c module nh\u01b0 Spring Boot gi\u00fap kh\u1edfi t\u1ea1o \u1ee9ng d\u1ee5ng nhanh ch\u00f3ng hay Spring MVC \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c API web. Nh\u01b0ng \u0111\u00e3 bao gi\u1edd b\u1ea1n t\u1ef1 h\u1ecfi, \u0111i\u1ec1u g\u00ec n\u1eb1m \u1edf trung t\u00e2m, v\u1eadn h\u00e0nh c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng k\u1ebft n\u1ed1i [&hellip;]<\/p>\n","protected":false},"author":203,"featured_media":93119,"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-91560","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.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Spring Core l\u00e0 n\u1ec1n m\u00f3ng c\u1ee7a Spring Framework. L\u00e0m ch\u1ee7 IoC, DI, AOP v\u00e0 c\u1ea5u h\u00ecnh Bean \u0111\u1ec3 x\u00e2y \u1ee9ng d\u1ee5ng s\u1ea1ch, d\u1ec5 test v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng ngay t\u1eeb g\u1ed1c.\" \/>\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-core-la-gi\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework\" \/>\n<meta property=\"og:description\" content=\"Khi l\u00e0m vi\u1ec7c v\u1edbi Spring Framework, c\u00f3 th\u1ec3 b\u1ea1n \u0111\u00e3 quen thu\u1ed9c v\u1edbi c\u00e1c module nh\u01b0 Spring Boot gi\u00fap kh\u1edfi t\u1ea1o \u1ee9ng d\u1ee5ng nhanh ch\u00f3ng hay Spring MVC \u0111\u1ec3 x\u00e2y d\u1ef1ng\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/spring-core-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-11-24T08:35:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-24T08:35:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-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=\"21 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework - ITviec Blog","description":"Spring Core l\u00e0 n\u1ec1n m\u00f3ng c\u1ee7a Spring Framework. L\u00e0m ch\u1ee7 IoC, DI, AOP v\u00e0 c\u1ea5u h\u00ecnh Bean \u0111\u1ec3 x\u00e2y \u1ee9ng d\u1ee5ng s\u1ea1ch, d\u1ec5 test v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng ngay t\u1eeb g\u1ed1c.","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-core-la-gi\/","og_locale":"vi_VN","og_type":"article","og_title":"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework","og_description":"Khi l\u00e0m vi\u1ec7c v\u1edbi Spring Framework, c\u00f3 th\u1ec3 b\u1ea1n \u0111\u00e3 quen thu\u1ed9c v\u1edbi c\u00e1c module nh\u01b0 Spring Boot gi\u00fap kh\u1edfi t\u1ea1o \u1ee9ng d\u1ee5ng nhanh ch\u00f3ng hay Spring MVC \u0111\u1ec3 x\u00e2y d\u1ef1ng","og_url":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-11-24T08:35:50+00:00","article_modified_time":"2025-11-24T08:35:53+00:00","og_image":[{"width":800,"height":421,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-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":"21 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/"},"author":{"name":"Tien Tran","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/1595d671c49cfa2a48cd3c0a047a1298"},"headline":"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework","datePublished":"2025-11-24T08:35:50+00:00","dateModified":"2025-11-24T08:35:53+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/"},"wordCount":5580,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT","Java"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/","url":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/","name":"Spring Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-scaled.png","datePublished":"2025-11-24T08:35:50+00:00","dateModified":"2025-11-24T08:35:53+00:00","description":"Spring Core l\u00e0 n\u1ec1n m\u00f3ng c\u1ee7a Spring Framework. L\u00e0m ch\u1ee7 IoC, DI, AOP v\u00e0 c\u1ea5u h\u00ecnh Bean \u0111\u1ec3 x\u00e2y \u1ee9ng d\u1ee5ng s\u1ea1ch, d\u1ec5 test v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng ngay t\u1eeb g\u1ed1c.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/spring-core-la-gi\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/spring-core-la-gi\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/11\/spring-core-scaled.png","width":800,"height":421,"caption":"spring core - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/spring-core-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 Core l\u00e0 g\u00ec: Hi\u1ec3u r\u00f5 IoC, DI, AOP \u0111\u1ec3 l\u00e0m ch\u1ee7 Spring Framework"}]},{"@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\/91560","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=91560"}],"version-history":[{"count":4,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/91560\/revisions"}],"predecessor-version":[{"id":93122,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/91560\/revisions\/93122"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/93119"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=91560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=91560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=91560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}