簡體   English   中英

在不依賴框架的情況下理解java中的依賴注入。 在純Java代碼中它是什么樣的?

[英]Understanding dependency injection in java without relying on a framework. What does it look like in pure java code?

我正在學習Java的Spring框架。 這完全是關於依賴注入。 是否有博客或某些資源或示例我可以用來理解RAW依賴注入? 換句話說,沒有注釋或xml或任何容器。 在純Java代碼中,依賴注入是什么樣的?

先感謝您!

純Java中的依賴注入是一個非常簡單的概念。 假設你有一個AB類如下:

public class A{
    private B instanceOfB = new B();
    public method doSomething(){
        // does something involving B
    }
}

A內部實例化類BB變得A依賴性 如果要單獨測試A ,則不能這樣做(因為它取決於B )。 如果你想為A提供不同的B實現,你必須編輯A的源代碼,這並不總是可行或者不是最好的想法。

相反,請考慮通過構造函數注入依賴項 (它是您可以使用Spring選擇的方法之一)。 您為A創建一個公共構造函數,它將B作為參數:

class A{
    private B instanceOfB;
    public A(B instanceOfB){
        this.instanceOfB = instanceOfB;
    }
    public method doSomething(){
        // does something involving B
    }
}

現在,不是在類中構造對象,而是在外部代碼中給它( 注入 )一個參數。 這樣做的好處是你可以傳遞不同的B實現,或者模擬測試:

class B{ // whatever }
class B2 extends B{ // whatever }

A anInstanceOfA = new A(new B()); // this is ok, A will internally use B
A anotherInstanceOfA = new A(new B2()); // and this instance will use B2 instead

如果BB2實現相同的接口或B2擴展B ,您可以根據需要互換使用它們。 這提供了很大的靈活性。 這基本上是沒有DI容器的依賴注入的工作原理。 Spring可能對小型應用程序來說太過分了,但基本的想法非常簡單,這是一個很好的做法,你絕對應該使用它。

Java Brains是學習Spring(和其他東西)基礎知識的好資源。

它看起來像這樣(假設所有bean都是原型范圍):

class BeanToBeInjected {
}

class BeanThatNeedsInjection {
    BeanToBeInjected beanToBeInjected;
    public void setBeanToBeInjected(BeanToBeInjected beanToBeInjected) {
        this.beanToBeInjected = beanToBeInjected;
    }
}

class BeanFactory {
    public Object createBean(String id) {
        if("beanThatNeedsInjection".equals(id) {
            BeanThatNeedsInjection beanThatNeedsInjection = new BeanThatNeedsInjection();
            beanThatNeedsInjection.setBeanToBeInjected(new BeanToBeInjected());
            return beanThatNeedsInjection;
        }
        return null;
    }
}

class MyService {
    public void service() {
        BeanThatNeedsInjection beanThatNeedsInjection =
            new BeanFactory().createBean("beanThatNeedsInjection");
    }
}

當然,通過反射和其他庫(如cglib)增強,可以動態創建代理類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM