[英]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中的依賴注入是一個非常簡單的概念。 假設你有一個A
和B
類如下:
public class A{
private B instanceOfB = new B();
public method doSomething(){
// does something involving B
}
}
類A
內部實例化類B
等B
變得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
如果B
和B2
實現相同的接口或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.