001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.ejb.access;
018:
019: import javax.naming.NamingException;
020:
021: import org.springframework.aop.framework.ProxyFactory;
022: import org.springframework.beans.factory.BeanClassLoaderAware;
023: import org.springframework.beans.factory.FactoryBean;
024: import org.springframework.util.ClassUtils;
025:
026: /**
027: * <p>Convenient factory for local Stateless Session Bean (SLSB) proxies.
028: * If you want control over interceptor chaining, use an AOP ProxyFactoryBean
029: * with LocalSlsbInvokerInterceptor rather than rely on this class.
030: *
031: * <p>See {@link org.springframework.jndi.JndiObjectLocator} for info on
032: * how to specify the JNDI location of the target EJB.
033: *
034: * <p>In a bean container, this class is normally best used as a singleton. However,
035: * if that bean container pre-instantiates singletons (as do the XML ApplicationContext
036: * variants) you may have a problem if the bean container is loaded before the EJB
037: * container loads the target EJB. That is because by default the JNDI lookup will be
038: * performed in the init method of this class and cached, but the EJB will not have been
039: * bound at the target location yet. The best solution is to set the lookupHomeOnStartup
040: * property to false, in which case the home will be fetched on first access to the EJB.
041: * (This flag is only true by default for backwards compatibility reasons).</p>
042: *
043: * @author Rod Johnson
044: * @author Colin Sampaleanu
045: * @since 09.05.2003
046: * @see AbstractSlsbInvokerInterceptor#setLookupHomeOnStartup
047: * @see AbstractSlsbInvokerInterceptor#setCacheHome
048: */
049: public class LocalStatelessSessionProxyFactoryBean extends
050: LocalSlsbInvokerInterceptor implements FactoryBean,
051: BeanClassLoaderAware {
052:
053: /** The business interface of the EJB we're proxying */
054: private Class businessInterface;
055:
056: private ClassLoader beanClassLoader = ClassUtils
057: .getDefaultClassLoader();
058:
059: /** EJBLocalObject */
060: private Object proxy;
061:
062: /**
063: * Set the business interface of the EJB we're proxying.
064: * This will normally be a super-interface of the EJB local component interface.
065: * Using a business methods interface is a best practice when implementing EJBs.
066: * @param businessInterface set the business interface of the EJB
067: */
068: public void setBusinessInterface(Class businessInterface) {
069: this .businessInterface = businessInterface;
070: }
071:
072: /**
073: * Return the business interface of the EJB we're proxying.
074: */
075: public Class getBusinessInterface() {
076: return this .businessInterface;
077: }
078:
079: public void setBeanClassLoader(ClassLoader classLoader) {
080: this .beanClassLoader = classLoader;
081: }
082:
083: public void afterPropertiesSet() throws NamingException {
084: super .afterPropertiesSet();
085: if (this .businessInterface == null) {
086: throw new IllegalArgumentException(
087: "businessInterface is required");
088: }
089: this .proxy = new ProxyFactory(this .businessInterface, this )
090: .getProxy(this .beanClassLoader);
091: }
092:
093: public Object getObject() {
094: return this .proxy;
095: }
096:
097: public Class getObjectType() {
098: return this .businessInterface;
099: }
100:
101: public boolean isSingleton() {
102: return true;
103: }
104:
105: }
|