【发布时间】:2014-04-03 19:56:03
【问题描述】:
我在理解 iPOJO 中组件实例化的概念时遇到了一些问题。我读了this guide 我得到了类和对象的类比,但我仍然有一些具体的问题和一些概念上的问题,希望有人能澄清一下
我认为我需要通过 iPOJO(@Instantiate 或工厂)仅为服务提供商创建实例,因为他们从不使用 new,因为impl 总是隐藏的。但是,我有一些我自己实例化的消费者 @Component(比如在我直接在它们上调用 new 的 main() 方法中)。我制作它们 @Component 是因为它们需要注入东西。我假设 ipojo 字节码操作会做到这一点,以便在构造对象时注入它们的依赖项(我主要使用带有 @Bind 的方法注入),但似乎不是案子。有人可以向我澄清一下吗?现在在我看来,要让 iPOJO 进行任何注入,我需要始终使用其中一种 iPOJO 实例化技术。我遇到的问题是,我在消费者类中创建的构造函数没有被调用。
这是一个简化的例子来说明我的困惑
@Component(name="test")
public class MyFoo {
private List<External> externals; //injected
private Bar bar; //passed via constructor. Bar is *not* a @Component
public MyFoo(Bar otherBar) {
bar = otherBar;
externals = new ArrayList();
}
@Bind(aggregate=true)
public addExternal(External service) {
externals.add(service);
}
}
因此,正如这里可以看到的,我需要有接口External 的所有提供者,但我还需要一个Bar 对象,当我使用new MyFoo(someBar) 构造对象时传递它
我的问题是,如果我需要将 Bar 传递给构造函数,那么我需要使用 new;但是如果我使用 new,iPojo 永远不会调用我的注入方法。另一方面,如果我使用 iPOJO 实例化(比如我添加了@Instantiate),那么注入确实发生了,但没有调用构造函数,因此绑定会抛出 NPE,因为尚未创建列表 + 不会设置 bar。我知道我可以在 bind 方法中创建列表,但我的问题更具概念性。
- 您应该如何实现这一点(框架注入 + 构造函数中的参数传递)?
- iPOJO 如何在不调用我唯一的创建对象的构造函数的情况下调用 addExternal(这意味着对象已创建)?这在标准 java 中是非常违反直觉的
- 难道你只是在使用 iPOJO 组件时不应该使用构造函数吗?
【问题讨论】:
标签: java dependency-injection osgi ipojo