PicoContainer似乎indicate它支持JSR-330 @Inject
和@Named
。 (不,this other question似乎没有帮助,因为它没有解决PicoContainer网站说已经添加了对JSR-330的一些支持的事实。)
我在容器中添加了这样的内容:
container.addComponent(Foo.class);
container.addComponent("myBar", new MySpecialBar());
container.addComponent("decoy", new SomeOtherBar());
我使用@Named
标记构造函数参数:
public class Foo(@Named("myBar") Bar bar) { ...
但是当我尝试获取Foo
实例时,PicoContainer抱怨它有太多Bar
个实例可供选择。
问题1:如何让PicoContainer与@Named
一起使用构造函数注入?
然后我尝试在Foo.java
:
@Inject
@Named("myBar")
Bar bar;
这也不起作用。
问题2:如何让PicoContainer与@Inject
和@Named
一起使用构造函数注入?
或PicoContainer news page错了,根本没有任何PicoContainer 2.x对JSR-330的支持?
答案 0 :(得分:0)
看起来我是stackoverflow上唯一一个回答微微问题但是我不是微微团队成员的人,所以对于最终答案,您可能需要访问他们的邮件列表:)
在查看框架源代码(2.10 ... 2.15)时,我看不到对javax.inject.Named和@Inject的任何支持作为pico注释支持,而不是作为javax.inject.Inject
至于解决模糊的依赖关系,pico提供了几种方法:http://picocontainer.codehaus.org/ambiguous-injectable-help.html(使用参数名称,IMHO有点奇怪,但它可能对你而言)和http://picocontainer.codehaus.org/disambiguation.html(使用Parameter对象 - 不错,但是详细,另一个使用绑定注释,如在Guice中,恕我直言更奇怪)如果以上都不适合你,你可以采取参数对象的想法,让你的消歧适配器,与恕我直言清洁看起来
class DisambiguationAdapter<T> extends AbstractAdapter<T> {
private final Object[] params;
public DisambiguationAdapter(Object componentKey, Class<T> componentImplementation, Object... params) {
super(componentKey, componentImplementation);
this.params = params;
}
// the idea is to make child container that overrides ambiguos deps using the parameters hints
@Override
public T getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
MutablePicoContainer tmpContainer = new DefaultPicoContainer(container);
tmpContainer.addComponent(getComponentKey(), getComponentImplementation());
for (Object param : params) {
tmpContainer.addComponent(container.getComponent(param));
}
T instance = tmpContainer.getComponent(getComponentImplementation());
tmpContainer.dispose();
return instance;
}
@Override
public void verify(PicoContainer container) throws PicoCompositionException {
for (Object param : params) {
if(container.getComponent(param) == null) {
throw new PicoCompositionException("Can't resolve param-key=" + param + " to satisfy dependencies for " + getDescriptor());
}
}
}
@Override
public String getDescriptor() {
return getComponentImplementation().getCanonicalName();
}
}
然后你声明这个方法来添加需要模糊deps的组件:
public void register(Object key, Class<?> component, Object... params) {
container.addAdapter(new DisambiguationAdapter<>(key, component, params));
}
然后你就像这样使用它:
// constructor for some class requiring ambig deps
public ProfileFinder(/* ambig param */ ProfileDao dao, /* any other params */ Param1 param1, Param1 param2)......
// container composition
// hint key, impl class
c.addComponent(ProfileDaoSelector.SLAVE, jdbi.onDemand(ProfileDao.class));
c.addComponent(ProfileDaoSelector.MASTER, jdbiMaster.onDemand(ProfileDao.class));
// impl class, hint keys array
c.register(ProfileService.class, new Object[] {ProfileDaoSelector.MASTER});
c.register(ProfileFinder.class, new Object[] {ProfileDaoSelector.SLAVE});