Title: Constructor Injection
For those of you who would like to use final fields, wish to avoid numerous
setters, or dislike private field injection and would like nothing more
than to just use plan old java constructors, your wish has come true.  This
is a feature we intended to add to OpenEJB 3.0 but didn't have time for. 
We're happy to bring it to the OpenEJB 3.1 release and with a bit of luck
and support from people like yourself, we'll see this as an EJB 3.1 feature
as well.


    @Stateless
    public class WidgetBean implements Widget {
    
        @EJB(beanName = "FooBean")
        private final Foo foo;
    
        @Resource(name = "count")
        private final int count;
    
        @Resource
        private final DataSource ds;
    
        public WidgetBean(Integer count, Foo foo, DataSource ds) {
    	this.count = count;
    	this.foo = foo;
    	this.ds = ds;
        }
    
        public int getCount() {
    	return count;
        }
    
        public Foo getFoo() {
    	return foo;
        }
    }


The @EJB, @Resource, @PersistenceUnit, and @PersistenceContext annotations
can be placed at the class-level instead such as:


    @Stateless
    @EJB(name = "foo", beanInterface = Foo.class, beanName = "FooBean")
    @Resource(name = "count", type = int.class)
    @Resource(name = "ds", type = DataSource.class)
    public class WidgetBean implements Widget {
    
        public WidgetBean(Integer count, Foo foo, DataSource ds) {
           // do something
        }
    
        public int getCount() {
    	return count;
        }
    
        public Foo getFoo() {
    	return foo;
        }
    }



Currently this functionality relies on classes being compiled with debug
symbols (the default compile setting for javac) as we use the debug table
in the byte code to discover the constructor arg names.  Additionally, you
must not have a no-arg constructor.  If a no-arg constructor is present,
that constructor will be used instead.

Ideally, we would like the annotations to be used on the parameters
directly as shown below.  Unfortunately, this does not work as the Java EE
annotation classes do not permit usage on parameters.  If you'd like to see
that change as much as we do, definitely voice your support by sending note
to [jsr-316-comments@jcp.org](mailto:jsr-316-comments@jcp.org.html)


Not yet possible

    @Stateless

    public class WidgetBean implements Widget {

        public WidgetBean(@Resource(name = "count") Integer count, @EJB Foo foo, @Resource DataSource ds) {
           // do something
        }

        public int getCount() {
            return count;
        }

        public Foo getFoo() {
            return foo;
        }
    }

