Uploaded image for project: 'Weld'
  1. Weld
  2. WELD-911

Shared dependent instance injection with circular reference through decorator

    XMLWordPrintable

Details

    Description

      CDI spec section 6.4 says about @Dependent that "No injected instance of the bean is ever shared between multiple injection points."

      The following test shows that the same instance of @Dependent Foo is shared between multiple injection points, one in TestDecoratorInjection, the other in BarDecorator.

      import org.jboss.weld.environment.se.Weld;
      import org.jboss.weld.environment.se.WeldContainer;
      
      import javax.annotation.PostConstruct;
      import javax.decorator.Decorator;
      import javax.decorator.Delegate;
      import javax.enterprise.inject.Any;
      import javax.inject.Inject;
      import javax.inject.Singleton;
      
      @Singleton
      public class TestDecoratorInjection {
      
         public static final Weld weld = new Weld();
         public static final WeldContainer weldContainer = weld.initialize();
      
         public static void main(final String[] args) throws Exception {
             weldContainer.instance().select(TestDecoratorInjection.class).get().test();
         }
      
         @Inject
         Foo foo; // Dependent instance of TestDecoratorInjection
      
         void test() {
             foo.test();
         }
      
         public static class Foo {
      
             @PostConstruct
             void init() {
                 System.out.println("INIT FOO");
             }
      
             @Inject
             Bar bar; // Dependent instance of Foo
      
             void print() {
                 System.out.println("FOO");
             }
      
             void test() {
                 bar.print();
             }
         }
      
         public static interface Bar {
             void print();
         }
      
         public static class BarImpl implements Bar {
             @Override
             public void print() {
                 System.out.println("Bar");
             }
         }
      
         @Decorator
         public static abstract class BarDecorator implements Bar {
      
             @Inject
             @Delegate
             @Any
             Bar delegate;
      
             @Inject
             Foo foo; // Dependent instance of what?!
      
             @Override
             public void print() {
                 foo.print();
             }
         }
      }
      

      Attachments

        Activity

          People

            ajustin@redhat.com Ales Justin
            christian.bauer_jira Christian Bauer (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: