| = Constructor Injection | |
| :index-group: Unrevised | |
| :jbake-date: 2018-12-05 | |
| :jbake-type: page | |
| :jbake-status: published | |
| 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. | |
| [source,java] | |
| ---- | |
| @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: | |
| [source,java] | |
| ---- | |
| @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 | |
| mailto:jsr-316-comments@jcp.org.html[jsr-316-comments@jcp.org] | |
| Not yet possible | |
| [source,java] | |
| ---- | |
| @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; | |
| } | |
| } | |
| ---- |