Imagine you have two implementations of a @Local
interface
@Local
public interface LocalInterface {
}
@Stateless
public class MyFirstImplementation implements LocalInterface {
}
@Stateless
public class MySecondImplementation implements LocalInterface {
}
And I want to choose, without recompiling the project (that is, at runtime or using an external configuration property) which one (MyFirstImplementation or MySecondImplementation) I want to use.
public class MyClass {
@EJB
LocalInterface local;
}
Once one implementation is chosen, it does not have to change. I am using JBoss 5.1 if that helps.
The method outlined by PedroKowalski is a typical way to do this. Another trick with respect to the "external configuration property", is simply configuring your builder such that only 1 implementation ends up in the jar you generate that holds the EJBs.
So you don't have to recompile classes or change any source code, but you do have to rebuild your jar to choose another implementation.
You can achieve it using the deployment descriptor - ejb-jar.xml. Something like this (might not be 100% accurate, but I think you've got the point):
Another way is to use the CDI as described here: Inject @EJB bean based on conditions
Another approach is to find the EJB reference with JNDI instead of relying on the automatic injection, just in case it could help anyone else:
This is what I finally did, because with JBoss 5 (< Java EE 6, EJB 3.0) you can not make use of the useful
@Produces
annotation. I set PedroKowalski's answer as accepted as CDI annotations seems to be the better solution if you do not have other restrictions.