I'll start by explaining our current setup. We have a web application that, at initialization time, all singleton objects are created and correctly wired by Spring (pretty usual stuff). Among these singleton objects we have DAOs and services objects that are invoked when users submit HTML forms to the server.
We also have an EJB tier in our application. The only EJBs we have are MDBs. These beans get messages from external resources and then need to invoke exactly the same services and DAOs objects that the web tier uses. I spent some time going over the documentation on how to integrate EJBs and Spring and then we did as suggested: MDBs extend AbstractJmsMessageDrivenBean and an implementation for the setMessageDrivenContext() method is provided. This worked fine but... basically, what is happening here is that I am loading (and wiring) into the JVM memory exactly the same objects that were loaded when the web application was initialized. So, now I have two copies of all the service and DAO objects in memory.
So, my question is... is there a way to get a reference, in the MDBs, to the same services and DAO objects that were instantiated and wired by Spring during the startup of the application? In the MDBs, of course, we do not have access to the ServletContext, and hence, we do not have access to the WebApplicationContext which would return the already wired objects that the MDBs need.
A possible solution that we thought of (to avoid having two instances of every service and DAO object) was to move all our services and DAOs to the EJB tier and then have the web tier contact session EJBs which would then call the correponding service and/or DAO object. This way, the instantiation and wiring of objects by Spring would happen the first time a session EJB is invoked instead of occurring when the web application is initialized. We don't like this solution since we would be adding session EJBs to the application which are not really needed... it just seems unnecessary extra overhead.