Jsf 如何使serviceloader创建的类处理容器管理的对象

Jsf 如何使serviceloader创建的类处理容器管理的对象,jsf,dependency-injection,cdi,serviceloader,Jsf,Dependency Injection,Cdi,Serviceloader,我目前正在编写一个库,希望库的用户实现一个接口。在我的库中,我称之为这个实现 我使用ServiceLoader来实例化integrator提供的实现,它工作得很好。积分器在我的库中调用start()方法,最后他得到了一些回报。该实现用于在实现最终结果的过程中为我提供一些我需要的东西。 (我故意不使用CDI或任何其他DI容器,因为我想创建一个可以在任何地方使用的库。在桌面应用程序中,spring应用程序使用guice的应用程序…) 现在我面临一个问题。我正在创建一个展示,在其中我使用自己的库。这是

我目前正在编写一个库,希望库的用户实现一个接口。在我的库中,我称之为这个实现

我使用ServiceLoader来实例化integrator提供的实现,它工作得很好。积分器在我的库中调用start()方法,最后他得到了一些回报。该实现用于在实现最终结果的过程中为我提供一些我需要的东西。 (我故意不使用CDI或任何其他DI容器,因为我想创建一个可以在任何地方使用的库。在桌面应用程序中,spring应用程序使用guice的应用程序…)

现在我面临一个问题。我正在创建一个展示,在其中我使用自己的库。这是一个Web应用程序,我在其中使用jsf和CDI。当我从我的库中实例化上述webapp中提供的实现时,我正在处理一个非容器管理的对象。但是,由于这个实现需要使用容器管理的对象,我有点搞砸了,因为这永远不会起作用

例如: lib中的接口:

public interface Example{
   public abstract String getInfo();
}
战争中的执行:

public class ExampleImpl implements Example{

   @Inject
   private ManagedBean bean;
   public String getInfo(){
      return bean.getSomethingThatReturnsString();
   }
}
正如您所看到的,在我的库的构建方式中这是一个巨大的问题,因为bean总是空的。。。这意味着任何使用DI容器的人都不能使用我的库。我知道我可以通过FacesContext查找得到managedbean,然后得到managedbean,但更重要的是,如果你仔细想想,我的库设计得不是很好

因此,总结我的问题: 有没有办法让serviceloader使用DI容器来实例化该类

有谁知道解决我问题的更好方法吗

有谁知道一种更好的方法来获得我需要的东西,而不必让集成器实现接口,但我可以从集成器获得信息

我知道这是一个相当抽象的问题,但我有点困在这个问题上


提前感谢

因为示例的实现不是在CDI容器中执行的,所以注入不会发生。您可以做的是使用BeanManager手动查找bean。根据,BeanManager绑定到jndi名称java:comp/BeanManager。使用以下代码,可以在实现类中获取BeanManager并手动查找依赖项:

InitialContext context = new InitialContext();
BeanManager beanManager = (BeanManager) context.lookup("java:comp/BeanManager");
Set<Bean<?>> beans = beanManager.getBeans(YourBean.class, new AnnotationLiteral<Default>() {});
Bean<YourBean> provider = (Bean<YourBean>) beans.iterator().next();
CreationalContext<YourBean> cc = beanManager.createCreationalContext(provider);
YourBean yourBean = (YourBean) beanManager.getReference(provider, YourBean.class, cc);
InitialContext context=newinitialcontext();
BeanManager BeanManager=(BeanManager)context.lookup(“java:comp/BeanManager”);
设置