<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Dependency Injection Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/tag/dependency-injection/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/tag/dependency-injection/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Tue, 05 Mar 2024 06:19:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Dependency Injection Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/tag/dependency-injection/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Dependency Injection (DI) framework &#8211; Google Guice</title>
		<link>https://blog.tomosia.com.vn/dependency-injection-di-framework-google-guice/</link>
					<comments>https://blog.tomosia.com.vn/dependency-injection-di-framework-google-guice/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Tue, 05 Mar 2024 06:19:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Guice]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3189</guid>

					<description><![CDATA[<p>Trong bài trước, chúng ta đã được đi tìm hiểu Dependency Injection là gì. Tiếp tục chuỗi thông&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/dependency-injection-di-framework-google-guice/">Dependency Injection (DI) framework &#8211; Google Guice</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p style="font-size:16px">Trong bài trước, chúng ta đã được đi tìm hiểu <strong><a href="http://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/">Dependency Injection</a></strong> là gì. Tiếp tục chuỗi thông não, chúng ta cùng nhau làm tý &#8220;inova&#8221; với cái thằng Google Guice này nhé.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="332" height="456" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/03/1_OXaU46Rv8B3MV7YuaAanaA.png" alt="" class="wp-image-3190" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/03/1_OXaU46Rv8B3MV7YuaAanaA.png 332w, https://blog.tomosia.com.vn/wp-content/uploads/2024/03/1_OXaU46Rv8B3MV7YuaAanaA-218x300.png 218w" sizes="(max-width: 332px) 100vw, 332px" /></figure>
</div>


<h2 id="1-google-guice-la-gi" class="wp-block-heading" style="font-size:30px"><strong>1. Google Guice là gì?</strong></h2>



<p style="font-size:16px"><strong>Google Guice</strong> là một framework DI gọn nhẹ, mã nguồn mở giúp chúng ta phát triển các ứng dụng dạng module được phát triển và quản lý bởi Google. Guice hỗ trợ từ Java 6 trở lên nhé anh em.</p>



<p style="font-size:16px">Trong Guice, annotation&nbsp;<strong>@Inject</strong>&nbsp;được sử dụng để tiêm phụ thuộc. Nó cho phép chúng ta inject sự phụ thuộc tại các constructor, field hoặc method. Sử dụng Guice, chúng ta có thể xác định scope của instance đối tượng phụ thuộc. Nó cũng có các tính năng để tích hợp với Spring và&nbsp;<a href="https://github.com/google/guice/wiki/AOP">Aspect Oriented Programming (AOP)</a>.</p>



<h2 id="2-cai-dat-google-guice" class="wp-block-heading" style="font-size:30px"><strong>2. Cài đặt&nbsp;Google Guice</strong></h2>



<p style="font-size:16px">Để sử dụng<strong> Google Guice</strong>, anh em thêm thư viện Guice vào trong file <em>pom.xml</em> như sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="&lt;!-- https://mvnrepository.com/artifact/com.google.inject/guice --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.google.inject&lt;/groupId&gt;
    &lt;artifactId&gt;guice&lt;/artifactId&gt;
    &lt;version&gt;4.2.2&lt;/version&gt;
&lt;/dependency&gt;" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">&lt;!--</span><span style="color: #F6F6F4"> https</span><span style="color: #F286C4">:</span><span style="color: #7B7F8B">//mvnrepository.com/artifact/com.google.inject/guice --&gt;</span></span>
<span class="line"><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4">dependency</span><span style="color: #F286C4">&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4">groupId</span><span style="color: #F286C4">&gt;</span><span style="color: #F6F6F4">com.google.inject</span><span style="color: #F286C4">&lt;/</span><span style="color: #F6F6F4">groupId</span><span style="color: #F286C4">&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4">artifactId</span><span style="color: #F286C4">&gt;</span><span style="color: #F6F6F4">guice</span><span style="color: #F286C4">&lt;/</span><span style="color: #F6F6F4">artifactId</span><span style="color: #F286C4">&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4">version</span><span style="color: #F286C4">&gt;</span><span style="color: #BF9EEE">4.2</span><span style="color: #F6F6F4">.</span><span style="color: #EE6666; font-style: italic; text-decoration: underline">2</span><span style="color: #F286C4">&lt;/</span><span style="color: #F6F6F4">version</span><span style="color: #F286C4">&gt;</span></span>
<span class="line"><span style="color: #F286C4">&lt;/</span><span style="color: #F6F6F4">dependency</span><span style="color: #F286C4">&gt;</span></span></code></pre></div>



<p style="font-size:16px">Hoặc muốn sử dụng các version khác thì anh em có thể truy cập vào 👉 <a href="https://mvnrepository.com/artifact/com.google.inject/guice">đây</a> 👈. Cứ version nào nhiều người sử dụng mà &#8220;phang&#8221; thôi =))). </p>



<h2 id="3-vi-du-co-ban-ve-dependency-injection-voi-google-guice" class="wp-block-heading" style="font-size:30px"><strong>3. Ví dụ cơ bản về Dependency Injection với Google Guice</strong></h2>



<p style="font-size:16px">Để sử dụng Guice cần nhớ 2 thông tin quan trọng sau:</p>



<ul class="wp-block-list">
<li style="font-size:16px">Nói với Guice cái gì cần được inject với annotation&nbsp;<strong>@Inject</strong>.</li>



<li style="font-size:16px">Nói với Guice cách inject mô-đun:&nbsp;implement&nbsp;<strong>Asbstract Module</strong>, bind các interface với các implementation mong muốn.</li>
</ul>



<p style="font-size:16px">Quay trở lại với ví dụ em gái Eimi Fukada trong bài <a href="http://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/">trước</a> lần này tôi sẽ sử dụng Guice nha:</p>



<p style="font-size:16px">GuiceModule.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.blogtms;

import com.google.inject.AbstractModule;

public class GuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Outfit.class).to(Bikini.class);
        bind(Accessories.class).to(GucciAccessories.class);
        bind(HairStyle.class).to(KoreanHairStyle.class);
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.blogtms</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> com.google.inject.AbstractModule;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">GuiceModule</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">extends</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">AbstractModule</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    @</span><span style="color: #97E1F1; font-style: italic">Override</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">protected</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">configure</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #62E884">bind</span><span style="color: #F6F6F4">(Outfit.class).</span><span style="color: #62E884">to</span><span style="color: #F6F6F4">(Bikini.class);</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #62E884">bind</span><span style="color: #F6F6F4">(Accessories.class).</span><span style="color: #62E884">to</span><span style="color: #F6F6F4">(GucciAccessories.class);</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #62E884">bind</span><span style="color: #F6F6F4">(HairStyle.class).</span><span style="color: #62E884">to</span><span style="color: #F6F6F4">(KoreanHairStyle.class);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p style="font-size:16px">Girl.java thêm @Inject</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.blogtms;

import com.google.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//@Component
public class Girl {

    @Autowired
    Outfit outfit;

    @Autowired
    Accessories accessories;

    @Autowired
    HairStyle hairStyle;

    @Inject
    public Girl(Outfit outfit, Accessories accessories, HairStyle hairStyle) {
        this.outfit = outfit;
        this.accessories = accessories;
        this.hairStyle = hairStyle;
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.blogtms</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> com.google.inject.Inject;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.beans.factory.annotation.Autowired;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.stereotype.Component;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">//@Component</span></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Girl</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    @</span><span style="color: #97E1F1; font-style: italic">Autowired</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> outfit;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    @</span><span style="color: #97E1F1; font-style: italic">Autowired</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">Accessories</span><span style="color: #F6F6F4"> accessories;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    @</span><span style="color: #97E1F1; font-style: italic">Autowired</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">HairStyle</span><span style="color: #F6F6F4"> hairStyle;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    @</span><span style="color: #97E1F1; font-style: italic">Inject</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Girl</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">outfit</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1; font-style: italic">Accessories</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">accessories</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1; font-style: italic">HairStyle</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">hairStyle</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">this</span><span style="color: #F6F6F4">.outfit </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> outfit;</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">this</span><span style="color: #F6F6F4">.accessories </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> accessories;</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">this</span><span style="color: #F6F6F4">.hairStyle </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> hairStyle;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p style="font-size:16px">Main.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.blogtms;

import com.google.inject.Guice;
import com.google.inject.Injector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

//@SpringBootApplication
public class Main {
    public static void main(String[] args) {
//        ApplicationContext context = SpringApplication.run(Main.class, args);
//
//        Girl girl = context.getBean(Girl.class);

        Injector injector = Guice.createInjector(new GuiceModule());

        Girl girl = injector.getInstance(Girl.class);
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.blogtms</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> com.google.inject.Guice;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> com.google.inject.Injector;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.boot.SpringApplication;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.boot.autoconfigure.SpringBootApplication;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.context.ApplicationContext;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">//@SpringBootApplication</span></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Main</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">static</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">main</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">[] </span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #7B7F8B">//        ApplicationContext context = SpringApplication.run(Main.class, args);</span></span>
<span class="line"><span style="color: #7B7F8B">//</span></span>
<span class="line"><span style="color: #7B7F8B">//        Girl girl = context.getBean(Girl.class);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">Injector</span><span style="color: #F6F6F4"> injector </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> Guice.</span><span style="color: #62E884">createInjector</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">GuiceModule</span><span style="color: #F6F6F4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">Girl</span><span style="color: #F6F6F4"> girl </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> injector.</span><span style="color: #62E884">getInstance</span><span style="color: #F6F6F4">(Girl.class);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p style="font-size:16px">Thế là xong rồi =))) </p>



<p style="font-size:16px">Trong ví dụ trên, chúng ta thấy một số phần thay đổi so với ví dụ ở bài trước:</p>



<ul class="wp-block-list">
<li style="font-size:16px">Tạo một class extends từ&nbsp;<strong>AbstractModule</strong>, lớp này được sử dụng để định nghĩa cách mà một class/ interface sẽ được inject bởi một implement cụ thể nào. Trong ví dụ này, <em>Outfit</em> sẽ được inject bởi implement&nbsp;<em>Bikini</em>.</li>



<li style="font-size:16px">Lớp <em>Girl</em> có dependency với&nbsp;<em>Outfit</em>. Trong ví dụ này, chúng ta sử dụng&nbsp;@Inject tại hàm xây dựng (constructor) để inject đối tượng&nbsp;<em>Outfit</em>.</li>



<li style="font-size:16px">Khởi tạo Guice Injector với config.</li>



<li style="font-size:16px">Lấy thể hiện đối tượng với các dependency để sử dụng.</li>
</ul>



<h2 id="4-scope-trong-google-guice" class="wp-block-heading" style="font-size:30px"><strong>4. Scope trong&nbsp;Google Guice</strong></h2>



<p style="font-size:16px">Theo mặc định, Guice trả về một instance mới mỗi lần nó cần cung cấp một giá trị. Hành vi này có thể cấu hình thông qua phạm vi (<a href="https://github.com/google/guice/wiki/Scopes">scope</a>). Scope cho phép chúng ta tái sử dụng instance.</p>



<p style="font-size:16px">Các loại Scope được hỗ trợ bởi&nbsp;Google Guice:</p>



<ul class="wp-block-list">
<li style="font-size:16px"><strong>@Singleton</strong>&nbsp;: một instance duy nhất được sử dụng trong toàn bộ ứng dụng.</li>



<li style="font-size:16px"><strong>@SessionScoped</strong>&nbsp;: mỗi session sẽ có một instance khác nhau.</li>



<li style="font-size:16px"><strong>@RequestScoped</strong>&nbsp;: mỗi request sẽ có một instance khác nhau.</li>
</ul>



<p style="font-size:16px">Trên đây là giới thiệu cơ bản về Google Guice.&nbsp;Nó cung cấp một cách tiếp cận mới cho&nbsp;<a href="http://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/"><strong>Dependency Injection</strong></a>, tận dụng thế mạnh của&nbsp;<strong>Annotation</strong>&nbsp;và&nbsp;<strong>Generic</strong>&nbsp;để giúp chúng ta dễ dàng hơn trong việc quản lý và sử dụng các Dependency, cũng như dễ dàng phát triển các ứng dụng dạng module.</p>



<p style="font-size:16px"><strong>Tài liệu tham khảo:</strong></p>



<ul class="wp-block-list">
<li style="font-size:16px"><a href="https://github.com/google/guice">https://github.com/google/guice</a></li>



<li style="font-size:16px"><a href="https://www.tutorialspoint.com/guice/index.htm">https://www.tutorialspoint.com/guice/index.htm</a></li>
</ul>



<p style="font-size:16px">Cảm ơn anh em đã theo dõi bài viết 🙋‍♂️. Vẫn như mọi khi, <a href="https://github.com/chienhnc/di">đây là source code</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/dependency-injection-di-framework-google-guice/">Dependency Injection (DI) framework &#8211; Google Guice</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/dependency-injection-di-framework-google-guice/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Thông não Dependency Injection bằng Eimi Fukada</title>
		<link>https://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/</link>
					<comments>https://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Fri, 01 Mar 2024 02:39:09 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Solution]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3173</guid>

					<description><![CDATA[<p>Hello what&#8217;s up, dạo này anh em còn bị chửi code như shit nữa không nhờ. Tôi thì&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/">Thông não Dependency Injection bằng Eimi Fukada</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p style="font-size:16px">Hello what&#8217;s up, dạo này anh em còn bị chửi code như shit nữa không nhờ. Tôi thì vẫn thế =)))), vẫn như shit nhưng hôm nay tôi muốn giới thiệu đến anh em một kỹ thuật mới là <strong>Dependency Injection</strong> để code của anh em đỡ bốc mùi hơn một chút nhé, vào việc.</p>



<h2 id="1-dependency-injection-la-gi" class="wp-block-heading" style="font-size:30px"><strong>1. Dependency Injection là gì?</strong></h2>



<p>Theo tài liệu thì:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p style="font-size:16px">Dependency Injection is a design pattern, &#8230;</p>
</blockquote>



<p style="font-size:16px">Nôm na Dependency Injection (DI) là một kỹ thuật cho phép xóa bỏ sự phụ thuộc giữa các module, làm cho ứng dụng dễ dàng hơn trong việc thay đổi module, bảo trì code và&nbsp;testing.</p>



<p style="font-size:16px"><strong>DI</strong>&nbsp;cung cấp cho một đối tượng các thể hiện phụ thuộc (dependencies) của nó&nbsp;từ bên ngoài truyền vào mà không phải khởi tạo trực tiếp từ trong class sử dụng.</p>



<h2 id="2-nhiem-vu-cua-dependency-injection" class="wp-block-heading" style="font-size:30px"><strong>2. Nhiệm vụ của dependency injection</strong></h2>



<ul class="wp-block-list">
<li style="font-size:16px">Tạo các đối tượng.</li>



<li style="font-size:16px">Quản lý sự phụ thuộc (dependencies) giữa các đối tượng.</li>



<li style="font-size:16px">Cung cấp (inject) các phụ thuộc được yêu cầu cho đối tượng (được truyền từ bên ngoài đối tượng).</li>
</ul>



<h2 id="3-nguyen-tac-hoat-dong-cua-di" class="wp-block-heading" style="font-size:30px"><strong>3. Nguyên tắc hoạt động của&nbsp;DI</strong></h2>



<ul class="wp-block-list">
<li style="font-size:16px">Các module không giao tiếp trực tiếp với nhau, mà thông qua interface. Module cấp thấp sẽ implement interface, module cấp cao sẽ gọi module cấp thấp thông qua interface.</li>



<li style="font-size:16px">Việc khởi tạo các module cấp thấp sẽ do DI Container/ IoC Container thực hiện.</li>



<li style="font-size:16px">Việc Module nào gắn với interface nào sẽ được config trong file properties, trong file XML hoặc thông qua Annotation. Annotation là một cách thường được sử dụng trong các Framework, chẳng hạn như @Inject với&nbsp;<a href="http://www.cdi-spec.org/">CDI</a>, @Autowired với&nbsp;<a href="https://spring.io/">Spring</a>&nbsp;hay @ManagedProperty với&nbsp;<a href="https://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html">JSF</a>.</li>
</ul>



<h2 id="4-cac-dang-dependency-injection" class="wp-block-heading" style="font-size:30px"><strong>4. Các dạng Dependency Injection</strong></h2>



<ul class="wp-block-list">
<li style="font-size:16px"><strong>Constructor Injection</strong>: Các dependency sẽ được container&nbsp;truyền vào (inject vào)&nbsp;1 class thông qua constructor của class đó. Đây là cách thông dụng nhất.</li>



<li style="font-size:16px"><strong>Setter Injection</strong>: Các dependency sẽ được truyền vào 1 class thông qua các hàm Setter.</li>



<li style="font-size:16px"><strong>Fields/ properties</strong>: Các dependency sẽ được truyền vào 1 class một cách trực tiếp vào các field.</li>



<li style="font-size:16px"><strong>Interface Injection</strong>: Class cần inject sẽ implement 1 interface. Interface này chứa 1 hàm tên&nbsp;Inject. Container sẽ injection dependency vào 1 class thông qua việc gọi hàm&nbsp;Inject&nbsp;của interface đó. Đây là cách rườm rà và cũng ít được sử dụng.</li>



<li style="font-size:16px"><strong>Service Locator</strong>: nó hoạt động như một mapper, cho phép thay đổi code tại thời điểm run-time mà không cần biên dịch lại ứng dụng hoặc phải khởi động lại.</li>
</ul>



<p style="font-size:16px">Anh em đọc đến đây đã hiểu <strong>Dependency Injection</strong> là gì chưa? Anh em nào đã thông não thì có thể bỏ qua, anh em nào vẫn lơ tơ mơ thì tiếp tục, full hd không che phía dưới =)))).</p>



<h2 id="5-vi-du-su-dung-dependency-injection" class="wp-block-heading" style="font-size:30px"><strong>5. Ví dụ sử dụng Dependency Injection.</strong></h2>



<p style="font-size:16px">Bikini.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Bikini {
    public void wear() {
        System.out.println(&quot;Đã mặc bikini&quot;);
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Bikini</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">wear</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        System.out.</span><span style="color: #62E884">println</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Đã mặc bikini</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Girl.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Girl {

    private Bikini outfit = new Bikini();
    
    public void result() {
        outfit.wear();
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Girl</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Bikini</span><span style="color: #F6F6F4"> outfit </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Bikini</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">result</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        outfit.</span><span style="color: #62E884">wear</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Ví dụ anh em tạo 1 <strong>Girl</strong>, anh em sẽ tạo ra thêm 1 bộ&nbsp;<strong>Bikini</strong>&nbsp;đi kèm với cô gái đó. Lúc này,&nbsp;<code>Bikini</code>&nbsp;tồn tại mang ý nghĩa là&nbsp;<strong>dependency</strong>&nbsp;(phụ thuộc) của&nbsp;<strong>Girl</strong>.</p>



<p style="font-size:16px">Khi khởi tạo thuộc tính như này, vô tình tạo ra một điểm thắt nút trong chương trình, giả sử,&nbsp;<strong>Girl</strong>&nbsp;muốn mặc một bộ&nbsp;<em>Quần Jeans + áo hai dây</em> thì anh em sẽ phải thay class&nbsp;<strong>Bikini</strong>&nbsp;thành&nbsp;<strong>JeansWithTshirt</strong>(quần jeans với áo T-shirt) ư?</p>



<p style="font-size:16px">Hay nguy hiểm hơn, bộ đồ&nbsp;<strong>Bikini</strong>&nbsp;bị hỏng? (code lớp&nbsp;<strong>Bikini</strong>&nbsp;không hoạt động?) nó sẽ ảnh hưởng trực tiếp tới&nbsp;<strong>Girl</strong>.</p>



<p style="font-size:16px">Vấn đề là ở đó, chúng ta cùng đọc lại nguyên tắc D của <strong><a href="http://blog.tomosia.com.vn/solid-principles/">SOLID</a></strong>:</p>



<ul class="wp-block-list">
<li style="font-size:16px">Các mô-đun cấp cao không được nhập bất cứ thứ gì từ các mô-đun cấp thấp. Cả hai nên phụ thuộc vào sự trừu tượng</li>
</ul>



<p style="font-size:16px">Bây giờ chúng ta sẽ áp dụng <strong>Dependency Injection</strong> để giải quyết vấn đề trên.</p>



<p style="font-size:16px">Girl.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Girl {

    private final Outfit anything;

    public Girl(Outfit anything) {
        this.anything = anything;
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Girl</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">final</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> anything;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Girl</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">anything</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">this</span><span style="color: #F6F6F4">.anything </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> anything;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Bikini.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Bikini implements Outfit{
   @Override
    public void wear() {
        System.out.println(&quot;Đã mặc bikini&quot;);
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Bikini</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">   @</span><span style="color: #97E1F1; font-style: italic">Override</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">wear</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        System.out.</span><span style="color: #62E884">println</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Đã mặc bikini</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Outfit.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public interface Outfit {
    public void wear();
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Outfit</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">wear</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Main.java</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Main {
    public static void main(String[] args) {
        Outfit bikini = new Bikini();

        Girl fukada = new Girl(bikini);
        //Vậy là đã lấy được đối tượng Girl nha
    }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Main</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">static</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">main</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">[] </span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> bikini </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Bikini</span><span style="color: #F6F6F4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">Girl</span><span style="color: #F6F6F4"> fukada </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Girl</span><span style="color: #F6F6F4">(bikini);</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//Vậy là đã lấy được đối tượng Girl nha</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p style="font-size:16px">Với đoạn code ở trên, chúng ta đã&nbsp;<em>gần như</em>&nbsp;tách được&nbsp;<strong>Bikini</strong>&nbsp;ra hoàn toàn khỏi&nbsp;<strong>Girl</strong>. điều này làm giảm sự phụ thuộc giữa&nbsp;<strong>Girl</strong>&nbsp;và&nbsp;<strong>Bikini</strong>. Mà tăng tính tùy biến, linh hoạt cho&nbsp;<code>code</code>.</p>



<p style="font-size:16px">Bây giờ&nbsp;<strong>Girl</strong>&nbsp;sẽ hoạt động với&nbsp;<strong>Outfit</strong>&nbsp;mà thôi. Và&nbsp;<strong>Outfit</strong>&nbsp;ở đâu ra? Chúng ta&nbsp;<strong>tạo ra</strong>&nbsp;và&nbsp;<strong>đưa nó vào</strong>&nbsp;<code>(Inject)</code>&nbsp;cô gái&nbsp;<strong>Girl</strong>.</p>



<p style="font-size:16px">Khái niệm&nbsp;<code>Dependency Injection</code>&nbsp;từ đây mà ra: <br><em><mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><strong>Dependency Injection là việc các&nbsp;Object&nbsp;nên phụ thuộc vào các&nbsp;Abstract Class&nbsp;và thể hiện chi tiết của nó sẽ được&nbsp;Inject&nbsp;vào đối tượng lúc runtime.</strong></mark></em></p>



<p style="font-size:16px">Bây giờ muốn&nbsp;<strong>Girl</strong>&nbsp;mặc gì khác, anh em chỉ cần tạo một Class kế thừa&nbsp;<strong>Outfit</strong>&nbsp;và&nbsp;<em>Inject</em>&nbsp;nó vào&nbsp;<strong>Girl</strong>&nbsp;là xong!</p>



<p style="font-size:16px"><strong>Dependency Injection</strong>&nbsp;giúp chúng ta dễ dàng mở rộng&nbsp;<code>code</code>&nbsp;và giảm sự phụ thuộc giữa các dependency với nhau. Tuy nhiên, lúc này, khi code bạn sẽ phải kiêm thêm nhiệm vụ&nbsp;<strong>Inject dependency (tiêm sự phụ thuộc)</strong>. Thử tưởng tượng một&nbsp;<code>Class</code>&nbsp;có hàng chục dependency thì bạn sẽ phải tự tay inject từng ý cái. Việc này lại dẫn tới khó khăn trong việc code, quản lý code và dependency</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

public class Main {
    public static void main(String[] args) {
       Outfit bikini = new Bikini();
       Accessories gucci = new GucciAccessories();
       HairStyle hair = new KoreanHairStyle();
       Girl fukada = new Girl(bikini, gucci, hair);
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Main</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">static</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">main</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">[] </span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">       </span><span style="color: #97E1F1; font-style: italic">Outfit</span><span style="color: #F6F6F4"> bikini </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Bikini</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">       </span><span style="color: #97E1F1; font-style: italic">Accessories</span><span style="color: #F6F6F4"> gucci </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">GucciAccessories</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">       </span><span style="color: #97E1F1; font-style: italic">HairStyle</span><span style="color: #F6F6F4"> hair </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">KoreanHairStyle</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">       </span><span style="color: #97E1F1; font-style: italic">Girl</span><span style="color: #F6F6F4"> fukada </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4; font-weight: bold">new</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Girl</span><span style="color: #F6F6F4">(bikini, gucci, hair);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p style="font-size:16px">Vãi chưởng nhỉ, lúc này có thằng nào làm hộ được chúng ta việc này thì tốt biết mấy =))).</p>



<p style="font-size:16px">Bây giờ giả sử, chúng ta định nghĩa trước toàn bộ các&nbsp;<em>dependency</em>&nbsp;có trong Project, mô tả nó và tống nó vào 1 cái&nbsp;<code>kho</code>&nbsp;và giao cho một thằng tên là&nbsp;<code>framework</code>&nbsp;quản lý. Bất kỳ các&nbsp;<code>Class</code>&nbsp;nào khi khởi tạo, nó cần dependency gì, thì cái&nbsp;<code>framework</code>&nbsp;này sẽ tự tìm trong&nbsp;<code>kho</code>&nbsp;rồi&nbsp;<em>inject</em>&nbsp;vào đối tượng thay chúng ta. sẽ tiện hơn phải không?</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1020" height="1024" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-1020x1024.png" alt="" class="wp-image-3185" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-1020x1024.png 1020w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-300x300.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-150x150.png 150w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-768x771.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-1530x1536.png 1530w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-80x80.png 80w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-380x381.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-800x803.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02-1160x1164.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-11.27.02.png 1590w" sizes="(max-width: 1020px) 100vw, 1020px" /></figure>



<p style="font-size:16px">Úi dời ơi, tuyệt chứ nhỉ, đó cũng chính là nguyên lý chính của&nbsp;<strong>Inversion of Control (IOC)&nbsp;&#8211;&nbsp;Đảo chiều sự điều khiển</strong></p>



<p style="font-size:16px">Nguyên văn Wiki:</p>



<ul class="wp-block-list">
<li style="font-size:16px"><span style="color: rgb(55, 53, 47); font-family: Inter, Inter-fallback, Helvetica, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, NotoColorEmoji, &quot;Noto Color Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Android Emoji&quot;, EmojiSymbols, -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Noto Sans&quot;, sans-serif; font-size: 19.2px; letter-spacing: -0.1px; background-color: rgb(251, 251, 253);">Inversion of Control is a programming principle. flow of control within the application is not controlled by the application itself, but rather by the underlying framework.</span></li>
</ul>



<p style="font-size:16px">Khi đó, code chúng ta sẽ chỉ cần như này, để lấy ra đối tượng <strong>Girl</strong>, còn trong <strong>Girl.java</strong> anh em tiêm chích <strong>Accessories</strong> và <strong>HairStyle</strong> như <strong>Outfit</strong> nha:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Java</span><span role="button" tabindex="0" data-code="package org.tmsblog.patterns.di;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);

        Girl girl = context.getBean(Girl.class);
        // Anh em muốn lấy gì từ Girl thì cứ chấm mút ra nha =))
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">package</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">org.tmsblog.patterns.di</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.boot.SpringApplication;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.boot.autoconfigure.SpringBootApplication;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> org.springframework.context.ApplicationContext;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">@</span><span style="color: #97E1F1; font-style: italic">SpringBootApplication</span></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Main</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">static</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">main</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">[] </span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">ApplicationContext</span><span style="color: #F6F6F4"> context </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> SpringApplication.</span><span style="color: #62E884">run</span><span style="color: #F6F6F4">(Main.class, args);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1; font-style: italic">Girl</span><span style="color: #F6F6F4"> girl </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> context.</span><span style="color: #62E884">getBean</span><span style="color: #F6F6F4">(Girl.class);</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">// Anh em muốn lấy gì từ Girl thì cứ chấm mút ra nha =))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p style="font-size:16px"><strong>Lời kết:</strong></p>



<p style="font-size:16px"><strong>Dependency Injection</strong> và <strong>IoC container </strong>là những khái niệm rất quan trọng, hầu hết các ứng dụng, framework hiện tại đều sử dụng nó. Chúng ta cần tìm hiểu để biết rõ DI và IoC được ứng dụng trong trường hợp nào. Nếu áp dụng hợp lý code của chúng ta sẽ ít kết dính hơn (loose coupling), dễ bảo trì, dễ test hơn, tổ chức ứng dụng hợp lý và gọn gàng hơn.</p>



<p>Source Code tham khảo tại <a href="https://github.com/chienhnc/di">đây</a>: </p>
<p>The post <a href="https://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/">Thông não Dependency Injection bằng Eimi Fukada</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/thong-nao-dependency-injection-bang-eimi-fukada/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
