JEE6 - CDI - 执行时的DI

时间:2012-10-13 23:20:20

标签: java java-ee-6 cdi

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

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

  1. 包含接口的jar
  2.   

    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";
        }
    
    }
    

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

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

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

    3. 最佳问题,如果所有这一切都可以完成,如果有任何方法在jar上添加 * ed到web-inf / lib和/或删除?

      让我们说我还没有准备好去OSGI,但是我的问题可能是某些功能无法覆盖该技术,我只想留在jee6,如果我可以..

      由于

3 个答案:

答案 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魔术