我一直在阅读有关 Spring 的文章,尽管它声称它是 EJB 的一种不太复杂的替代方案,但我很难理解它。有没有比采用 Spring 方法更简单的实现依赖注入的方法?
9 回答
为什么不在没有框架的情况下做呢?
询问你的类依赖什么,然后通过(比如)构造函数注入这些对象。
一些提示:
- 您的班级是否依赖单身人士?而是注入该对象(可能作为工厂)
- 您的对象是否依赖于其他具体类?如果是这样,请注入它们,但通过接口引用它们,以便您可以替换不同的实现
例如,只需使用构造函数创建一个类:
public TradeSaver(final ITradeValidator validator, final ITradeDatabase db);
(其中两个参数都是接口),然后您可以注入您TradeSaver
所依赖的核心组件(验证和数据库保存),并可以选择提供不同的测试实现、不同的部署等。
Google Guice是一个非常简约的 DI 框架。
另一个尚未提及的选项是Yan。我过去使用过它,它非常轻巧且极简。这是一个链接,其中包含一页介绍它的作用(以及如何):
就 DI 和 IoC 而言,它可能不会比picocontainer更小。
我更喜欢Tapestry,但Google Guice非常相似并且被更广泛地采用,所以这可能是一个更好的选择,因为它会更容易找到教程等。
本质上,依赖注入只是一种结构化代码以实现组件可重用性的方法。它不需要使用容器。这只是意味着您将对组件的“新”运算符的任何使用移至应用程序的开头。例如,您的应用程序入口点可能如下所示:
IZooDataRepository repository = new SqlZooDataRepository(somehost, someparam);
IMonkeyManager monkeyManager = new MonkeyManager(repository);
IZebraManager zebraManager = new ZebraManager(repository);
ZooProgram program = new ZooProgram(monkeyManager, zebraManager);
program.run();
这个阶段被称为“对象图构建”。在这里,您可以将仅知道其合作者的对象作为接口连接到这些接口的特定实现。
如果您在实践中有数百个课程,那么这种启动布线可能会变得相当长和复杂。这就是发明 DI 容器的原因:它们以某种方式替换了对象图构造代码,例如:
Container container = new Container(someconfigurationparameters);
ZooProgram program = (ZooProgram) container.Create(ZooProgram.class);
program.run();
由容器生成的对象图的配置通常通过 XML 文件、类的属性或用代码定义的绑定来完成。
PicoContainer 是开始使用 DI 的最简单方法:
假设我们得到
public class A implements IA {
public A(IB dependency){
...
}
}
public class B implements IB {
}
然后
pico = new DefaultPicoContainer();
pico.addComponent(A.class);
pico.addComponent(B.class);
IA a = pico.getComponent(IA.class); // a is an instance of A with an instance of B passed to the constructor
我强烈建议您研究 JSR-330 实现,因为这些有望成为未来的标准。JEE6 中有一个,但这对您来说可能有点过头了。我相信Caucho CanDI 也可以独立运行。
- 读取 spring xml bean 配置文件
- 用普通的java写它。