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.
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):
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>MyClass</ejb-name>
<ejb-ref>
<ejb-ref-name>ejb/myLocalReferencedBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>com.yourpackage.LocalInterface</local>
<ejb-link>MyFirstImplementation</ejb-link>
<injection-target>local</injection-target>
</ejb-ref>
</session>
<session>
<ejb-name>MyFirstImplementation</ejb-name>
<!-- ... -->
</session>
<session>
<ejb-name>MySecondImplementation</ejb-name>
<!-- ... -->
</session>
</enterprise-beans>
</ejb-jar>
Another way is to use the CDI as described here: Inject @EJB bean based on conditions