【问题标题】:Discovery beans from dynamically loaded jar in JBoss AS 7.1从 JBoss AS 7.1 中动态加载的 jar 中发现 bean
【发布时间】:2013-07-03 16:23:11
【问题描述】:

我的问题 - 有人知道如何在 Weld 中获取Deployment 接口的实例吗?最好在 beforeBeanDiscovery 事件中?

我正在尝试在我的战争应用程序加载 jar 的应用程序中实现一个插件系统。为此,我正在使用 JBoss AS 7.1

我尝试在部署过程中包含 JAR,但似乎不可能,除非 jar 位于 WEB-INF/lib 文件夹中。

所以我的下一步是尝试使用 CDI(焊接)来发现外部 JAR 中的 bean。

CDI 似乎没有直接支持包含要发现的新 jar,但 Weld 有一个 Deployment 接口和一个名为 loadDeploymentArchive (http://docs.jboss.org/weld/javadoc/2.0/weld-spi/org/jboss/weld/bootstrap/spi/Deployment.html#loadBeanDeploymentArchive(java.lang.Class)) 的方法

【问题讨论】:

    标签: plugins jboss7.x cdi weld


    【解决方案1】:

    该类用于与应用服务器集成。 CDI 旨在为应用程序在启动时加载所有内容。要做你正在寻找的事情,你必须启动一个新的 Weld 实例并传递所有内容并自己进行引导。老实说,我不知道在您的应用程序中执行此操作会产生什么影响,但我可以告诉您,这会让您非常头疼。

    【讨论】:

      【解决方案2】:

      其实我在http://relation.to/12981.laceGavin King 的这篇文章中找到了答案

      基本上我必须像这样创建一个扩展并映射 afterBeanDiscovery 事件:

      public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
          for ( final Class c: getBeanClasses() ) {
      
              //use this to read annotations of the class
              AnnotatedType at = bm.createAnnotatedType(c);
      
              //use this to create the class and inject dependencies
              final InjectionTarget it = bm.createInjectionTarget(at);
      
              abd.addBean( new Bean() {
                  @Override
                  public Class<?> getBeanClass() {
                      return c;
                  }
      
                  @Override
                  public Set<InjectionPoint> getInjectionPoints() {
                      return it.getInjectionPoints();
                  }
      
                  @Override
                  public String getName() {
                      String s = c.getSimpleName();
                      s = Character.toLowerCase( s.charAt(0) ) + s.substring(1);
                      return s;
                  }
      
                  @Override
                  public Set<Annotation> getQualifiers() {
                      Set<Annotation> qualifiers = new HashSet<Annotation>();
                      qualifiers.add( new AnnotationLiteral<Default>() {} );
                      qualifiers.add( new AnnotationLiteral<Any>() {} );
                      return qualifiers;
                  }
      
                  @Override
                  public Class<? extends Annotation> getScope() {
                      return Dependent.class;
                  }
      
                  @Override
                  public Set<Class<? extends Annotation>> getStereotypes() {
                      return Collections.emptySet();
                  }
      
                  @Override
                  public Set<Type> getTypes() {
                      Set<Type> types = new HashSet<Type>();
                      types.add(c);
                      types.add(Object.class);
                      return types;
                  }
      
                  @Override
                  public boolean isAlternative() {
                      return false;
                  }
      
                  @Override
                  public boolean isNullable() {
                      return false;
                  }
      
                  @Override
                  public Object create(CreationalContext ctx) {
                      Object instance = it.produce(ctx);
                      it.inject(instance, ctx);
                      it.postConstruct(instance);
                      return instance;
                  }
      
                  @Override
                  public void destroy(Object instance, CreationalContext ctx) {
                      it.preDestroy(instance);
                      it.dispose(instance);
                      ctx.release();
                  }
      
              } );
          }
      }
      

      我还必须扫描我的 jar 中的 bean 类,但这没什么大不了的。找到类后,我将其包含在 getBeanClasses() 列表中。

      现在我正在寻找有关如何在运行时包含 JPA 实体的解决方案。

      但是现在这个问题已经解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-11
        • 2018-01-29
        • 2021-02-22
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多