org.springframework.ejb.access
Class LocalSlsbInvokerInterceptor

java.lang.Object
  extended by org.springframework.jndi.JndiAccessor
      extended by org.springframework.jndi.JndiLocatorSupport
          extended by org.springframework.jndi.JndiObjectLocator
              extended by org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
                  extended by org.springframework.ejb.access.LocalSlsbInvokerInterceptor
All Implemented Interfaces:
Advice, Interceptor, MethodInterceptor, InitializingBean
Direct Known Subclasses:
LocalStatelessSessionProxyFactoryBean

public class LocalSlsbInvokerInterceptor
extends AbstractSlsbInvokerInterceptor

Invoker for a local Stateless Session Bean. Designed for EJB 2.x, but works for EJB 3 Session Beans as well.

Caches the home object, since a local EJB home can never go stale. See JndiObjectLocator for info on how to specify the JNDI location of the target EJB.

In a bean container, this class is normally best used as a singleton. However, if that bean container pre-instantiates singletons (as do the XML ApplicationContext variants) you may have a problem if the bean container is loaded before the EJB container loads the target EJB. That is because by default the JNDI lookup will be performed in the init method of this class and cached, but the EJB will not have been bound at the target location yet. The best solution is to set the lookupHomeOnStartup property to false, in which case the home will be fetched on first access to the EJB. (This flag is only true by default for backwards compatibility reasons).

Author:
Rod Johnson, Juergen Hoeller
See Also:
AbstractSlsbInvokerInterceptor.setLookupHomeOnStartup(boolean), AbstractSlsbInvokerInterceptor.setCacheHome(boolean)

Field Summary
 
Fields inherited from class org.springframework.jndi.JndiLocatorSupport
CONTAINER_PREFIX
 
Fields inherited from class org.springframework.jndi.JndiAccessor
logger
 
Constructor Summary
LocalSlsbInvokerInterceptor()
           
 
Method Summary
protected  Method getCreateMethod(Object home)
          Check for EJB3-style home object that serves as EJB component directly.
protected  Object getSessionBeanInstance()
          Return an EJB instance to delegate the call to.
 Object invokeInContext(MethodInvocation invocation)
          This implementation "creates" a new EJB instance for each invocation.
protected  Object newSessionBeanInstance()
          Return a new instance of the stateless session bean.
protected  void releaseSessionBeanInstance(EJBLocalObject ejb)
          Release the given EJB instance.
protected  void removeSessionBeanInstance(EJBLocalObject ejb)
          Remove the given EJB instance.
 
Methods inherited from class org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
afterPropertiesSet, create, getHome, invoke, isHomeRefreshable, refreshHome, setCacheHome, setExposeAccessContext, setLookupHomeOnStartup
 
Methods inherited from class org.springframework.jndi.JndiObjectLocator
getExpectedType, getJndiName, lookup, setExpectedType, setJndiName
 
Methods inherited from class org.springframework.jndi.JndiLocatorSupport
convertJndiName, isResourceRef, lookup, lookup, setResourceRef
 
Methods inherited from class org.springframework.jndi.JndiAccessor
getJndiEnvironment, getJndiTemplate, setJndiEnvironment, setJndiTemplate
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LocalSlsbInvokerInterceptor

public LocalSlsbInvokerInterceptor()
Method Detail

invokeInContext

public Object invokeInContext(MethodInvocation invocation)
                       throws Throwable
This implementation "creates" a new EJB instance for each invocation. Can be overridden for custom invocation strategies.

Alternatively, override getSessionBeanInstance() and releaseSessionBeanInstance(javax.ejb.EJBLocalObject) to change EJB instance creation, for example to hold a single shared EJB instance.

Specified by:
invokeInContext in class AbstractSlsbInvokerInterceptor
Parameters:
invocation - the AOP method invocation
Returns:
the invocation result, if any
Throws:
Throwable - in case of invocation failure

getCreateMethod

protected Method getCreateMethod(Object home)
                          throws EjbAccessException
Check for EJB3-style home object that serves as EJB component directly.

Overrides:
getCreateMethod in class AbstractSlsbInvokerInterceptor
Parameters:
home - the EJB home object
Returns:
the create method
Throws:
EjbAccessException - if the method couldn't be retrieved

getSessionBeanInstance

protected Object getSessionBeanInstance()
                                 throws NamingException,
                                        InvocationTargetException
Return an EJB instance to delegate the call to. Default implementation delegates to newSessionBeanInstance.

Throws:
NamingException - if thrown by JNDI
InvocationTargetException - if thrown by the create method
See Also:
newSessionBeanInstance()

releaseSessionBeanInstance

protected void releaseSessionBeanInstance(EJBLocalObject ejb)
Release the given EJB instance. Default implementation delegates to removeSessionBeanInstance.

Parameters:
ejb - the EJB instance to release
See Also:
removeSessionBeanInstance(javax.ejb.EJBLocalObject)

newSessionBeanInstance

protected Object newSessionBeanInstance()
                                 throws NamingException,
                                        InvocationTargetException
Return a new instance of the stateless session bean. Can be overridden to change the algorithm.

Throws:
NamingException - if thrown by JNDI
InvocationTargetException - if thrown by the create method
See Also:
AbstractSlsbInvokerInterceptor.create()

removeSessionBeanInstance

protected void removeSessionBeanInstance(EJBLocalObject ejb)
Remove the given EJB instance.

Parameters:
ejb - the EJB instance to remove
See Also:
EJBLocalObject.remove()