1

我想知道 Jee6 在执行时是否支持依赖注入...

我可能涉及多个概念,所以我尝试描述我想要的架构

  1. 一个包含接口的 jar

公共接口你好{公共字符串说();}

引用接口的战争(所以接口 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";
    }

}

如此简单,但现在我不知道如何使这个可模块化(可以在运行时添加或删除实现):

  1. 如果我将实现放在一个war文件中,它会在另一个上下文中运行吗?

  2. 如果我把它放在 jar 文件中,我需要把它放在第一次战争 WEB-INF 中才能使用它吗?我可以在执行过程中动态添加或删除 jar,我猜不是……或者是的,它对类加载器和卸载 jar 文件不太熟悉

最好的问题,如果所有这些都可以完成,是否有任何方法可以将jar 上的 r* aise 事件添加到 web-inf/lib 和/或删除?

可以说我还没有准备好去 OSGI,但我的问题可能会被该技术的某些功能所掩盖,如果可以的话,我只想留在 jee6..

谢谢

4

3 回答 3

1

您可以查看 @Specializes 或 @Alternative 或简单地对您的生产者和类使用不同的限定符。然后,您需要通过使用 Instance 遍历它们来选择要使用的那个。

于 2012-10-15T01:01:24.497 回答
0

如果您使用 Glassfish 作为应用程序容器,您应该看看这个https://blogs.oracle.com/arungupta/entry/totd_154_dynamic_osgi_services

几年前我用过它,但我不再 100% 确定它是否也适用于

    @Inject
    @Any
    Instance<MyService> myServiceInstances;

或者如果我必须做更多的 OSGI 魔法

于 2013-08-01T06:11:21.580 回答
0

查看带有 的生产者InjectionPoint,例如@Produces Hello obtainHelloImpl(InjectionPoint ip).

这篇文章可能会对http://java.dzone.com/articles/cdi-di-p2有很大帮助。

于 2012-11-01T04:19:41.243 回答