(Disclaimer: I work for Oracle doing Java EE architecture and other things, but none of my writings here or anywhere else on this site have anything to do with my day job there. In short, as always, these are just the writings of a Java EE hacker using publicly available stuff.)
Have you taken a look at CDI 2.0 (Early Draft 2) yet?
You really should.
If you weren’t paying attention, CDI added a few interesting things that are on their way to being part of the official standard.
Perhaps the most notable is that CDI is no longer a parasite.
A parasite is a being that lives inside a host. Just so, CDI in versions prior to 2.0 could be instantiated only in non-standardized manners. That is, you would have to invoke Weld classes, or OpenWebBeans classes, to get a CDI environment up and running that your code could play in.
But no longer. Now you can discover and instantiate a CDI container from Java SE in a vendor independent fashion. Here’s what it looks like, and 80% of the following snippet is license text and documentation:
See line 61 above? That gets an SeContainerInitializer. From there, you call initialize(), and that gets you an SeContainer. From there, you can get its BeanManager, and from there you can do anything you like.
But what’s really interesting is what is not going on on line 65 above.
On line 65 above, nothing is happening! That means the container comes up (line 63), and when it has come up, it goes down again (the implicit close() called by the try-with-resources block, also at line 63). Hmm; I guess this application doesn’t do anything.
Actually, you don’t know that.
In between coming up and going down, the container has found and created all the portable extensions on the classpath, if there were any, run through its startup lifecycle (which portable extensions can be involved in and affect), discovered all the bean archives on the classpath whether by itself or with the assistance of portable extensions and alerted (potentially) every bean that its ApplicationScoped scope has initialized. Then depending on what injection any observing bean might perform, it may notify other beans about the availability of other scopes.
Lastly, it notifies the beans about the scopes going away, and then it notifies extensions that the container is about to go down.
In the meantime all the beans and portable extensions involved can fire events of any kind on the local event bus to notify each other of interesting things.
That’s an awful lot of valuable stuff for an application that doesn’t do anything.
It also means that you could have an executable that doesn’t presume anything about the work to be done, but still frees the developer from having to supply a main method, and provides an integration backplane for a whole host of technologies.
For example, the act of placing a JAX-RS application in a jar file could—depending on the portable extensions in play in any given CDI container environment—result in that JAX-RS application being deployed on an embedded server.
I’ll leave you with that before my next post.