在不依赖框架的情况下理解java中的依赖注入。纯java代码是什么样的?

Hor*_*ice 4 java oop spring dependency-injection

我正在学习 Java 的 Spring 框架。这一切都与依赖注入有关。是否有博客或一些资源或示例可以用来理解 RAW 依赖注入?换句话说,没有注释或 xml 或任何容器。纯java代码中的依赖注入是什么样的?

先感谢您!

Lui*_*oza 9

它看起来像这样(假设所有 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,可以通过反射和 cglib 等其他库来增强,以动态创建代理类。


Bar*_*zek 5

纯Java 中的依赖注入是一个非常简单的概念。假设您有一个类AB如下所示:

public class A{
    private B instanceOfB = new B();
    public method doSomething(){
        // does something involving B
    }
}
Run Code Online (Sandbox Code Playgroud)

A在内部实例化类B,因此B成为A类的依赖项。如果你想孤立地测试A,你无法做到(因为它依赖于B)。如果您想提供A的不同实现B,则必须编辑 的源代码A,这并不总是可能的,或者只是不是最好的主意。

相反,请考虑通过构造函数注入依赖项(这是您可以使用 Spring 选择的方法之一)。您为 创建一个公共构造函数A,它接受 aB作为参数:

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

现在,您不再在类内部构造对象,而是在外部代码中为其提供(注入)一个参数。这样做的优点是您可以传递 的不同实现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
Run Code Online (Sandbox Code Playgroud)

如果BB2实现相同的接口或B2扩展B,您可以根据您的需要互换使用它们。这提供了很大的灵活性。这基本上就是没有 DI 容器的依赖注入的工作原理。Spring 对于小型应用程序来说可能有点大材小用,但基本思想非常简单,它是一个很好的实践,你绝对应该使用它。

Java Brains是学习 Spring(和其他东西)基础知识的一个很好的资源。