Java 编写自己的依赖项注入

Java 编写自己的依赖项注入,java,spring,dependency-injection,Java,Spring,Dependency Injection,我们正在开发一个应用程序。该应用程序将部署在专有的事件处理引擎中。我们不应该使用任何api,比如用于DI的SpringCore。目前还没有专有的DI框架。所以我们的想法是写一个简单的 请任何人提供一些信息 我的想法是编写一个工厂类,其中包含静态方法。静态方法将返回我们想要的类的实例。现在我们只需要一个实例。我假设下面是一种代码 public final class MyFactory { private static ClassA classA = new ClassA();

我们正在开发一个应用程序。该应用程序将部署在专有的事件处理引擎中。我们不应该使用任何api,比如用于DI的SpringCore。目前还没有专有的DI框架。所以我们的想法是写一个简单的

请任何人提供一些信息

我的想法是编写一个工厂类,其中包含静态方法。静态方法将返回我们想要的类的实例。现在我们只需要一个实例。我假设下面是一种代码

public final class MyFactory {

    private static ClassA classA = new ClassA();
    private static ClassB classB = new ClassB();

    private MyFactory() {
        throw new CustomException("Cannot create instance");
    }

    public static ClassA getClassAInstance() {
        return classA;
    }

    public static ClassB getClassBInstance() {
        return classB;
    }
}
以后我会像这样使用它

public class SomeRandomClass {

    private ClassA classA = MyFactory.getClassAInstance();
}
我看到的另一件事是我不需要测试ClassA和ClassB。测试类别将涵盖类别A和类别B。因为静态内容总是先加载。因此,在测试某个随机类时,我总是在其中包含一个类实例。因此,在SomeRandomClass中的某个方法上编写junit将调用ClassA中的方法。这个好吗


我这样做对吗?我能改进它吗?

对于初学者来说,工厂API不应该像那样直接引用具体的类实现。这有点违背了目的。在不重新编译的情况下,您将无法更改具体的类,并且您将无法执行诸如删除接口以进行测试和开发之类的操作

然后,假设您想要单例(这不是您的示例的编写方式),您需要确保工厂方法在生成单例时是线程安全的

您至少应该让工厂返回接口的真正单例实例。然后,您可以实现某种配置系统,并使用Java反射API确定应在运行时创建哪些具体类。这也将使您能够完成一些事情,比如为测试或开发而删除接口


这不是真正的DI。它还有很多优点,它在可读性/可写性/可配置性/可维护性方面的优势远远超出了工厂所能提供的。我不知道为什么在专有软件中使用Spring会是一个问题。AFAIK Spring的许可证并不强制代码开源或免费…

为什么你要重新发明一个非常复杂的轮子,而不是使用工作、测试和理解的框架?Guice并不复杂,你可以试试。试着看看Guice背后的代码-是的,它很复杂。但是它的用法很简单,就像CDI/Weld一样。这就是为什么使用已经存在的东西更好。问题是,到目前为止,在这个线程中呈现的内容中,我认为还没有真正的理由实际应用依赖项注入。依赖注入并不是对象实例化的替代品,“简单”DI就像对某个字符串值执行
forName
一样简单。您真正有什么具体要求?您使用的
MyFactory
被称为服务定位器模式;这被认为是一个错误。您应该改用构造函数注入。