我想知道Jee6是否支持执行时依赖注入...
我可能涉及多个概念,因此我尝试描述我想要的架构
public interface Hello { public String say(); }
引用接口的war(所以接口Hello jar打包在WEB-INF / lib中)
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject @Any
Instance<Hello> hello;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(hello.iterator().next().say());
}
好的,所以我可以解决任何问题
基本上我想为该界面设置多个生产者
@Named
public class HelloImpl implements Hello {
@Override
public String say() {
// TODO Auto-generated method stub
return "TEST";
}
}
如此简单,但现在我不知道要使这个可模糊(可以在运行时添加或删除实现):
如果我将实现放在war文件中,它在另一个上下文中运行吗?
如果我把它放在jar文件中我需要在第一次战争WEB-INF中使用它吗? 我可以在执行过程中动态添加或删除jar,我猜不是......或者是,它不熟悉类加载器和卸载jar文件
最佳问题,如果所有这一切都可以完成,如果有任何方法在jar上添加 * ed到web-inf / lib和/或删除?
让我们说我还没有准备好去OSGI,但是我的问题可能是某些功能无法覆盖该技术,我只想留在jee6,如果我可以..
由于
答案 0 :(得分:1)
您可以查看@Specializes或@Alternative,或者只是在生产者和类中使用不同的限定符。然后,您需要通过使用Instance迭代它们来选择要使用的那个。
答案 1 :(得分:0)
查看InjectionPoint
的制作人,例如@Produces Hello obtainHelloImpl(InjectionPoint ip)
。
这篇文章可能会有很大的帮助http://java.dzone.com/articles/cdi-di-p2。
答案 2 :(得分:0)
如果您使用Glassfish作为应用程序容器,您应该查看此https://blogs.oracle.com/arungupta/entry/totd_154_dynamic_osgi_services
几年前我用过它,但我不再百分百确定这是否也适用于 @Inject
@Any
Instance<MyService> myServiceInstances;
或者如果我不得不做更多的OSGI魔术